yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

[BE/spring boot] custom Response DTO 만들기 본문

개발/프로젝트

[BE/spring boot] custom Response DTO 만들기

yehey 2023. 12. 15. 17:12

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

 

Comments