Spring Framework/Filter

Spring Filter란? - Spring Filter Hands On 1

Junuuu 2023. 10. 4. 00:01

개요

Spring은 중복된 코드를 제공하기 위해 공통적인 작업을 수행하는 많은 기능들을 제공합니다.

필터, 인터셉터, AOP 등이 제공되는데 여기서 Filter에 대해서 알아보고자 합니다.

 

Filter의 개념을 알아보고 실습을 통해 Hands On 시리즈를 작성해보고자 합니다.

 

Spring Filter란?

Spring Filter를 사용하면 Client의 요청이 Controller에 도달하기 전에 특정작업을 수행하거나, Controller가 Client로 다시 보내는 응답에 대해 부가작업을 수행할 수 있도록 지원합니다.

 

엄밀히 말하면 Dispatcher Servlet에 도달하기 전후로 부가작업을 수행합니다.

  • Request 값, Response 값 로깅
  • request Body와 header의 포맷팅
  • Authentication Token의 검증
  • 등등..

 

Spring Web에는 다양한 종류의 Filter를 제공하고 있습니다.

AbstractRequestLoggingFilter
CharacterEncodingFilter
CommonsRequestLoggingFilter
CompositeFilter
CorsFilter
DelegatingFilterProxy
FormContentFilter
ForwardedHeaderFilter
GenericFilterBean
HiddenHttpMethodFilter
OncePerRequestFilter
RelativeRedirectFilter
RequestContextFilter
ServerHttpObservationFilter
ServletContextRequestLoggingFilter
ServletRequestPathFilter
ShallowEtagHeaderFilter

 

GenericFilterBean의 추상 클래스는 Filter 인터페이스를 구현하며 실제 필터링은 서브클래스에 맡깁니다.

서브 클래스는 doFilter() 메서드를 구현해야 합니다.

 

request logging과 관련된 Filter는 AbstractRequestLoggingFilter, CommonsRequestLoggingFilter, ServlerContextRequestLoggingFilter가 있습니다.

 

OncePerRequestFilter는 요청 디스패치당 단일 실행을 보장하는 필터입니다.

위처럼 다양한 기능을 제공하는 필더들이 존재하고, 상황에 맞는 필터를 상속받아 적용할 수 있습니다.

 

Filter가 제공하는 메서드

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 메서드는 웹 컨테이너에 의해 Filter가 호출되며 실행될 때 한번 init 메서드를 호출합니다.

init 메서드가 실패하는 경우 필터를 사용할 수 없고 ServletException을 반환합니다.

기본 구현은 NO-OP(No Operation)으로 아무일도 하지 않습니다.

 

destroy 메서드는 서비스가 종료될때 웹 컨테이너에 의해 호출됩니다.

destroy 메서드가 호출된후에 doFilter 메서드를 다시 호출하지 않으며, 보유 중인 모든 리소스를 정리합니다.

기본 구현은 NO-OP입니다.

 

doFilter 메서드는 client reqeust가 chain을 통과하는 동안 response/request 인자로 호출합니다.

FilterChain은 필터가 요청과 응답을 다음 chain으로 넘길 수 있도록 합니다.

일반적으로 request를 검사하고, 선택적으로 요청 객체를 조작하거나 필터링합니다.

 

 

참고자료

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/package-summary.html

https://www.baeldung.com/spring-boot-add-filter

https://www.tutorialspoint.com/spring_boot/spring_boot_servlet_filter.htm

https://docs.spring.io/spring-framework/reference/web/webmvc/filters.html

https://springframework.guru/using-filters-in-spring-web-applications/