HandlerExceptionResolver는 컨트롤러 밖으로 던져진 예외를 해결하고, 동작 방식을 변경할 수 있는 기능을 제공한다. (=ExceptionResolver)
WAS -> DispatcherServlet(+preHandle) -> HandlerAdaptor -> Handler(Controller) 예외 발생 -> HandlerAdaptor 예외 전달 -> DispatcherServlet -> Exception Resolver *예외 해결 시도 -> DispatcherServlet -> View -> afterCompletion -> 정상 응답
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object 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의 동작 방식은 달라진다.
참조
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2