Controller - 책 목록보기

jihan kong·2022년 10월 4일
0

JUnit5

목록 보기
23/25
post-thumbnail

본 시리즈는 메타 코딩님의 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 형태로 통일하게 된다면 서로에게 참 좋을 것 같다.


List를 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 를 통해 저장된 글 목록을 살펴보면 저장이 잘 된 것을 볼 수 있다.

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글