Today I Learned
(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 사용이 가능!
'Today I Learned' 카테고리의 다른 글
(24.06.10)[9주차] 원시타입 Array -> List 변환 (0) | 2024.06.10 |
---|---|
(24.06.07)[8주차] Spring Data의 Paging & Sort 정리 (0) | 2024.06.07 |
(24.06.04)[8주차] Java에서의 LocalDate 포맷으로 파싱 (0) | 2024.06.04 |
(24.06.03)[8주차] PriorityQueue (1) | 2024.06.03 |
(24.05.31)[7주차] Spring Security Filter에서의 Password Encoder (1) | 2024.05.31 |