jingyulog

HandlerExceptionResolver 본문

Tech/스프링

HandlerExceptionResolver

jingyulog 2023. 2. 15. 17:52
  • 스프링 MVC 는 핸들러 밖으로 예외가 던져진 경우, 예외를 해결하고 동작을 새로 정의할 수 있는 방법을 제공한다.
  • 컨트롤러 밖으로 던져진 예외를 해결하고, 동작 방식을 변경하고 싶을 때 사용한다. 줄여서 ExceptionResolver 라고 한다.
public interface HandlerExceptionResolver {

   @Nullable
   ModelAndView resolveException(
         HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);

}

반환 값에 따른 동작 방식

  • 빈 ModelAndView
    • new ModelAndView()
    • View를 rendering 하지 않고, 정상 흐름으로 서블릿이 return 된다.
  • ModelAndView 지정
    • ModelAndView에 View, Model 등의 정보를 지정해서 반환하면 View를 rendering 한다.
  • null
    • null을 반환하면 다음 ExceptionResolver 를 찾아서 실행한다.
    • 만약 처리할 수 있는 ExceptionResolver 가 없으면,
      • 기존에 발생한 예외를 서블릿 밖으로 던진다. throw new

ExceptionResolver 활용

  • 예외 상태 코드 변환
    • response.sendError() 호출로 변경해서 서블릿에서 상태 코드에 따른 오류를 처리하도록 위임
      • 이후 WAS 는 서블릿 오류 페이지를 찾아서 내부 호출
  • View Template 처리
    • ModelAndView 에 값을 채우고 뷰 렌더링해서 고객에게 제공
  • API 응답 처리
    • response.getWriter().println("hello"); 
    • HTTP 응답 바디에 직접 데이터를 넣어준다.
  • 예외를 ExceptionResolver 에서 해결한다.
    • ExceptionResolver 를 사용하면 컨트롤러에서 예외가 발생해도 ExceptionResolver 에서 예외를 처리해버린다.
    • 따라서 예외가 발생해도 서블릿 컨테이너까지 예외가 전달되지 않고, 스프링 MVC 에서 예외 처리는 끝이 난다.
    • 결과적으로 WAS 입장에서는 정상 처리가 된 것이다.