스프링에서 전후처리기 를 담당하는 Interceptor와 Filter가 있습니다.
기능만 보면 Interceptor와 Filter는 비슷해 보입니다. Filter로 해야 되는 일들은
Interceptor로 구현 할 수 있습니다.
Spring Interceptor 설정파일을 보면
<spring-servlet.xml>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api1/*" />
<mvc:mapping path="/api2/*" />
<mvc:mapping path="/api3/*" />
<bean class="com.test.interceptor.RequestInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
|
위 부분은 api1,2,3 호출되기전에 RequestInterceptor Class를 먼저 호출
하는 것입니다.
Filter 부분 설정을 보면
<web.xml>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<filter>
<filter-name>필터이름</filter-name>
<filter-class>com.test.filter.RequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>필터이름</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
|
위 부분은 필터먼저 호출하고 페이지를 호출하겠다는 것입니다.
이렇게 보면 위 두 Interceptor와 Filter 부분이 비슷하다고 볼 수 있습니다.
아래 그림을 보면 Spring 에서 Request가 어떻게 흐르는지 알 수 있습니다.
일단 호출되는 시점이 다르다.
Interceptor나 Filter나 Controller에 진입하기 전에 작업을 처리를 위해 사용하므로
차이 없어 보일 수 있으나 위의 그림을 보면 호출되는 시점이 다르다는걸 알 수 있
습니다.
Filter의 경우는 Interceptor와 다르게 설정 정보를 web.xml에 작성합니다.
멤버함수의 용도도 다릅니다.
Interceptor
- preHandle() : Controller 진입 전
- postHanle() : Controller 진입 후 view로 보내기 전
- afterCompletion() : view까지 끝나고 나서
Filter
- init() : filter 인스턴스 초기화
- doFilter() : 전/후 처리
- destroy() : filter 인스턴스 종료
doFilter 함수는 아래처럼 작성 됩니다.
1
2
3
4
5
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 전 처리
chain.doFilter(request, response);
// 후 처리
}
|
Filter는 doFilter 함수에서 전후 처리를 모두 담당하는데 doFilter가 요청 전과 후,
두번 호출되는 방식입니다.
Filter는 J2EE 표준 스펙에 나와있는 Servlet 기술 중 일부라서 web.xml에 기술
되는 것이며, Interceptor는 비슷한 기술이지만, Spring에 녹인것으로 보입니다.
Spring 기반으로 한다면 당연히 Filter보단 Interceptor를 사용하고 Spring 없이
단순 Servlet구현이라면 Filter를 사용해서 사용하면 될 것 같습니다.