[Spring] Filter vs Interceptor

시내·2024년 4월 18일

Spring

목록 보기
6/10

🍿 Filter

  • Dispatcher Servlet에 요청이 전달되기 전 / 후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공
  • Spring Container 가 아닌 톰캣과 같은 Web Container에 의해 관리가 됨
    (= Spring 범위 밖!)
  • Spring @Bean으로 등록 가능

🎞️ Methods

Filter 사용하기 위해서는 Filter interface 구현 필요!

public interface Filter {
    default void init(FilterConfig filterConfig) throws ServletException {
    }

    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

    default void destroy() {
    }
}

init()

  • 필터 객체를 초기화 & 서비스에 추가하기 위한 메소드
  • Web Container가 1회 init()을 호출 시, 이후 요청들은 doFilter()를 통해 처리됨

doFilter()

  • url-pattern에 맞는 모든 HTTP 요청이 디스패처 서블릿으로 전달되기 전, Web Container에 의해 실행되는 메소드
  • doFilter() 의 파라미터인 FilterChain에서 doFilter() 메소드를 통해 다음 대상으로 요청을 전달 가능
  • chian.doFilter()로 전, 후에 우리가 필요한 처리 과정을 넣어줌으로써 원하는 처리를 진행할 수 있음
    (여기서 chian.doFilter() 는 FilterChain의 메소드)
public interface FilterChain {
    void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}

destroy()

  • 필터 객체를 제거 & 사용하는 자원을 리턴하기 위한 메소드
  • Web Container가 1회 destroy()를 호출 시, 필터 객체를 종료하면 이후에는 doFilter에 의해 처리되지 않음

🍿 Interceptor

  • Dispatcher Servlet이 Controller를 호출하기 전 / 후에 interceptor가 끼어들어 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공
  • Spring Container에 의해 관리가 됨

🎞️ Methods

인터셉터 사용하기 위해서는 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 {
    }
}

preHandle()

  • Controller가 호출되기 전에 실행됨
  • Controller 이전에 처리해야 하는 전처리 작업이나 요청 정보를 가공하거나 추가하는 경우에 사용 가능

postHandle()

  • Controller가 호출된 후에 실행됨
  • Controller 이후에 처리해야 하는 후처리 작업이 있을 때 사용 가능
  • 이 메소드는 Controller가 반환하는 ModelAndView 타입의 정보가 제공되는데, 최근에는 JSON 형태로 데이터를 제공하는 RestAPI 기반의 Controller (@RestController)를 만들면서 자주 사용되지 않음

afterCompletion()

  • 모든 View에서 최종 결과를 생성하는 일을 포함해 모든 작업이 완료된 후에 실행됨
  • 요청 처리 중에 사용한 리소스를 반환할 때 사용 가능

🍿 차이

FilterInterceptor
Request & Response 조작 가능Request & Response 조작 불가
보안 및 인증/인가 관련 작업세부적인 보안 및 인증/인가 공통 작업
모든 요청에 대한 로깅 또는 검사API 호출에 대한 로깅 또는 검사
이미지/데이터 압축 및 문자열 인코딩Controller로 넘겨주는 정보 (데이터) 의 가공
Spring과 분리되어야 하는 기능클라이언트의 요청과 관련되어 전역적으로 처리해야 하는 작업

출처: https://dev-coco.tistory.com/173

profile
contact 📨 ksw08215@gmail.com

0개의 댓글