본문 바로가기

TIL

2023.01.13 스프링이 제공하는 다양한 예외처리

  • Java에서는 예외 처리를 위해 try-catch를 사용해야 하지만 try-catch를 모든 코드에 붙이는 것은 비효율적이다.
  • Spring은 에러 처리라는 공통 관심사(cross-cutting concerns)를 메인 로직으로부터 분리하는 다양한 예외 처리 방식을 고안하였고, 예외 처리 전략을 추상화한 HandlerExceptionResolver 인터페이스를 만들었다. (전략 패턴이 사용된 것이다.)

대부분의 HandlerExceptionResolver는 발생한 Exception을 catch하고 HTTP 상태나 응답 메세지 등을 설정한다. 그래서 WAS 입장에서는 해당 요청이 정상적인 응답인 것으로 인식되며, 위에서 설명한 복잡한 WAS의 에러 전달이 진행되지 않는다.

public interface HandlerExceptionResolver {
    ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex);
}
  • 위의 Object 타입인 handler는 예외가 발생한 컨트롤러 객체이다.
  • 예외가 던져지면 디스패처 서블릿까지 전달되는데, 적합한 예외 처리를 위해 HandlerExceptionResolver 구현체들을 빈으로 등록해서 관리한다. 그리고 적용 가능한 구현체를 찾아 예외 처리를 하는데, 우선순위대로 아래의 4가지 구현체들이 빈으로 등록되어 있다.
    • DefaultErrorAttributes: 에러 속성을 저장하며 직접 예외를 처리하지는 않는다.
    • ExceptionHandlerExceptionResolver: 에러 응답을 위한 Controller나 ControllerAdvice에 있는 ExceptionHandler를 처리함
    • ResponseStatusExceptionResolver: Http 상태 코드를 지정하는 @ResponseStatus 또는 ResponseStatusException를 처리함
    • DefaultHandlerExceptionResolver: 스프링 내부의 기본 예외들을 처리한다.
  • DefaultErrorAttributes는 직접 예외를 처리하지 않고 속성만 관리하므로 성격이 다르다.
  • 그래서 내부적으로 DefaultErrorAttributes를 제외하고 직접 예외를 처리하는 3가지 ExceptionResolver들을 HandlerExceptionResolverComposite로 모아서 관리한다.
  • 즉, 컴포지트 패턴을 적용해 실제 예외 처리기들을 따로 관리하는 것이다.

 

Spring은 아래와 같은 도구들로 ExceptionResolver를 동작시켜 에러를 처리할 수 있는데, 각각의 방식 대해 자세히 살펴보도록 하자.

  1. @ResponseStatus
  2. @ResponseStatusException
  3. @ExceptionHandler
  4. @ControllerAdvice, @RestControllerAdvice

'TIL' 카테고리의 다른 글

2023.01.16 Shopping mall 프로젝트  (0) 2023.01.16
[WIL] 2023.01.09~2023.01.13  (0) 2023.01.16
2023.01.12 스프링의 기본적인 예외 처리 방법  (0) 2023.01.12
2023.01.11 예외의 종류  (0) 2023.01.12
2023.01.10 개념적 모델링  (0) 2023.01.11