프로젝트에 참고한 책: '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'
1. API를 만들기 위한 3개의 클래스들
API를 만들기 위한 3개의 클래스는 다음과 같다
-Request 데이터를 받을 Dto
-API 요청을 받을 Controller
-트랜잭션,도메인 기능 간의 순서를 보장하는 Service
Spring web Layer의 구성요소: Web Layer, Service Layer, Repository Layer, Dtos, Domain Model
실제로 비즈니스 로직을 처리하는 곳은 Service 클래스가 아니라 Domain이다.
2. 등록/수정/조회 기능 만들기
먼저 web package를 만들고 controller와 dto를 생성한다.
web package |
PostsApiController.class |
web.dto package |
PostsSaveRequestDto.class |
PostsApiController: 해당 api를 통해 requestDto를 받아 service 클래스로 넘긴다.
PostsSaveRequestDto
: 클라이언트에서 request한 정보를 포함하고 있다.
Entity 클래스를 response/request 클래스로 사용하면 안되고, 반드시 dto를 따로 생성해야한다.
이유는 다음과 같다.
-Entity 클래스는 데이터베이스와 맞닿은 핵심 클래스(이걸 기준으로 테이블이 생성되고, 스키마가 변경됨)이기 때문에
쉽게 변경하면 안된다.
-그런데 response/request 클래스는 view와 맞닿은 클래스이므로 수시로 변경될 가능성이 있기 때문에 만약 entity가 dto로 사용된다면 잘못될 가능성이 높다.
따라서 reponse/request dto는 entity class와는 별도로 따로 생성하자.
자세한 코드는 다음 주소에서 확인하면 된다.
https://github.com/heyazoo1007/bookproject/tree/master/src/main/java/com/heyazoo1007/book/web
두번째로 service.posts package를 만들고 service class를 생성한다
services.posts package |
PostsService.class |
자세한 코드는 다음 주소에서 확인할 수 있다.
https://github.com/heyazoo1007/bookproject/blob/master/src/main/java/com/heyazoo1007/book/service/posts/PostsService.java
3. 스프링에서 Bean을 주입하는 방법 3가지
- @Autowired
- setter
- 생성자(constructor)
책에서는 @Autowired 로 주입하는 것보다, 생성자로 주입하는 것을 더 추천한다.
생성자로 Bean 객체를 받도록 하면 @Autowired와 동일한 효과를 볼 수 있다.
final이 선언된 모든 필드를 인자값으로 하는 생성자를 @RequiredArgsConstructor가 생성해준다.
생성자를 직접 안 쓰고 @RequiredArgsConstructor(롬복 어노테이션)을 사용한 이유
: 해당 클래스의 의존성 관계가 변경될 때마다 생성자 코드를 계속해서 수정하는 번거로움을 해결하기 위함이다.
4. PostsApiControllerTest
코드는 다음 주소로 가면 확인할 수 있다.
https://github.com/heyazoo1007/bookproject/tree/master/src/test/java/com/heyazoo1007/book/web
Test 관련 공부한 내용
//given part
-ControllerTest에서는 따로 url을 설정해서 테스트를 수행해야한다.
그러기 위해서는 임의의 port 번호를
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)와
@LocalServerPort \ private int port; 를 이용해서 생성한다.
//when part
-TestRestTemplate 사용
//when 파트를 보면 responseEntity= restTemplate.postForEntity();를 생성한다.
자세한 내용은 다음 페이지를 참고하면 된다.
https://heyazoo1007.tistory.com/212
//then part
-assertThat(responseEntity.getStatusCode()).isEqualTo(HttpsStatus.OK);
-assertThat(responseEntity.getBody()).isGreaterThan(0L);
상태가 200인지 확인하고, Body의 길이가 0 이상인지 확인 한다.