필터 사용법
Filter, FilterRegistrationBean
jakarta.servlet.Filter 인터페이스 구현 + @Component 등록
이 방법은 jakarta.servlet.Filter 인터페이스를 구현한 클래스를 작성하고, Spring의 @Component 어노테이션을 사용하여 자동으로 빈으로 등록하는 방식입니다.
import jakarta.servlet.*;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class SimpleLoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Simple Logging Filter executed");
chain.doFilter(request, response);
}
}
- 간단한 설정
- @Component를 붙이는 것만으로 Spring이 자동으로 필터를 등록.
- 별도의 설정 클래스나 빈 정의 없이 빠르게 구현 가능.
- Spring 컨텍스트 통합
- Spring의 의존성 주입(@Autowired)을 사용하여 다른 빈(서비스, 리포지토리 등)에 쉽게 접근 가능.
- 제한된 설정 유연성
- 모든 요청(/*)에 기본적으로 적용됨.
- 필터의 실행 순서(order)나 URL 패턴을 코드 내에서 직접 지정할 수 없음. @Order 어노테이션으로 순서를 조정할 수 있지만, 복잡한 설정은 불가능.
- 복잡한 필터 체인 관리 어려움
- 여러 필터를 등록할 경우 순서나 조건을 관리하기 어려움.
- 재사용성 제한
- 특정 필터를 특정 URL 패턴에만 적용하거나 동적으로 활성화/비활성화하려면 추가 작업 필요.
적합한 사용 사례
- 간단한 로깅, 인증, 또는 모든 요청에 공통적으로 적용되는 필터.
- 복잡한 필터 설정(예: 특정 URL 패턴, 순서 조정)이 필요 없는 프로젝트.
FilterRegistrationBean을 사용한 등록
FilterRegistrationBean을 사용하여 필터를 명시적으로 등록하고, 실행 순서, URL 패턴, 활성화 여부 등을 세밀하게 설정하는 방식입니다.
import jakarta.servlet.Filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<SimpleLoggingFilter> loggingFilter() {
FilterRegistrationBean<SimpleLoggingFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new SimpleLoggingFilter());
registrationBean.addUrlPatterns("/api/*"); // 특정 URL 패턴에만 적용
registrationBean.setOrder(1); // 실행 순서 지정
registrationBean.setEnabled(true); // 필터 활성화/비활성화
return registrationBean;
}
}
@Component
class SimpleLoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Configured Logging Filter executed");
chain.doFilter(request, response);
}
}
높은 설정 유연성
- addUrlPatterns로 특정 URL 패턴에만 필터 적용 가능.
- setOrder로 필터 실행 순서 정확히 제어.
- setEnabled로 동적으로 필터 활성화/비활성화 가능.
- 복잡한 필터 체인 관리 용이
- 여러 필터를 등록하고 순서나 조건을 명시적으로 관리 가능.
- Spring Security 필터 체인과의 통합이 쉬움.
- 재사용 및 유지보수 용이
- 필터를 별도의 빈으로 관리하므로 설정 변경이 쉬움.
- 환경별로 다른 설정(예: 개발/운영 환경)을 적용 가능.
- 복잡한 설정
- 별도의 설정 클래스와 FilterRegistrationBean 정의 필요.
- 간단한 필터 구현에는 코드량이 많아질 수 있음.
- 수동 등록 필요
- @Component처럼 자동 등록되지 않으므로, 명시적으로 빈을 정의해야 함.
- 실수로 필터를 중복 등록하거나 설정을 잘못할 가능성 있음.
- Spring 컨텍스트 접근 제한
- FilterRegistrationBean에서 생성한 Filter 인스턴스는 기본적으로 Spring 빈이 아니므로, @Autowired를 사용하려면 추가 설정(예: @Component와 함께 사용) 필요.
적합한 사용 사례
- 특정 URL 패턴(예: /api/*)에만 필터를 적용해야 하는 경우.
- 여러 필터의 실행 순서를 명확히 제어해야 하는 경우.
- Spring Security와 통합하거나 복잡한 필터 체인을 구성하는 경우.
- 환경별로 필터 설정을 동적으로 변경해야 하는 경우.