본문 바로가기
Spring/Spring

[Spring] Interceptor개념과 세팅 예제

Spring에서는 어떠한 로직이 실행되기전에 실행하는 공통된 로직을 작성하는 기능이 있습니다. 그것도 한가지가 아닌 무려 3가지나 있다보니 처음 공부하는 개발자 입장에서는 사실 많이 당황스럽습니다. 앞서말한 3가지는 동작하는 위치기준으로  로우단에서 부터 filter, Interceptor, AOP 입니다. 이중에서 오늘 세팅해볼 기능은 Interceptor인데 인터셉터는 컨트롤러에서 들어오는 요청인 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채어 미리 선행되어 실행이 됩니다. HttpRequest, HttpResponse의 전후로 실행되다보니 DispatcherServlet실행 전에 동작하는 filter와는 다르게 DispatcherServlet이 실행 된 후 동작을 하게되며 이는 request, response에 접근이 가능하다는 의미입니다. 따라서 인터셉터는 사용자 권한체크와 같은 작업들에 대하여 적합한데 사실 이와 같은 작업은 사실 AOP로 처리해도 상관은 없습니다. 어떤 방법을 사용할지는 본인이 결정할 문제이겠지요. 오늘 이 포스팅에서는 필터와 인터셉터, AOP의 차이점에 대해서 까지 다루지는 않으며 순수하게 Spring에서 Interceptor를 어떻게 설정하여 사용하는 지에 대하여 알아보겠습니다.

 

 

 

 

 

XML 설정

<!-- interceptors -->
<beans:bean id="interceptor" class="com.freedy.cmm.interceptor.InterceptorService"/>
<interceptors>
  <interceptor>
    <mapping path="/**"/>
    <beans:ref bean="interceptor"/>
  </interceptor>
</interceptors>

xml파일에 대한 설정입니다. 별로도의 xml파일을 생성하여 설정도 가능하지만 저는 그냥 DispatcherServlet에 바로 설정했습니다.

<mapping path="/**"/>태그를 이용하여 인터셉터를 적용할 url을 설정하는데 저는 모든 url에서 인터셉터가 동작하도록 했습니다.

 

 

 

 

 

 

 

Java 생성

<beans:bean id="interceptor" class="com.freedy.cmm.interceptor.InterceptorService"/>

xml 설정 후 인터셉터에 대한 자바파일을 만들어 인터셉터가 동작할 경우 어떤 작업을 할지 java문법으로 작성해야 합니다. 
Java파일의 이름과 경로는 위의 xml파일에서 설정한 경로와 이름을 동일하게 사용하여 만들어야 에러없이 동작합니다.
(경로 : com.freedy.cmm.interceptor)
(파일명 : InterceptorService)

 

 

package com.freedy.cmm.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class InterceptorService extends HandlerInterceptorAdapter {

  @Override /* controller 실행전 - 매개변수 Object는 핸들러 정보를 의미한(RequestMapping, DefaultServletHandler) */
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
    System.out.println("InterCeptor - preHandle");

    //false일 경우 controller실행 없이 종료
    return true;
  }



  @Override /* controller 실행 후 View 호출전(controller의 handler가 끝난후) */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mav) throws Exception {
    System.out.println("InterCeptor - postHandle");
  }



  @Override /* view 호출 */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) throws Exception {
    System.out.println("InterCeptor - afterCompletion");
  }

}

인터셉터의 동작을 담당할 자바파일의 내용입니다. 총 3개의 함수가 있는데 각각의 함수가 작동하는 시점이 조금씩 다릅니다.

preHandle - 컨트롤러 실행전에 선행으로 실행되며 returnr값이 false일경우 동작하지 않는다

postHandle - 컨트롤러 실행 후 실행되며 만약 Exception등 정상적으로 컨트롤러가 실행되지 않는 경우 동작하지 않는다

afterCompletion - 컨트롤러 실행 후 화면이 호출이 완료된 이후에 실행된다.

 

댓글