전체코드는 아래 github을 참고하도록 한다.
github.com/mypiece/springboot-example/tree/master/filter-example
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 클래스에 명시적으로 선언하는 것이
추후 다른 사람이 분석하기에도 수월하게 접근이 가능하기 때문이다.
'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 |