SpringMVC - 15. @ExceptionHandler
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 자체를 대상으로도 설정 가능
- 직접 컨트롤러를 지정도 가능
- 만약 대상을 지정하지 않으면 모든 컨트롤러에 적용
- 이 애노테이션을 활용하여 예외 처리 로직을 별도로 분리하여 관리 가능
댓글남기기