본문 바로가기
Today I Learned 2024. 6. 5.

(24.06.05)[8주차] Response용 DTO 활용

팀 과제를 진행하기 전 필수적으로 알아야 하고, 협의된 내용에 관하여 좋은 디자인이라고 생각


 

 

JSON 타입으로 상태코드, 메시지, 여러 타입의 데이터를 Client에게 응답

이슈

return ResponseEntity.status(HttpStatus.OK).body(responseDto);
{
message : "게시물 조회가 완료되었습니다!",
statusCode : 200,
data : {
       login_id : “qlenf1234”,
       username : “김비둘”,
       email : “ggumi@gamil.com”,
       user_Info : “비둘깁니다.”
   }
}
  • Java Spring 환경에서 ResponseEntity를 통해서 특정 Dto를 Body로 했을 때, body 부분에 Dto가 String 타입 뿐만이 아니라, List 또는 다른 타입의 데이터가 있을 때 마다, responseDto를 새롭게 만들어야하는 문제

원인

  • responseDto의 타입은 무조건 String 또는 원시 타입일 것이라는 생각을 했으나, 어떤 타입이 와도 가능하다는 것
    • 따라서, Generics 사용 가능

해결

 반환타입이 어느것이든 Client에 응답해줄 수 있는 ResponseDto

@Getter
@Setter
public class ResponseDto<T> {

    private Integer statusCode;
    private String message;
    private T data;

    public BaseResDto(Integer statusCode, String message, T data) {
        this.statusCode = statusCode;
        this.message = message;
        this.data = data;
    }
}
  • ResponseDto<T> 처럼 해당 클래스는 받는 타입의 데이터를 필드값으로 설정하여 객체를 생성을 할 수 있게 바꿀 수 있다는것
    • T를 따로 가져와서 private T data; 처럼 지정을 할 수 있음
  • 따라서 data 타입이 List<> 일 때에도 가능한 것

EXAMPLE

 public ResponseDto<List<FeedResDto>> getAllFeeds() {

        List<FeedResDto> feedList = feedRepository.findAllByOrderByCreatedAtDesc().stream()
                .map(feed -> new FeedResDto(feed))
                .collect(Collectors.toList());

        String message = feedList.isEmpty() ? "게시물 조회가 완료되었습니다!" : "먼저 작성하여 소식을 알려보세요!";

        return new ResponseDto<>(HttpStatus.OK.value(), message, feedList);
    }

 

  • ResponseDto의 T 부분을 List<FeedResDto> 즉, FeedResDto 정보의 List가 될 것이고 data 부분에 이 리스트를 지정이 가능
    • 매우 중요
ResponseDto<List<FeedResDto>> response = feedService.getAllFeeds();
return ResponseEntity.status(HttpStatus.OK).body(response);
  • 따라서, 마지막으로 ResponseEntity의 body 부분에 ResponseDto를 지정을 해서 Client에게 Response 를 하게 된다면, 위 처음 요구사항과 유사하게 어떤 타입이든 JSON 타입으로 응답해줄 수 있게됨

정리

  • DTO로 이뤄진 List 등 여러 타입의 데이터를 ResponseDto 안에 T 타입으로 지정할 수 있듯이, DTO를 ResponseDto를 한번 더 거쳐서 Response 가능!
  • DTO 역시 특이한 유틸 클래스가 아니라, 사용용도가 다른 클래스의 일종이기 때문에 Generics 사용이 가능!