[BE/spring boot] custom Response DTO 만들기
Today I Learned
: request에 대한 응답, http response를 하기 위해 Response DTO를 생성하고 재사용할 수 있었다.
배경
원래는 ResponseEntity의 body에 값을 넣어주는 형태로 응답을 했다. 그치만 body에서 필요한 데이터만 보내준다는 점이 마음에 들지 않았다.
응답에서 내용만 들어가는게 아니라 status, code, message 등의 정보가 같이 들어갔으면 했고, 또 해당 정보들은 성공했을때, 실패했을때, 등등으로 나뉘어질 수 있었으면 좋겠다고 생각을 해서 ResponseDTO 를 새로 생성, 커스텀하기로 했다.
그치만 난 java 문법에 아직 익숙하지 않았고....... 열심히 사례가 없는지 구글링하며 엄청난 포스팅을 발견했다.
Contents
https://velog.io/@leeeeeyeon/Spring-boot-Response-%ED%98%95%EC%8B%9D-%EB%A7%8C%EB%93%A4%EA%B8%B0
Spring boot Response 형식 만들기
API Response 형식을 만들어보자
velog.io
들어가서 코드를 보면 알겠지만.. 댕쩐다!!! 나도 노력하면 이런 코드를 뚝딱 할 수 있겠지?!
전반적인 코드를 보면 ResponseDTO를 기본으로 생성하고 이를 상속받는 Error, Data Response DTO를 생성해준다.
해당 포스팅 코드가 멋져보였던 이유는 java에서 Exception 이 발생하면 ErrorResponse를 반환하도록 설정되어있다는 점 (java 문외한은 이런것도 멋져보인답니다)
그래서 controller에서 사용할 때, throw Exception 을 하면 ErrorResponse body가 응답에 들어간다!
사실 냅다 다 따라하면 적용은 되겠지만 내꺼가 되지는 못할거라고 생각해서 내 프로젝트에 필요한 단계까지만 반영하려고 노력했다.
나는 throw Exception 까지는 바라지 않고 ResponseDTO와 Error, Data 를 상속받는 부분을 필요하다고 생각하는 것만 적용해봤다.
Practice
//ResponseDTO
@Getter
@RequiredArgsConstructor
@ToString
public class ResponseDTO {
private final String status;
private final Integer code;
private final String message;
public static ResponseDTO of(String status, int code, String message) {
return new ResponseDTO(status,code,message);
}
}
//ErrorResponseDTO
public class ErrorResponseDTO extends ResponseDTO{
public ErrorResponseDTO(Integer code, String message) {
super("failed", code, message);
}
public static ErrorResponseDTO of(Integer code,String message){
return new ErrorResponseDTO(code,message);
}
}
//DataResponseDTO
@Getter
public class DataResponseDTO<T> extends ResponseDTO {
private final T data;
private DataResponseDTO(T data){
super("success",0,"success");
this.data = data;
}
private DataResponseDTO(T data, String message){
super("success",0,message);
this.data=data;
}
public static <T> DataResponseDTO<T> of(T data) {
return new DataResponseDTO<>(data);
}
public static <T> DataResponseDTO<T> of(T data, String message) {
return new DataResponseDTO<>(data, message);
}
public static <T> DataResponseDTO<T> empty() {
return new DataResponseDTO<>(null);
}
}
사실 별게 없어서.. 그냥 ResponseDTO에는 status, code, message 가 기본으로 꼭 들어가있어야하고
ErrorResponseDTO는 이를 상속받아서 status에 'failed' 만 미리 넣어주고 code와 message는 반환할 때 넣을 수 있다.
DataResponseDTO 는 Data만 넣을 수도 있고, message를 추가할 수도 있다. 대신 status는 'success'로 고정이고 code도 0으로 고정이다!
@PostMapping("/ledgers")
public ResponseDTO postLedger(
@RequestBody PostLedgerRequestDTO dto
){
if (dto.getTitle()==null){
return ErrorResponseDTO.of(400,"bad request");
}
ledgerService.saveLedger(dto);
return DataResponseDTO.empty();
}
사용할 때는 ResponseDTO를 반환한다고 명시하고, 원하는 Response를 선택해서 반환하면 된다.
Learned
참고한 포스팅보다 훨씬 간단하고 어찌보면 조잡할 수도 있지만 원하는대로 굴러간다! 이 점에서 나는 성장한 듯 ㅎㅎ
그치만 해당 포스팅의 Exception 처리에 ErrorResponseDTO를 적용한 방법은 꼭 배우고 싶다.
What I Will Study
custom error code 를 어떻게 정의할 지도 고민해봐야겠다. message도!
지금보다 다양한 상황에서 쓸 수 있도록 활용해봐야겠다.
참조
https://velog.io/@leeeeeyeon/Spring-boot-Response-%ED%98%95%EC%8B%9D-%EB%A7%8C%EB%93%A4%EA%B8%B0
Spring boot Response 형식 만들기
API Response 형식을 만들어보자
velog.io