API 오류 처리

HTML 화면 오류 vs API 오류

  • HTML의 경우
    • 단순히 400번대, 500번대 에러 페이지를 클라이언트에게 보여주기만 하면 됨
    • 상대적으로 처리하기 편하고, Spring이 제공하는 BasicErrorController이 담당해줌
  • API의 경우
    • 각 시스템마다 응답의 모양, 스펙이 모두 다름
    • 예외 상황이 단순 화면 출력이 아닌 데이터를 출력해야 할 수도 있음
    • 어떤 컨트롤러에서 발생한 예외인가에 따라 다른 응답을 보내야 할 수도 있음
    • 위의 문제를 해결하기 위해 @ExceptionHandler를 활용

@ExceptionHandler

@RestController
public class ApiExceptionV2Controller {

    @ResponseStatus(HttpStatus.BAD_REQUEST) // 200이 아닌 다른 상태 코드로 반환
    @ExceptionHandler(IllegalArgumentException.class) // () 안의 에러가 발생하면 이 핸들러가 대신 처리해줌
    public ErrorResult illegalExHandler(IllegalArgumentException e) {
        log.error("[exceptionHandler] ex", e);
        return new ErrorResult("BAD", e.getMessage());
    }
}    
  • @ExceptionHandler가 구현돼있는 컨트롤러 내에서 해당 예외가 발생하면 대신 처리해줌
    • 다른 컨트롤러에는 영향을 주지 않음 (@ControllerAdvice 활용하여 처리 가능)
    • ExceptionHandlerExceptionResolver가 호출함
      • ExceptionResolver 중 가장 우선 순위가 높음
    • 지정한 예외 또는 그 예외의 자식 클래스까지 잡을 수 있음
    • 예외를 생략할 수 있음 => 메소드 파라미터의 예외로 지정됨
  • 이 때, Controller는 RestController이므로 반환이 JSON 형식으로 그대로 반환됨
  • 이 애노테이션이 에러를 처리해버리면 기본적으로 정상 로직으로 처리가 되므로 상태 코드 200이 반환됨
    • 정상 반환을 하므로 서블릿 컨테이너까지 에러가 올라가지 않음
    • @ResponseStatus를 추가하여 원하는 상태 코드를 반환할 수 있음

@ControllerAdvice (@RestControllerAdvice)

  • 대상으로 지정한 컨트롤러에서 발생하는 에러를 처리 가능하게 해줌
    • annotations : 해당 애노테이션이 붙어있는 컨트롤러에 적용
    • package 자체를 대상으로도 설정 가능
    • 직접 컨트롤러를 지정도 가능
    • 만약 대상을 지정하지 않으면 모든 컨트롤러에 적용
  • 이 애노테이션을 활용하여 예외 처리 로직을 별도로 분리하여 관리 가능



인프런 - 김영한님의 Spring MVC 강의를 정리한 내용입니다.


김영한님 인프런 강의

댓글남기기