본 시리즈는 메타 코딩님의 Junit 강의를 학습한 내용을 바탕으로 정리하였습니다.
저번 포스팅을 끝으로 Controller단의 책 등록 구현이 끝났다. 이제 Controller의 책 목록보기를 구현해보자.
BookApiController.java
@RequiredArgsConstructor
@RestController
public class BookApiController {
private final BookService bookService;
// 1. 책등록
// (..생략)
// 2. 책목록보기
@GetMapping("/api/v1/book")
public ResponseEntity<?> getBookList() {
List<BookRespDto> bookList = bookService.책목록보기();
return new ResponseEntity<>(CMRespDto.builder().code(1).msg("글 목록 가져오기 성공").body(bookList).build(),
HttpStatus.OK); // 200 = ok;
}
참 간단하다.
책 목록보기 메서드가 리턴하고 있는 List 형태로 ResponseEntity
에 담아 새롭게(new) 리턴해주면 된다. 또한 상태코드는 Created와 다르게 단순 조회이기 때문에 200 OK로 해준다.
그런데 사실 List 형태로 리턴해주는 것은 그다지 좋은 방법은 아니다. 우리가 책 목록보기의 리턴을 List로 해준다고 가정하면 ResponseDto
에 의해 리턴받는 형태가 다음과 같을 것이다.
"code": 1,
"msg": "성공",
"body": [
"id": 1,
"title": "스프링1강",
"author": "junit"
]
그런데 책 등록하기와 같은 다른 메소드들은 다음의 방식이다.
"code": 1,
"msg": "성공",
"body": {
"id": 1,
"title": "스프링1강",
"author": "junit"
}
차이를 거의 모르겠지만 엄연한 차이가 있다. body 메세지를 살펴보자.
위는 Collection( [ ]
), 아래는 Object( { }
) 형태이다.
사실 큰 문제는 없어보이지만 프론트쪽에서 응답 메세지를 이렇게 다른 방식으로 받아본다고 생각해보자. 파싱하는 작업이 여간 까다로운일이 아닐 수 없다.
Object 형태로 통일하게 된다면 서로에게 참 좋을 것 같다.
먼저, dto와 관련된 response 폴더에 BookListRespDto.java
를 생성한다.
BookListRespDto.java
@Getter
public class BookListRespDto {
List<BookRespDto> bookList;
@Builder
public BookListRespDto(List<BookRespDto> bookList) {
this.bookList = bookList;
}
}
List 타입은 여기서만 사용할 것이다. BookRespDto 를 리스트로 감싼 형태이다. BookRespDto에서는 id
, title
, author
를 리턴해줄 것이다.
이제, bookService
class의 책 목록보기 메서드가 직접 List를 리턴하는 것이 아니라 우리가 생성한 BookListRespDto
를 통해 List를 리턴하도록 수정하자.
bookService.java
// 2. 책 목록보기
public BookListRespDto 책목록보기() {
// 코드 수정
List<BookRespDto> dtos = bookRepository.findAll().stream()
// .map((bookPS) -> new BookRespDto().toDto(bookPS))
.map(Book::toDto)
.collect(Collectors.toList());
// print
dtos.stream().forEach((dto) -> {
System.out.println(dto.getId());
System.out.println(dto.getTitle());
System.out.println("================= 서비스 레이어");
});
BookListRespDto bookListRespDto = BookListRespDto.builder().bookList(dtos).build();
return bookListRespDto;
}
이제 애플리케이션을 실행하고 localhost를 통해 책의 내용을 살펴보면 다음과 같다. body에 object 형태 ({ }
) 로 bookList가 담기고, bookList가 리스트를 가져오고 있다.
이제 postman을 통해 요청 메세지를 보내보자.
{
"title":"스프링1강",
"author":"junit"
}
{
"title":"스프링2강",
"author":"메타코딩"
}
localhost 를 통해 저장된 글 목록을 살펴보면 저장이 잘 된 것을 볼 수 있다.