DS's『 행복합시다 』

Carpe Programming/jsp & spring & jstl

[Spring] ExceptionResolver 구성하기

nolite 2012. 4. 16. 08:55

SpringMVC에서 예외를 다루기 위해 web.xml내 명시할수 있는 예외 맵핑 방식과 비슷한 HandlerExceptionResolvers을 제공한다.

스프링 프레임워크가 맘에 드는 점중 하나가 어떤 이론이나 원칙에만 근거하여 현상을 무시하지 않고, 현실적인 부분에 대한 해결책을 제공하기 때문이 아닐까 싶다.(기타 다른 기반구조보다는.)

간단하게 HandleExceptionResolver는 컨트롤러에 발생하는 예외상황(Exception)을 처리해주는 Resolver인데, SpringMVC안에 있는 SimpleMappingExceptionResolver의 경우 Exception에 대한 view으로 forward해주는 기능을 제공한다.

  1. <?xml version="1.0" encoding="UTF-8" ?>
    <
    beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
    >

    <!-- Exception Resolver -->
    <bean id="exceptionMapping" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
    <props>
    <prop key="LessWnatedPointThanCurrentPointException">
    auction/exceptionView/viewForCheckWantedPoint
    </prop>
    </props>
    </property>
    </bean>
    < /
    beans>

LessWnatedPointThanCurrentPointException이라는 예외가 발생하면 auction/exceptionView/viewForCheckWantedPoint이라는 이름을 가지는 View으로 포워드하게 되는데 SimpleMappingExceptionResolver을 사용하게 되면 각각 Exception마다 View을 정의해주어야 하는 불편함이 따른다.

대개의 예외 처리의 경우, 사용자에게 예외에 대한 알려주는 역활이 대부분이고, 단순하게 에러 페이지 하나로 리턴하고

각각 Exception 마다 다른 메세지만 뿌려주어도 괜찮을듯 해서 간단한 ExceptionReslovers을 만들어 보고 있다.

  1. <?xml version="1.0" encoding="UTF-8" ?>
    <
    beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
    >

    <!-- Exception Resolver -->

    <bean id="exceptionMapping" class="...SimpleMessageExceptionResolver">

    <property name="exceptionMappings">
    <props>
    <prop key="org.springframework.dao.EmptyResultDataAccessException">
    alert.data.empty.result
    </prop>

    <prop key="domain.AppException">
    alert.domain.app.exceptionn
    </prop>

    </props>

    </property>

    <property name="viewName" value="messages/alertMessage" />

    </bean>
    < /
    beans>

SimpleMappingExceptionResolver 와 비슷한데 단지 exceptionMappings에 prop. 의 값이 messages.properties의 key값이 된다. viewName은 에러 페이지의 viewName이고.


 

  1. public ModelAndView resolveException(HttpServletRequest request,
    HttpServletResponse response, Object obj, Exception exception) {
    ...
  2. String messageCode = this.getExceptionMappings().getProperty(exceptionClassName);
    ModelAndView mav = new ModelAndView(this.getViewName());
    mav.addObject("messageCode",messageCode);
    mav.addObject("exception",exception);
    return mav;
  3. ...



 

alertMessage.jsp에서는 단순히

  1. <spring:message code="${messageCode}" />


 

messages.properties에서는

  1. alert.domain.app.exception=관련 작업을 진행할수 없습니다.

    alert.data.empty.result=관련 데이터가 존재하지 않습니다.


 

여러 메세지 페이지를 만들 필요 없이 exceptionMappings에 추가하고 messages.properties에 추가하면 된다. 흠 너무 간단해서..


 

SimpleMappingExceptionResolvers 처럼 에외객체의 상속관계를 찾아서 근접한? 메세지 키 값을 찾는 부분을 넣어도 될듯 하고, 특정 예외의 경우 메일 발송 기능을 추가해도 될듯 하다.

메일 발송의 경우는 다른 객체로 만들어서 Order을 주는게 일반적인 방식일듯.


 

참고로 properties을 작성할때, http://www.resourcebundleeditor.com/wiki/ResourceBundleEditor 을 이용해서 작성하면 편하다. ant에 있는 natvie2asci 을 빼버리고 이걸로 관리하기 시작했다.

 

[출처] - http://anarch.tistory.com/35

 

 

728x90