예외 처리
BasicErrorController
개발한 Controller에서 발생한 예외를 따로 처리해주지 않는다면 아래 그림처럼 WAS로 에러가 흘러가게 되고, 이를 감지한 WAS는 Basic Error Controller로 요청을 보내 처리하게 된다.
에러가 처리되지 않고 WAS가 에러를 전달받게 되면, status는 항상 500이 된다.
별도의 에러 처리 전략을 통해 상황에 맞는 에러 응답을 제공해야 세밀한 제어 요구 사항을 반영할 수 있다.

HandlerExceptionResolver
예외 처리 전략을 추상화한 인터페이스
Spring에서 고안한 “에러 처리”라는 공통 관심사(cross-cutting concerns)를 메인 로직으로부터 분리하는 예외 처리 방식이다.
발생한 Exception을 catch하고 HTTP 상태나 응답 메세지 등을 설정해 WAS에 에러가 전달되지 않도록 한다.
인터페이스 구조
Object handler는 예외가 발생한 컨트롤러 객체이다.4가지의 구현체가 Bean 으로 등록되어 있다.
DefaultErrorAttributes: 에러 속성을 저장하며 직접 예외를 처리하지는 않는다.ExceptionHandlerExceptionResolver: 에러 응답을 위한 Controller나 ControllerAdvice에 있는 ExceptionHandler를 처리함ResponseStatusExceptionResolver: Http 상태 코드를 지정하는 @ResponseStatus 또는 ResponseStatusException를 처리함DefaultHandlerExceptionResolver: 스프링 내부의 기본 예외들을 처리한다.ExceptionResolver들은 HandlerExceptionResolverComposite로 모아서 관리하게 된다.
@ExceptionHandler
컨트롤러의 메소드에 @ExceptionHandler를 추가하거나, 클래스에 @ControllerAdvice나 @RestControllerAdvice를 어노테이션을 달면 적용된다.
@ExceptionHandler에 의해 발생한 예외는 ExceptionHandlerExceptionResolver에 의해 처리된다.
@ControllerAdvice / @RestControllerAdvice
여러 컨트롤러에 대해 전역적으로 ExceptionHandler를 적용하는 방식이다.
하나의 클래스로 모든 컨트롤러에 대해 전역적으로 예외 처리가 가능하다.
직접 정의한 에러 응답을 일관성있게 클라이언트에게 내려줄 수 있다.
별도의 try-catch문이 없어 코드의 가독성이 높아진다.
Filter에서 발생한 예외 처리
에러 처리 전용 필터를 두어 모든 필터를 거치는 doFilter 메서드에서 발생한 예외를 처리할 수 있다.
Last updated