[스프링부트로 API 만들기] ControllerAdvice를 사용하여 예외처리하기

황상일·2021년 1월 3일
0

지금까지 API를 구현을 했다. 이제 어느정도 기능은 전부 작동은 하는 상태이지만, 예외가 발생하면 500번 에러를 반환하는 상태이다. 500번 에러는 서버에 심각한 오류가 발생했음을 알리는 응답이기 때문에 예외별로 적절한 응답을 반환해야 한다.

ControllerAdvice

예외처리를 각 컨트롤러에서 ExceptionHnadler를 구현해도 되지만 도메인별로 발생할 수 있는 예외들을 한곳에 모아서 관리를 하면 훨씬 편하다. 이럴 때 @ControllerAdvice를 사용하면 된다.

@RestControllerAdvice
public class PostExceptionHandler {

    @ExceptionHandler(PostNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ErrorResponse reportError(PostNotFoundException exception) {
        return new ErrorResponse(HttpStatus.NOT_FOUND, "0001", exception.getMessage());
    }
}

위와같이 @ExceptionHandler에 처리하고싶은 예외를 지정한 뒤 @ResponseStatus를 설정한 후, 에러 응답객체에 상태코드와 메시지를 지정해서 반환하면 된다.

Response

@Getter
public class ErrorResponse {

  private final LocalDateTime timestamp;
  private final int status;
  private final String error;
  private final String message;

  public ErrorResponse(HttpStatus httpStatus, String errCode, String message) {
    this.timestamp = LocalDateTime.now();
    this.status = httpStatus.value();
    this.error = errCode;
    this.message = message;
  }
}

에러를 반환할 때는 위와같이 발생시각, httpstatus, 에러코드, 에러메시지를 보내주면 좋다.

현재까지의 패키지 구조

마무리

이제 우리의 코드는 크지 않은 문제가 생겼을때 아주 무서운 500코드를 반환하지 않게 되었다. 다음에는 API구현만큼이나 중요한 테스트에 대해 알아보자.

profile
받은만큼 나눠주자

0개의 댓글