프로젝트에 참고한 책: '스프링 부트와 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 이상인지 확인 한다. 

 

 

+ Recent posts