Skip to content

spring filter #
Find similar titles

Structured data

Category
Programming

서론. #

스프링을 기반으로 웹 프로젝트를 개발하다보면 특정 프로세스를 공통으로 처리할 필요를 느낄 때가 많다. 가장 흔한 예가 로그인 프로세스 일 것이다. 이럴 때 컨트럴러에 들어가기 전 공통으로 처리할 수 있는 기능(전후처리기)이 있으면 중복되는 코드를 줄일 수 있다. 우리는 이러한 문제를 Interceptor나 Filter를 통해 해결할 수 있다. 다만 전후처리라는 공통의 기능을 가지고 있기 때문에 Interceptor와 Filter의 차이가 명확하지 않은 것 같다. 본 글에서는 Interceptor와 Filter의 차이점에 대해 알아보고자 한다.

본론. #

Interceptor와 Filter의 공통점 #

앞서 서론에 이야기한 바와 같이 Interceptor와 Filter는 공통된 업무를 프로그램 앞 또는 뒤에 추가하여 자동으로 처리할 수 있는 기능이 있다. 어떠한 행동(로직)을 수행하기 이전 또는 이후에 수행함으로써 프로젝트의 서버 부하를 줄이고 소스관리를 용이하게 한다.

Interceptor와 Filter의 차이점 #

Filter는 Web Application에 등록을 하고 Interceptor는 Spring의 Context에 등록을 한다. 이에 따라 Filter와 Interceptor는 실행되는 시점이 다르다. 요청의 흐름에 따라 Filter가 먼저 Interceptor가 나중에 실행된다. 뒤에서 자세히 알아보자.

Interceptor 설정

Filter 설정 필터이름 com.insilicogen.common.filter.필터클래스 필터이름 /*.do

아마 위 두 설정을 보면 직관적으로 어떤 설정이 담겨 있는지 알 수 있을 것이다. 두 설정 모두 특정 URL이 호출될 경우 인터셉터클래스나 필터클래스를 먼저 호출하겠다는 설정이다.

요청흐름에 따른 Interceptor와 Filter #

image

그림1 Interceptor와 Filter의 요청흐름 (출처: 김형진 - blogspot)

위 그림1을 보면 클라이언트로부터 요청이 들어오면 Filter에 제일 먼저 들어온다. doFilter를 통해 filter는 전처리를 수행하고 preHandle과 postHandle을 통해 전처리를 수행하고 있음을 알 수 있다. 그림1에서는 표현되지 않았지만 Filter와 Interceptor사이에 DispatcherServlet이 있다. 그래서 Filter는 DispatcherServlet이 수행되기전 Interceptor는 DispatcherServlet이 실행된 후라고 호출 시점을 말하기도 한다.

Interceptor #

Interceptor는 HandlerMethod를 사용한다.

public interface HandlerInterceptor {

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception;

    void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception;

    void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;

}

메서드 이름에 따라 직관적으로 알 수 있지만 부가 설명을 하자면 preHandle()은 컨트롤러가 호출되기 전에 시작된다. 주로 요청에 대한 로그를 남기는 작업을 수행할 때 많이 수행한다. boolean값을 리턴하여 true일 때만 핸들러 다음 단계를 수행한다. false라면 컨터롤러나 다음 인터셉터의 로직 수행은 되지 않는다. postHandle()은 컨트롤러가 실행되고 난 후에 호출된다. afterCompletion()은 모든 작업이 완료된 후에 실행된다.

위의 예제 처럼 사용할 수 있다.

Filter #

public class TestFilter implements Filter {

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
    chain.doFilter(req, res);
}

@Override
public void init(FilterConfig config) throws ServletException {}


@Override
public void destroy() {}

}

doFilter()를 통해 request 파라미터를 이용하여 필터 작업을 수행한다. chain.doFilter(req, res)를 통해서는 다음 체인의 필터 처리를 할 수 있다. response를 이용하여 응답의 필터링을 수행할 때 사용한다. destroy()를 통해 필터가 사용한 자원을 반납한다.

참고출처 #

관련 키워드 #

Filter, 필터, Interceptor, 인터셉터, Filter와 Interceptor

0.0.1_20140628_0