SpringMVC Exception Handling

From JCFWiKi

Jump to: navigation, search

웹 어플리케이션에서는 에러처리를 프리젠테이션 단에서 최종적으로 관리하게 된다.
스프링 MVC를 사용하게 되면, 스프링에서 제공하는 에러 처리 메커니즘을 사용하도록 권장한다.
스프링 MVC는 Servlet 기반으로 작동하며, 일반적으로 Dispatcher Servlet을 사용하여 요청을 컨트롤 클래스로 매핑시켜 전달하게 된다.
컨트롤 클래스를 거처서 비즈니스 로직을 수행하는 도중에 에러가 발생하게 되면, try/catch 블록을 통해 별도로 제어하지 않는 한 Dispatcher Servlet으로 에러가 전달되며,
Dispatcher Servlet은 예외 처리를 할 수 있는 예외 리졸버(Resolver)에게 이를 전달하게 된다.
따라서 예외 리졸버를 통해서 예외를 공통적으로 처리해 줄 수 있다.

그림:Springmvc_exceptionhandling.jpg

따라서 다음과 같은 방안으로 예외를 처리한다.

1. 예외는 예외 리졸버를 통해서 일괄 처리한다.
2. 특별한 사유가 없는 한 어플리케이션 소스에서 try/catch를 사용하지 않으며, 사용하더라도 직접 처리하지 않고 반드시 다시 throw 하도록 한다.
3. 요청 타입(일반 Http 요청, MiPlatform 요청)에 따라서 뷰들은 각기 다른 작동을 하도록 한다.
4. MiPlatform 연동시 정상 처리 뷰에서는 결과들을 XML로 변환 한다.
5. MiPlatform 연동시 예외 처리 뷰에서는 예외를 약속된 메세지로 구성하여 XML로 변환 한다. (디버깅을 위해서 로그 메시지도 남기도록 한다.)

이와 관련된 설정은 스프링 서블릿 설정 XML에서 설정하며, 내용은 다음과 같다.

 <bean name="exceptionView" class="view.exception.ExceptionView" />
 <bean name="dataAccessExceptionView" class="MiPlatform.DataAccessExceptionView" />
 <bean name="businessExceptionView" class="MiPlatform.BusinessExceptionView" />
 
 <!-- global exception resolver -->
 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
       <property name="defaultErrorView" value="exceptionView" />
        <property name="exceptionMappings">
            <props>
                <prop key="DataAccessException">dataAccessExceptionView</prop>
                <prop key="BusinessException">businessExceptionView</prop>
            </props>
        </property>
        <property name="warnLogCategory" value="CONTROLLER-WARNING" />
 </bean>

예외 처리 뷰는 다음과 같이 구성된다.

 public class ExceptionView implements View {
 //..
 
 @SuppressWarnings("unchecked")
 public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
  // 1. 예외 객체로부터 예외 내용을 가져온다.
  // 2. 예외 처리 유형을 구분한다.(일반 Http 요청, MiPlatform 요청, ...)
  // 3-1. 일반 Http 요청의 경우, 디스패칭 및 메세지 전달을 수행한다.
  // 3-2. MiPlatform 요청의 경우, 약속된 메세지 포맷을 구성하여 전송한다.
  // (예외 코드 기반, 예외 메세지 기반, 리소스 번들 기반,...) 		
  }
 }

참조
Handling Exceptions In Spring MVC - Part 1
Handling Exceptions In Spring MVC - Part 2