본문 바로가기
Web/스프링 부트와 aws로 구현하는 웹서비스

6. 게시판 등록 api 만들어 보기

by 장인이 2021. 7. 16.

해당 게시물들은 이동욱 저자님의 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스"를 공부하며 기록한 것입니다.

 

 이번 게시물은 게시물 등록, 수정, 조회를 위한 api를 만들도록 할 것 이다. api를 만들기 위해서는

 

1. Request 데이터를 받을 Dto

2. API 요청을 받을 Controller

3. 트랜잭션, 도메인 기능간의 순서를 보장하는 Service

 

 왜 도메인 모델을 다루는지에 대한 설명은 책에 이루어져 있다. 우선 web 패키지에  PostsApiController, web.dto 패키지에 PostsSaveRequestDto, service.posts 패키지 생성 후 PostsService를 생성하고 작성한다.

 

 

<PostsApiController>

 

<PostsService>

 

<PostsSaveRequestDto>

 

 책에서도 언급되어있으나 Entity클래스와 거의 유사함에도 불구하고 Dto클래스를 추가로 생성하였다. 여기서 Entity 클래스를 Request, Response클래스로 사용하면 안된다고 강조한다. Entity 클래스는 데이터베이스와 맞닿은 핵심 클래스이므로, 이를 기준으로 테이블이 생성, 스키마가 변경된다.

 

 따라서 화면 변경과 같은 사소한 기능을 위해 Entity를 변경하는 것은 너무 큰 변화이다. 또한, 실제로 Controller에서 여러 테이블을 조인해서 결과를 알려주어야 하는 경우가 많으므로, 꼭 분리해서 사용해야 한다.

 

 

 위 3개의 코드를 통해 등록 기능의 코드가 완성되었으며, test의 web패키지에 PostsApiControllerTest, 테스트코드를 생성해서 확인해 본다.

 

 

 

 지난번 HelloControllerTest에서는 @WebMvcTest를 사용하였는데, 게시물 등록 api에서는 JPA를 사용하므로 이를 사용하지 못한다. 이런 경우에는 @SpringBootTest와 TestRestTemplete을 사용하면 된다. 렌덤 포트로 서버를 연 후, table insert를 하고 정상적으로 db에 저장되었는지 확인하는 형식이다.

 


+ 여기서 TestRestTemplete과 ResponseEntity가 무슨 일을 하는지 정확히 설명이 나와있지 않아, 따로 찾아보았다.

 

1) TestRestTemplete

 TestRestTemplete은 이름 그대로 RestTemplete(HTTP서버와의 통신을 단순화, Restful 지킴)의 테스트를 위한 버전이다. 기존에 HelloControllerTest에서 MockMvc를 사용했는데, 이와는 차이점이 있다. MockMvc는 Servlet Container를 생성하지 않는 반면, @SpringBootTest와 TestRestTemplate은 Servlet Container를 사용한다.

 

 (Servlet Container는 동적인 웹사이트를 만들 수 있게 해주며, Client의 Request를 받고 Response할 수 있게 웹서버와 소켓을 만들어 통신한다. 하는 역할은 다양하고, 웹 서버 작동시 도와주는 도구라고 생각하면 될 것 같다.)

 

 따라서 TestRestTemplate을 사용하면 실제 서버가 동작하는 것처럼(예외는 있으나) 테스트를 수행할 수 있다. 즉, MockMvc는 서버 입장에서 로직이 문제없는지 테스트를 한다면, TestRestTemplate은 클라이언트의 입장에서 테스트하는 것이다.

 

 

2) ResponseEntity

 ResponseEntity는 HttpEntity 클래스를 상속받는 클래스이다. 먼저 HttpEntity 클래스는 HTTP Request와 Response에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다. 이를 상속받은 클래스RequestEntity, ResponseEntity 클래스이다. 

 

 다양한 상황에서 사용되지만, 우선 위의 코드에서는 Response할 url과 내용을 담을 dto를 보내는 역할을 하는 것 같다.


 

등록을 위한 api를 작성해보았는데, 이를 지난 게시물에서 설명한 Spring 웹 계층을 생각해서 정리하면 다음과 같다.

 

1) 우선 /api/v1/posts를 받으면, POST방식으로 Posts table에 게시물을 저장해야 함

 

2) controller, 즉 Web Layer의 PostsApiController에서 바로 Repository Layer에 접근하지 않고, 중간의 Service Layer를 통해 접근한다.

 

3) Service Layer의 PostService.java에서 Dto정보를 통해 직접 Repository(DAO)에 받은 데이터를 저장함

 

4) 이때 PostsApiController에서 PostsService, PostsService에서 PostsRepository(DAO)간의 데이터를 교환하기 위해 PostsSaveRequestDto를 사용함

 


- 학습 내용 저장할 github

https://github.com/imgzon3/imgzon3-springboot-test

 

imgzon3/imgzon3-springboot-test

Contribute to imgzon3/imgzon3-springboot-test development by creating an account on GitHub.

github.com

 

'Web > 스프링 부트와 aws로 구현하는 웹서비스' 카테고리의 다른 글

8. 수정, 조회 api  (0) 2021.07.19
7. 스프링부트, Gradle, Junit 업데이트 하기  (0) 2021.07.19
5. Spring 웹 계층 정리  (0) 2021.07.16
4. JPA 사용해보기  (0) 2021.07.14
3. 롬복  (0) 2021.07.14

댓글