우당탕탕

[Spring] 필터(Filter)와 인터셉터(Interceptor) 차이 본문

Tech/Spring

[Spring] 필터(Filter)와 인터셉터(Interceptor) 차이

모찌모찝 2022. 8. 23. 18:15
필터와 인터셉터의 차이는?

필터와 인터셉터

필터와 인터셉터에 관한 내용도 면접 내용으로 많이 나오는 질문이다.
그럼 필터와 인터셉터가 하는 일은 무엇일까?

간단하게 말하면 컨트롤러로 들어가기 이전에 처리해야 할 작업들을 수행하는 것이다.
공통된 작업들을 해결하기 위해서는 필터, 인터셉터, AOP를 사용할 수 있지만 이번 글에서는 필터와 인터셉터에 대해 설명해보려 한다.

필터

일단 필터는 J2EE 표준 스펙의 기능이며, 클라이언트의 요청이 들어올 때 Web Context영역 안에서 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 URL 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공한다. ( 말로는 어려우니 아래 사진으로 ) 

필터

필터 흐름의 경우 아래와 같이 동작한다

HTTP 요청  ->  WAS ->  필터 ->  서블릿 ->  컨트롤러
필터체인: HTTP 요청 -> WAS -> 필터 1 ~ N  -> 서블릿 -> 컨트롤러


필터를 구현할 땐 javax.servlet의 Filter 인터페이스를 사용한다.

Filter 인터페이스의 구조는 다음과 같다

public interface Filter {

    public default void init(FilterConfig filterConfig) throws ServletException {}
    
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;
            
    public default void destroy() {}

}


처음 등장하는 init 메서드의 경우 필터 객체를 초기화하고 서비스에 추가하기 위해 사용된다.
doFilter 메서드의 경우 필터 처리를 구현할 수 있으며 FilterChain 파라미터를 사용하여 다음 필터로 요청을 넘길 수 있다.
doFilter의 경우 매개변수로 request와 response를 받아 아래 예시 코드와 같이 chain.doFilter를 통해 다음 필터로 값을 변경하여 넘길 수 있다. 

chain.doFilter(request, response);

destroy 메서드의 경우 필터를 제거하고 자원을 반환하기 위해 사용된다.

필터는 보통 공통로깅 작업, 인증, 인가, XSS방어, 인코딩 등에 사용되며 필터로 구현한 로그인, 로깅작업 코드를 "산타"앱 카테고리에 정리해서 올리도록 하겠다.

인터셉터

인터셉터의 경우 스프링 MVC가 제공하는 기능이다. 아래의 사진과 같이 필터 이후 실행되며 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 전에 호출된다. 이전 디스패처 서블릿의 글에서 설명한 HandlerMapping을 지나 인터셉터가 존재한다면 인터셉터를 실행하고 없는 경우 바로 컨트롤러를 호출한다.

인터셉터


인터셉터 흐름의 경우 아래와 같다.

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
인터셉터 체인 : HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터1 ~ N -> 컨트롤러


인터셉터의 경우 HandlerInterceptor 인터페이스를 구현하면 된다.
HandlerInterceptor 인터페이스구조는 다음과 같다.

public interface HandlerInterceptor 

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
	throws Exception {
        return true;
    }
    
    default void postHandle(HttpServletRequest request, HttpServletResponse response,
	Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
        
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response,
	Object handler, @Nullable Exception ex) throws Exception {
    }
}

필터의 기능 구현은 doFilter 하나로 수행하지만 인터셉터의 경우 3단계로 구성된다.

1. preHandle : 반환 타입이 boolean 타입으로 true일 경우 계속 진행하고 false일 경우 진행을 멈춘다. ( 컨트롤러 호출 전에 실행된다 )
2. postHandle : HandlerAdaptor 호출 후에 실행된다 ( 컨트롤러가 호출된 후에 실행된다 )
3. afterCompletion : 요청이 완료된 후 실행되며 뷰가 렌더링 된 후에 실행된다. 

필터(Filter)와 인터셉터(Interceptor)의 차이

1. 필터의 경우 웹 컨텍스트 안에서 실행되며, 인터셉터의 경우 스프링 컨텍스트 안에서 실행된다.
2. 필터의 경우 HttpServlet request / response 객체를 조작할 수 있지만 인터셉터의 경우 불가능하다. 

 

Comments