1. HandlerExceptionResolver이란
HandlerExceptionResolver는 컨트롤러 작업 중 발생한 예외를 어떻게 처리할 지 결정하는 전략이다.
만약 컨트롤러에서 에러가 발생하면 DispatcherServlet이 전달받은 다음 다시 서블릿으로 던져서 서블릿 컨테이너가 처리하게 된다.
별다른 처리를 하지 않았다면 500 Internal Server Error 같은 메시지가 출력된다.
그런데 핸들러 예외 리졸버가 등록되어있다면 DispatcherServlet은 먼저 이 리졸버가 해당 예외를 처리할 수 있는지 확인한다.
만약 해당 예외를 처리할 수 있으면 예외는 서블릿 밖으로 던져지지 않고 HandlerExceptionResolver가 처리한다.
2. HandlerExceptionResolver 인터페이스
핸들러 예외 리졸버는 HandlerExceptionResolver 인터페이스를 구현해서 생성한다.
public interface HandlerExceptionResolver {
@Nullable
ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
}
public ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
if (this.resolvers != null) {
for (HandlerExceptionResolver handlerExceptionResolver : this.resolvers) {
ModelAndView mav = handlerExceptionResolver.resolveException(request, response, handler, ex);
if (mav != null) {
return mav;
}
}
}
return null;
}
핸들러 예외 리졸버는 HandlerExceptionResolver 인터페이스를 구현해서 생성하며 리턴 타입은 ModelAndView이다.
만약 예외가 난 후에 HandlerExceptionResolver에서 View가 지정이 되어있으면 해당 View로 이동한다.
만약 ModelAndView가 빈 부분이라면 호출되는 부분없이 DispatcherServlet로 진행된다.
null을 반환하게 되면, 다음 HandlerExceptionResolver을 찾아서 실행된다.
HandlerExceptionResolver가 ModelAndView를 반환하는 이유는 Exception을 처리하고 정상 흐름으로 진행되도록 하는 것이 목적이다. 이름처럼 예외를 해결한다고 볼 수 있다.
3. HandlerExceptionResolver 예시
public class HandlerExceptionResolverTest implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
try {
if(ex instanceof IllegalArgumentException) {
//500에러를 400에러로 변경
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
//새로운 ModelAndView를 반환 , 빈 부분으로 렌더링되는 부분은 없고 WAS로 던져짐
return new ModelAndView();
}
} catch (IOException e) {
log.error("resolver ex {}",e.getMessage());
}
//null인 경우에 다음 ExceptionResolver를 찾아서 실행함
return null;
}
}
별다른 처리를 하지 않았다면 500 Internal Server Error 같은 메시지가 출력되었겠지만 sendError() 를 통해
400 BAD_REQUEST 에러 메시지로 변경하였다.
그리고 빈 ModelAndView 를 호출해서 View가 렌더링되지 않고 DispatcherServlet로 정상적으로 리턴된다.
'SPRING' 카테고리의 다른 글
1. 파일 업로드 (Servlet) (0) | 2021.08.19 |
---|---|
Converter (0) | 2021.08.09 |
Filter와 Interceptor ( 2. Interceptor ) - 로그인 관련 (0) | 2021.08.06 |
Filter와 Interceptor ( 1. Filter ) - 로그인 관련 (0) | 2021.08.05 |
로그인관련 쿠키 및 세션 정리 (0) | 2021.08.04 |