Spring MVC ExceptionResolver, 에러페이지 연결

SpringMVC에서는 HandlerExceptionResolver를 제공합니다.

이름을 보면 알 수 있듯이 Exception이 발생했을 때 처리하는 기능입니다.

이 포스팅에서는 AbstractHandlerExceptionResolver를 이용하는 방법에대해 소개합니다.

 

진행과정은 아래와 같습니다.

1. AbstractHandlerExceptionResolver를 상속받은 클래스 만들어 Exception에 대한 처리를 합니다.

2. DispatcherServlet에서 해당 클래스를 빈으로 등록합니다.

3. 연결될 에러뷰페이지를 만들어줍니다.

CustomExceptionResolver 만들기

AbstractHandlerExceptionResolver를 상속하는 CustomExceptionResolver를 만들겠습니다.

우리는 해당클래스에서 Exception에 대한 처리를 진행합니다.

public class CustomExceptionResolver extends AbstractHandlerExceptionResolver {
	
    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, 
    	HttpServletResponse response, Object handler, Exception ex) {
    
    	ModelAndView modelAndView = new ModelAndView();
        // WEB-INF/views/error.jsp
        modelAndView.setViewName("error");
        
        if(handler != null) {
            HandlerMethod handlerMethod = (handlerMethod)handler;
            modelAndView.addObject("errorMethod", handlerMethod.getMethod().getName());
        }
        modelAndView.addObject("errorCause", ex.getCause());
        modelAndView.addObject("errorClass", ex.getClass().getSimpleName());
        modelAndView.addObject("errorMessage", ex.getMessage());
        
        return modelAndView;
    }
}

Exception이 해당 Resolver로 넘어오면 ModelAndView 객체를 만들어서 

Exception관련 정보들을 저장하여 리턴하도록 작성하였습니다.

예제 코드는 간단하게 에러 정보를 담아 뷰를 리턴하는 것으로 끝냈지만

로그를 쌓는다던지 원하는 동작대로 코딩하시면 되겠습니다.

 

DispatcherServlet에 해당 ExceptionResolver 등록

방금 만든 ExceptionResolver가 Exception 발생 시 매핑되도록 DispatcherServlet에 등록해주겠습니다.

class 명에 패키지까지 포함해서 방금만든 ExceptionResolver Class를 입력해주면 됩니다.

* order: -1 로 넣은 것은 해당 ExceptionResolver의 우선순위를 최상위로 하겠다는 것

<!-- exceptionResolver 등록, exception 발생할시 해당클래스로 매핑 -->
<beans:bean class="com.springweb.common.CustomExceptionResolver">
	<beans:property name="order" value="-1">
</beans:bean>

 

에러 뷰 페이지 생성

Resolver에서 리턴할 뷰의 경로에 JSP파일을 만들어 줍시다.

ExceptionResolver에서 넘기고있는 에러에 관한 정보들을 화면에 뿌려주도록 하였습니다.

<html>
<body>
<h1>
    Hello Error!
</h1>

<p>Exception: ${errorClass}</p>
<p>Method: ${errorMethod}</p>
<p>Message: ${errorMessage}</p>
<p>Cause: ${errorCause}</p>
</body>
</html>

 

테스트

테스트를위해 컨트롤러에 아래 코드를 추가해서 예외(Exception)를 발생시키겠습니다.

@RequestMapping(value = "/makeError", method = RequestMethod.GET)
public void makeError() throws Exception {
    throw new NullPointerException();
}

해당 주소로 이동해서 에러를 발생시키면 error.jsp로 연결되고

Model에서 넘겼던 Exception정보 들이 출력되는 것을 확인할 수 있습니다.

 

그냥 사용방법을 설명하기위해  간단하게 예제를 보여드렸지만

에러 종류에 따라 다른 뷰로 연결하여도 되고, 원하는 다른 작업을 얼마든지 할 수 있습니다.

굉장히 쉽고 간단하게 Exception에 대한 관리를 할 수 있습니다.