개발머해니

[스프링] 클라이언트가 에러났을때도 ResponseDTO를 내려달라고 하면 어떻게 해야할까? 본문

백엔드

[스프링] 클라이언트가 에러났을때도 ResponseDTO를 내려달라고 하면 어떻게 해야할까?

왕행님 2023. 8. 30. 02:52
728x90
반응형

클라이언트가 에러났을때도 ResponseDTO를 내려달라고 하면 어떻게 해야할까?

정답은 간단합니다. API 요청에 성공해서 응답을 보내거나, 예외처리를 보낼 때 공통으로 사용할 ResponseDto를 구현해서 값을 내려주면 됩니다. 
 
자세한 내용은 아래 블로그에서 확인 가능합니다!

[Spring] API 요청 성공, 예외처리에서 공통으로 사용하는 ResponseDto 구현

프론트와 협업할 때 어떤 request를 받을 것이며, 어떤 response를 보낼 것인지 협의하는 것이 중요하다. response 형식을 어떻게 할지 정하기 나름이겠지만, 이번에는 API 요청에 성공해서 응답을 보내

velog.io

 
중요한 핵심 내용만 참조해 보자면, 아래와 같이 정상응답이건 에러응답이건 모든 요청에 공통으로 보낼 형식을 만들어 줍니다.

@Getter
public class ApiResponseDto<T> {

    private boolean success;
    private T response;
    private ErrorResponse error;

    @Builder
    private ApiResponseDto(boolean success, T response, ErrorResponse error) {
        this.success = success;
        this.response = response;
        this.error = error;
    }

}

 
그리고 요청 결과에 따라 알맞는 데이터를 넣어 ApiResponseDto를 생성할 static method를 만들어, 아래와 같이 사용할 수 있습니다.

① 정상 : TRUE + Response 조립
② 에러 : FALSE + Error Response 조립
③ 에러지만 정상데이터 요청 : FALSE + Response + Error Response 조립

 

public class ResponseUtils {

    // 요청 성공인 경우
    public static <T> ApiResponseDto<T> ok(T response) {
        return ApiResponseDto.<T>builder()
                .success(true)
                .response(response)
                .build();
    }

    // 에러 발생한 경우
    public static <T> ApiResponseDto<T> error(ErrorResponse response) {
        return ApiResponseDto.<T>builder()
                .success(false)
                .error(response)
                .build();
    }

    // 요청 실패이지만 데이터를 내려줘야 할 경우
    public static <T> ApiResponseDto<T> error(T response, ErrorResponse errorResponse) {
        return ApiResponseDto.<T>builder()
                .success(false)
                .response(response)
                .error(errorResponse)
                .build();
    }

}

 

ResponseEntity 대신 ApiResponseDto를 사용하는 이유는?


HttpStatus, HttpHeaders, HttpBody 데이터를 갖는 ResponseEntity 클래스를 활용할 수 있습니다.
다양한 생성자가 있기 때문에 응답 데이터가 없는 케이스, Http Header를 반환하지 않는 케이스 등 상황에 맞는 생성자를 선택해 사용할 수 있습니다.
하지만 예외가 발생하는 경우 응답 body로 plain/text가 전달됩니다.
즉 예외가 발생했을 때, 성공했을 때 응답의 모양이 달라지기 때문에 경우에 따라 응답 데이터의 형식이 달라지는 경우 상황에 따라 가변적으로 사용하기 어렵니다.

그래서 성공했을 때 형식과 실패했을 때 응답형식을 항상 json으로 통일시키기 위해 ApiResponseDto를 사용한 것입니다.

https://velog.io/@qotndus43/스프링-API-공통-응답-포맷-개발하기

스프링 API 공통 응답 포맷 개발하기

클라이언트 ↔︎ 서버 구조에서클라이언트는 서버에 요청을 보내고 서버는 요청에 대한 결과를 응답합니다.예를 들어 클라이언트가 1번 상품을 요청하는 경우 서버는 1번 상품을 조회해 응답하

velog.io

728x90
반응형