Software Engineering/[BE] Spring Boot (Java)

[Spring Boot] 일관적인 API 응답 RestResult, RestError

devhrkim 2024. 6. 26. 21:28

목차

  • 개요
  • HttpStatus 간략 설명
  • RestResult, RestError 코드
  • 컨트롤러 구현

개요

Spring Boot에서 클라이언트에게 어떻게 일관적인 응답을 줄 것인가?

Spring Boot로 개발을 했던 사람이라면 INTERNAL_SERVER_ERROR 라는 에러를 만나봤을 것이다.

BAD_REQUSET 인 경우에도 개발자가 예외처리를 하지 않으면 INTERNAL_SERVER_ERROR 로 나오기도 한다.

HttpStatus 간략 설명

HttpStatus 코드는 성공과 실패 케이스로 나뉜다.

자주 볼 수 있는 실패 케이스는 다음과 같다.

HttpStatus Code 설명
OK 200 성공
BAD_REQUEST 400 클라이언트가 요청 인자를 잘못 보냈을 때
UNAUTHORIZED 401 인증 실패
FORBIDDEN 403 인가 실패
NOT_FOUND 404 데이터 없음
METHOD_NOT_ALLOWED 405 잘못된 HTTP 메소드 사용.
INTERNAL_SERVER_ERROR 500 서버 에러

 

특별히 예외 처리를 해주지 않는다면 400번대 에러도 INTERNAL_SERVER_ERROR로 나온다.

RestResult, RestError 코드

클라이언트에게 상황에 맞는 일관적인 응답을 주기 위해서 내 애플리케이션에는 클라이언트에게 응답을 주는 성공 케이스인 RestResult 클래스와 실패 케이스인 RestError 클래스를 추가해줬다.

@Getter
@NoArgsConstructor
public class RestResult {
    private Object data;
    public RestResult(Object data) {
        this.data = data;
    }
}

HttpStatus가 성공 케이스(200)인 경우 data를 전달한다.

 

JSON 응답 예시

{
    "data": {
        "userId": "hyerin9",
        "refreshToken": "refresh token value"
    }
}

 

 

@Getter
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RestError {
    private HttpStatus code;
    private String message;
    public RestError(HttpStatus code, String message) {
        this.code = code;
        this.message = message;
    }
}

HttpStatus가 실패 케이스(400, 401, 403, 404, 405, 500, …)인 경우 해당 에러 Code와 Message를 전달한다.

 

JSON 응답 예시

{
    "code": "BAD_REQUEST",
    "message": "Invalid format."
}

 

컨트롤러 구현

@RestController
@RequestMapping("/refresh-tokens")
@RequiredArgsConstructor
@Validated
public class CacheRefreshTokenController {
    private final CacheRefreshTokenService cacheRefreshTokenService;

    @GetMapping
    public RestResult getAll() {
        return new RestResult(cacheRefreshTokenService.getAll());
    }
}

 

데이터의 반환 타입을 RestResult로 설정해줬다. 그러면 성공 케이스에서는 RestResult 포맷으로 클라이언트에게 응답을 하게 된다.

 

실패 케이스 구현은 다음 글을 참고하길 바란다.

(곧 작성 예정)