Spring - HandlerExceptionResolver

박민수·2023년 11월 14일

Spring

목록 보기
15/46
post-thumbnail

HandlerExceptionResolver

HandlerExceptionResolver는 컨트롤러 밖으로 던져진 예외를 해결하고, 동작 방식을 변경할 수 있는 기능을 제공한다. (=ExceptionResolver)

동작 방식

WAS -> DispatcherServlet(+preHandle) -> HandlerAdaptor -> Handler(Controller) 예외 발생 -> HandlerAdaptor 예외 전달 -> DispatcherServlet -> Exception Resolver *예외 해결 시도 -> DispatcherServlet -> View -> afterCompletion -> 정상 응답

  • HandlerExceptionResolver를 통해 예외가 해결되면 정상적으로 응답을 보낸다.
  • ExceptionResoler로 예외를 해결하더라도 postHandle()은 호출되지 않는다

인터페이스

public interface HandlerExceptionResolver {
     ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, 
      Object handler, Exception ex);
}
  • handler: 핸들러 정보
  • Exception ex: 핸들러에서 발생한 예외

사용 예시

IllegalArgumentException 예외가 발생하면 기본적으로 500 에러가 뜨는데, response.sendError를 호출하여 HTTP 상태 코드를 400으로 바꿔주고, ModelAndView를 반환하였더니 정상적으로 응답이 보내진다.

@Slf4j
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        try {
            if (ex instanceof IllegalArgumentException) {
                log.info("IllegalArgumentException resolver to 400");
                response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
                return new ModelAndView();
            }
        } catch (IOException e) {
            log.error("resolver ex", e);
        }

        return null;
    }
}

HandlerExceptionHandler를 사용하기 위해서는 등록을 해줘야한다.

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(new MyHandlerExceptionResolver());
    }
}

반환 값에 따른 동작 방식

HandlerExceptionResolver의 반환 값에 따라 DispatcherServlet의 동작 방식은 달라진다.

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

참조
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2

profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글