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와 통합하거나 복잡한 필터 체인을 구성하는 경우.
  • 환경별로 필터 설정을 동적으로 변경해야 하는 경우.