본문 바로가기
Team Project/이화동네

191230~200112 2분기 공부노트 4, 5chapter

by RunTheWorld 2020. 1. 12.

Spring: 자바 오픈소스 프레임워크

Spring Boot: spring개발시 필요한 라이브러리가 내장되어 있고 간편하게 annotation으로 설정가능한 프레임워크, 톰캣 내장됨

 

Spring Boot 프로젝트 생성 방법 2가지 

 

1. spring site -> projects -> spring -> spring initiallizer 
-> option -> generate -> 다운 받은 파일 오픈 

intellij community version(무료)시에 이용 

2. file -> spring initiallizer -> option -> finish

intellij ulimate version(유료)시에 이용

 

파일 구성

Main

java 파일 -> root applicatio 

resource 파일 -> static file, front sources 

Test 

main과 형식 비슷 

gitignore 

git으로 관리하지 않는 파일 주로 개인 정보 id에 대한 설정 등등 

 

서버 실행 방법 2가지 

1. Terminal 

gradlew bootRun 입력 

2. GUI

코드 옆이나 상단의 세모버튼 클릭 

 

HTTP Method

사용자로부터 접속을 받아주기 위해 주소를 설정해줘야함 이러한 주소들의 묶음을 모아둔게 controller.

 

@RestController: Controller 로 활용할거라고 알려주는 지시자

@RequestMapping("/api"): 이곳으로 들어올 api주소를 매핑하기 위해 RequestMapping

-> 괄호안에 어떤 주소로 받을건지 path명시 (localhost:8080/api)

 

method = RequestMethod.GET   //method는 어떠한 타입으로 받을건지(여기선 GET타입)

path = "/getMethod"   //어떠한 주소로 받아들이겠다 (localhost:8080/api/getMethod -> 이주소로 호출하면 사용자의 요청이 이 method로 들어옴)

 

코드에 검증하는 방법은 여러가지 -jUnit 혹은 웹브라우저로 직접 확인 혹은 restClient 툴 사용 (여기서는 웹브라우저로 직접확인)

 

@GetMapping("/getParameter")  //get에 대해처리, 메소드 지정안하고 path만 지정해주면 됨 (localhost:8080?api/getParameter?id=1234&password=abcd)

 

RequestParam 으로 인자 받아올 수 있음 (@RequestParam String id)  

->getParameter의 id를 매칭해서 해당값을 받아옴

 

@RequestParam(name = “password”) String pwd  //RequestParameter는 password라는 이름으로 들어올거야 근데 method안에서는 pwd라는 변수로 쓰임 (password라는 지역변수가 따로 있는 경우 RequestParam을 password로 쓰면 구분이 안됨, RequestParam을 pwd로 바꾸면 request에서 password를 매칭 할 수 없음 이럴때 name을 따로 둠!)

 

RequestParam의 개수가 많이 늘어나면 매개변수가 너무 많아짐

ex)localhost:8080/api/getMultiParameter?account=abcd&email=study@gmail.com&page=10&등등..

 

이렇게 매개변수가 많아진다고 우리가 다 적어놓을 수 없음->  이런 경우 객체(SearchParam)로 받아버린다

 

{"account":"abcd","email":"study@gmail.com","page":10} //JSON 형태

객체를 리턴한다는것은 JSON형태로 바꿔서 리턴하는것

Jackson 이란? Java Object를 JSON으로 변환하거나 JSON을 Java Object로 변환하는데 사용할 수 있는 Java 라이브러리입니다.

 

여러 메서드가 중복된 path를 가지면 실행이 안됨

여러 클래스가 중복된 path를 가져도 괜찮음

 

@RequestMapping(method = RequestMethod.POST, path = "/postMethod")

@PostMapping("/postMethod")

->서로 같은 기능



post란 http통신할 때 post의 body에 data를 넣고 보내겠다는 것

  -->@RequestBody  // body에서 매칭되는 값 달라는 것

 

Test 파일 작성 방식 2가지 

