SpringMVC Logging

From JCFWiKi

Jump to: navigation, search

클라이언트로부터 전달된 요청은 비즈니스 단과는 상관 없으므로 스프링 MVC 에서 처리하도록 설정하며, 이때 다음과 같은 사항을 고려하도록 한다.

1. 일괄적으로 설정되도록 하여 개별 개발자가 신경쓰지 않도록 한다.
2. 스프링 MVC의 요청 처리 흐름에 있어서 기본적으로 확장 가능한 메커니즘을 우선 고려한다.

AOP 기술을 사용하여 로그를 구현할 수도 있겠으나, 위의 항목에 따라 기본적으로 고려해 볼 수 있는 방법은 인터셉터 매커니즘이다.
인터셉터는 디스패처 서블릿에서 개별 컨트롤 클래스를 수행하기 전후로 순차적으로 적용되는 모듈이다.

그림:spring_logging_interceptor.jpg

요청 수행 프로세스 상 적합한 위치에서 로그를 처리할 수 있는 모듈이며, 사용도 매우 단순하다. 다음은 로깅 인터셉터를 설정하는 서블릿 XML이다.

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="loggingHandlerInterceptor"/>
        </list>
    </property>
</bean>
 
<bean id="loggingHandlerInterceptor" class="jcf.web.springmvc.LoggingHandlerInterceptor" />

(주의) 위의 설정 방식은 Annotation의 경우에 설정되는 방법이다.

로깅 인터셉터는 다음과 같이 구현한다.

 public class LoggingHandlerInterceptor implements HandlerInterceptorAdapter {
 
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handl throws Exception {
 
   // 요청 별로 남기고 싶은 로그를 여기서 처리한다.
   return true;
  }
 
  // public void postHandle(..) 로 컨트롤 수행 결과의 로그를 남길 수도 있다.
  // public void afterCompletion(..) 로 컨트롤 수행 상에서 예외 발생시 로그를 남길수도 있다.
 }