Filter vs Interceptor

smc2315·2024년 2월 27일
0

spring-boot

목록 보기
6/7
post-thumbnail

Spring은 공통적인 작업을 처리하는 중복 코드를 분리하기 위해 여러 방법을 제공한다.
그 중 역할이 비슷해 보이는 Filter와 Interceptor의 차이점을 분석해 보자.

1. Filter

1-1. Filter란

필터는 J2EE 표준 스팩 기능으로 객체의 형태로 존재하며 클라이언트로부터 오는 요청과 Dispatcher Servlet 사이에 위치하며 클라이언트의 요청 정보를 알맞게 변경할 수 있고 Dispatcher Servlet의 응답을 알맞게 변경할 수 있다.


위의 그림과 같이 필터는 Client와 Dispatcher Servlet 사이에 존재하며 Filter Chain을 통해 여러 개의 필터를 연쇄적으로 적용할 수 있다.


Filter Chain을 구성하게 되면 클라이언트의 요청이 필터를 순차적으로 거쳐 자원(Dispatcher Servlet)에 도달하게 되고, 자원의 응답이 다시 필터를 역순으로 거치며 클라이언트에 도달하게 된다.

1-2. 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() {}
}

Filter에는 다음과 같은 세 가지 메서드가 존재한다.

  1. init: 필터를 웹 컨테이너 내에 생성한 후 초기화할 때 호출한다.

  2. doFilter: 체인을 따라 다음에 존재하는 필터로 이동한다. 체인의 가장 마지막에는 클라이언트가 요청한 최종 자원이 위치한다.

  3. destroy: 필터가 웹 컨테이너에서 삭제될 때 호출된다.

Filter의 doFilter 내에서 chain.doFilter()를 통해 다음 필터로 요청, 응답을 전달할 수 있으며 chain.doFilter() 전에 로직을 작성하여 Request에 대한 처리를, 이후에 로직을 작성하여 Response에 대한 처리를 할 수 있다.

2. Interceptor

2-1. Interceptor란

InterCeptor는 Spring에서 제공하는 기술로, Dispatcher Servlet과 Controller 사이에 위치하여 Controller를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있다.

2-2. Interceptor 메서드

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 {
    }
}

Interceptor에는 다음과 같은 세 가지 메서드가 존재한다.

  1. preHandle: Controller가 호출되기 전에 실행된다.

  2. postHandle: Controller 호출 후 실행된다. Controller 하위 계층에서 예외가 발생하면 실행하지 않는다.

  3. afterCompletion: 모든 뷰에서 최종 결과를 생성하는 일을 포함해 모든 작업이 완료된 후에 실행된다. 하위 계층에서 예외가 발생하더라도 실행이 된다.

3. Filter vs Interceptor

1. 실행 시점

앞서 살펴 봤듯이 Filter와 Interceptor는 실행 시점이 다르다.
Filter는 Spring의 관리 영역에 속해 있지 않고 Client와 Dispatcher Servlet 사이에서 작동한다.
Interceptor는 Spring의 관리 영역 내의 Dispatcher Servlet과 Controller 사이에서 작동한다.

2. 사용 용도

Filter와 Interceptor의 사용 용도에는 확연한 차이가 보인다.
Filter의 경우에는 주로 Spring과 무관하게 공통으로 처리해야 할 작업을 처리하고 Interception는 주로 Controller와 관련된 공통으로 처리해야 할 작업을 처리한다.

[필터(Filter)의 용도 및 예시]

  • 공통된 보안 및 인증/인가 관련 작업
  • 모든 요청에 대한 로깅 또는 감사
  • 이미지/데이터 압축 및 문자열 인코딩
  • Spring과 분리되어야 하는 기능

[인터셉터(Interceptor)의 용도 및 예시]

  • 세부적인 보안 및 인증/인가 공통 작업
  • API 호출에 대한 로깅 또는 감사
  • Controller로 넘겨주는 정보(데이터)의 가공

3. Request, Response 조작 가능 여부

Filter는 Request와 Response를 조작 할 수 있고 Interception는 불가능 하다. 여기서 말하는 조작은 기존 요청과 응답의 내부 상태를 변경하는 것이 아니라 완전히 새로운 객체로 바꿔치기 하는 것을 말한다.

4. 예외 처리
Filter의 경우 Spring 관리 범위 밖에 있기에 ControllerAdvice를 통한 예외 처리가 불가능하다. 따라서 예외 처리를 위한 ExceptionHandlerFilter 등을 통해 추가적인 예외 처리를 구현해야 한다.

profile
개발일지

0개의 댓글