1. main 코드에서 test하고 싶은 기능에서 단축키 Ctrl+shift+t 누르면 

Test 폴더에 파일 생성해줌 (이때, 설정 사항은 junit5이용 b/c junit5부터 class 접근자에 대해 default package가 설정됨

즉, public 이런 거 안 적어줘도 작동)

@Test로 test 함수 생성 

안에서 main에 만든 객체 생성 후 main에 있는 함수 호출해서 assertThat에서 isEqualTo함수 통해 결과값 같은지 확인 

assertThat은 alt+enter -> import static method

즉, http 호출없이 method 직접 호출하는 방식 mapping이 post, get 잘못되어있어도 test는 통과한다. 

비추천 

 

2. MockMvcTest

1의 단점을 방지하기 위해서는 모의 http request와 response를 만들어서 test를 진행해야함 

Test 파일에 MockMvc 객체 생성

@Test로 Test할 함수 위에 annotation 달아줌 

 ex)

        mockMvc.perform(
                MockMvcRequestBuilders.get("/api/helloWorld") //http method를 get으로 호출 

.andDo(MockMvcResultHandlers.print()) // 자세히 출력  
.andExpect(MockMvcResultMatchers.status().isOk()) //status가 200인지 예측 
.andExpect(MockMvcResultMatchers.content().string("helloWorld")); // response의 내용이 (body가) helloWorld인지
        )

 

JPA 의존성 추가
기존의 데이터 쿼리를 통해 처리하던 것을 자바로 하도록 맵핑한 라이브러리

즉, 어느 db를 사용하든 상관없음 (oracle, mysql, mongobd , whatever)
h2 DB의존성 추가
Entity 생성 및 테스트

h2: 초저량 db

 

Domain Package 생성 
Entity로 사용하는 class(값을 담고 있는 객체) -> 실제 저장하고 불러올 수 있는 repository를 만들자
@id @GenerateValue : 자동으로 생성
primary key로 사용할 id
toString함수 오버라이딩(자바의 Object class의 toString) -> 각 객체의 필드값을 string으로 반환 
-> 데이터 추가할 때마다 변경해야함 -> lombok이용해서 자동화 @ToString
-> if, 데이터가 개인정보라 log에 남으면 안되면 exclude="phonenumber" 속성으로 제거 
-> 해당 데이터 위에 @ToString.Exclude 로 설정해줘도 동일
getter&setter로 데이터 입력 저장

jpa respository상속받은 interface는 기본적으로 create, delete, update method생성
-> Entity를 Handling하기 위한  ctrl+shift+t -> Test 파일 생성 (값 저장하고 db에 넣고 조회함)

 

 

Lombok의 annotation
@Getter, @Setter, @ToString
(플젝 생성시에 lombok의존성 추가해야함)

에러나면 

1. Lombok Plugin install&restart 했는지도 확인
2. setting-> Build, Execution, Deployment -> Compiler 
-> Enable annotation processing

@Constructor
변수가 있는 생성자 생성시 기본 생성자를 만들어 줘야함 -> NoArgsConstructor
모든 변수가 있는 생성자 -> @AllArgsConstructor
id는 자동생성되므로(GeneratedValue) 생성자에서 빼줘야함 
데이터 위해 @NonNull로 하면 무조건 있어야함 
@EqualsAndHashCode
HashCode = 같은 객체 
Equals = 같은 값
    public boolean equals(Object object){
        if(object == null){
            return false;
        }
        Person person = (Person) object;
        if(!person.getName().equals(this.getName())){
            return false;
        }
        if(person.getAge() != this.getAge()){
            return false;
        }
        return true;

    }
hashCode가 다르면 getter, setter 등의 객체내 함수를 불러올 수 없음
-> 같은 해시코드를 같도록 overriding해야함 
-> 이를 자동화하기 위해 Lombok사용

-> @EqualsAndHushCode

@Data
-Getter, Setter
- RequiredArgsConstructor
- ToString
- EqualsAndHushCode
5가지 anotation 제공


 

 

댓글