Backend/Spring+Boot

SpringBoot ServletFilter 구현

findmypiece 2021. 3. 16. 13:18
728x90

전체코드는 아래 github을 참고하도록 한다.

github.com/mypiece/springboot-example/tree/master/filter-example

 

mypiece/springboot-example

스프링부트 예제. Contribute to mypiece/springboot-example development by creating an account on GitHub.

github.com


SpringBoot 환경에서 ServletFilter 자체는 아래와 같이 간단하게 정의 가능하다.

public class TestFilter extends OncePerRequestFilter {

    protected void doFilterInternal(
    	HttpServletRequest request
        , HttpServletResponse response
        , FilterChain filterChain) {
        
        //request 또는 response 변환 로직...

        filterChain.doFilter(request, response);
    }
    
}

 

문제는 이를 요청에 어떻게 적용하냐는건데

기본적으로 해당 Filter 클래스를 Bean 으로 등록하면 된다.

 

아래와 같이 클래스에 @Component를 명시하던가

@Component
public class TestFilter extends OncePerRequestFilter {

    protected void doFilterInternal(
    	HttpServletRequest request
        , HttpServletResponse response
        , FilterChain filterChain) {
        
        //request 또는 response 변환 로직...

        filterChain.doFilter(request, response);
    }
    
}

 

@Configuration 클래스 하위에 @Bean 으로 팩토리 메소드를 정의하는 방법이 있다.

@Configuration
public class WebConfig {

  @Bean
  public TestFilter testFilter(){
  	return new TestFilter();
  }
    
}

 

그런데 문제는 이렇게 할 경우 기본적으로 모든 url 에 Filter 가 적용되게 되고

특정 url 패턴에만 Filter 를 적용할 수 없기 때문에 이렇게 쓰이는 경우는 거의 없고

아래 두가지 방법 중 하나를 선택적으로 적용하게 된다.

 

1. @WebFilter + @ServletComponentScan

Filter 클래스에 아래와 같이 @WebFilter 어노테이션 설정한다.

(@Component 는 지정하면 안됨)

어노테이션 인자로 url-pattern 을 배열로 정의할 수 있다.

 

그리고 부트스트랩 클래스에 @ServletComponentScan 어노테이션을 선언한다.

이를 통해 @WebFilter를 스캔해서 Bean으로 생성한다.

@Configuration 이 선언된 클래스에 설정하면 된다는 글도 보이는데 반드시 이곳에 정의해야 한다.

 

2. FilterRegistrationBean 팩토리 메소드 재정의

Filter 클래스에 @Component를 선언해서 Spring Bean 에 포함시킨다.

 

별도의 @Configuration 클래스에서 FilterRegistrationBean Bean을 선언하고

위에서 정의한 Filter Bean과 url-pattern을 셋팅한다.

addUrlPatterns 의 인자는 가변인자로 선언되어 있다.

 

두가지 방법 중 개인적으로 2번 방법을 선호하는 편인데 이유는 다음과 같다.

개인적으로 부트스트랩 클래스에는 특정 기능만을 위한 설정은 포함되지 않는 것이 맞다고 생각되는데

1번 방법을 사용할 경우 부트스트랩 메소드에 @ServletComponentScan 정의가 강제되기도 하고

기본적으로 설정은 @Configuration 클래스에 명시적으로 선언하는 것이

추후 다른 사람이 분석하기에도 수월하게 접근이 가능하기 때문이다.

 

728x90

'Backend > Spring+Boot' 카테고리의 다른 글

[Error] If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.  (0) 2021.03.17
Spring Boot DevTools  (0) 2021.03.17
@ServletComponentScan  (0) 2021.03.16
Filter, Interceptor, AOP  (0) 2021.03.16
Spring DB 연동  (0) 2021.03.12