이번에는 ExceptionResolver 관련 간단한 정리입니다. 미리 준비되어 있는 ExceptionResolver가 몇 종류 있는데, 개인적으로는 ExceptionHandlerExceptionResolver만 쓸 줄 알아도 충분하다고 봅니다.
ExceptionResolver
DispatcherServlet에 ExceptionResolver를 선언하여 에러 발생 시 해당 ExceptionResolver가 처리하게 하는 방식이다.
예제
<web.xml>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<dispatcher-servlet.xml>
<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean>
<Controller 클래스>
@ExceptionHandler({ IllegalArgumentException.class, ExampleException.class })
@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid")
public void onBadRequestException(final RuntimeException exception) {
LOG.error("!오류 핸들러가 실행!", exception);
}
[ExceptionHandlerExceptionResolver]는 예외 발생 시 [@ExceptionHandler]어노태이션이 붙은 메서드가 처리하게 한다.
장단점 설명
ExceptionResolver 클래스는 추상클래스[AbstractHandlerExceptionResolver]를 상속받거나, 인터페이스[HandlerExceptionResolver]를 구현하여야 한다. 두 경우 모두 메서드[resolveException]가 구현되어야 한다.
메서드[resolveException]은 다음과 같은 특징이 있다.
- 인자로 Exception을 받는다. 예외를 로그에 남기는 등의 처리가 가능하다.
- 반환형이 ModelAndView다. 이를 통해 출력할 뷰를 제어할 수 있다.
장점 : 로그를 남기는 등 추가 처리가 가능하다.
단점 : 별달리 없다.
총평 : 미리 지원해주는 ExceptionResolver가 몇 종류 있어서, 알아보고 사용하면 된다. 없으면 직접 상속받거나 구현한 클래스를 사용하면 된다. 다만 개인적으로는 ExceptionHandlerExceptionResolver와 @ControllerAdvice 연계가 가장 가성비가 좋다고 생각한다. @ControllerAdvice에 대해서는 다음에 설명한다.
참고
- [스프링프레임워크 에러페이지 만들기] : SimpleMappingExceptionResolver에 대한 예제와 설명.
- [https://bboglebbogle.tistory.com/45] : ExceptionHandlerExceptionResolver, DefaultHandlerExceptionResolver에 대한 간단한 설명을 볼 수 있다. @ControllerAdvice에 대한 간단한 예제도 있다.