FilterRegistrationBean

calis_ws·2024년 1월 1일
1
post-thumbnail

Filter 란?

서블릿 컨테이너에서 클라이언트의 요청이 서블릿에 도달하기 전이나 후에 그 요청 및 응답을 변경하거나 검사할 수 있는 자바 클래스

ex ) 로깅, 보안 체크, 데이터 압축, 문자 인코딩 변환 등의 작업

Bean 으로 등록할 수 없는 이유

  1. IoC Container 는 서블릿 컨테이너의 외부에 위치하며, 서로 다른 라이프사이클을 가진다.

  2. IoC Container 와 서블릿 컨테이너의 결합을 위해 추가적인 설정이 필요하다.

  3. IoC Container의 Bean은 Spring이 직접 초기화하고 라이프사이클 관리를 한다. 그러나 서블릿 필터는 서블릿 컨테이너에서 관리되므로 Bean으로 등록되지 않으면 서블릿 컨테이너에서 필터의 라이프사이클을 관리할 수 없다.

이미지 출처 : https://jojoldu.tistory.com/28

Bean 으로 등록하고 관리하려면?

FilterRegistrationBean 을 사용하여 서블릿 필터를 IoC Container 에서 Bean으로 등록할 수 있다

  • 이로써 필터도 Spring 의 라이프사이클 관리와 의존성 주입을 받을 수 있다.

  • JavaConfig를 통해 필터를 프로그래밍적으로 등록하고 설정할 수 있다.

  • 선언적인 설정보다 코드를 통한 설정이 더 유연하며, 필터의 동작을 자세히 제어할 수 있다.

  • URL 패턴을 지정하여 특정 경로에만 필터를 적용하거나, 실행 순서를 조절하는 등의 설정이 가능하다.

주로 HTTP 요청 및 응답의 문자 인코딩을 변경하는 데 활용하는 인코딩 필터

public class EncodingFilter implements Filter {

    private String encoding = "UTF-8";  // 기본 인코딩 설정

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    	// FilterConfig를 통해 초기화 파라미터를 읽어들일 수 있음
        String encodingParam = filterConfig.getInitParameter("encoding");
        
        if (encodingParam != null) {
            // 인코딩 설정
            encoding = encodingParam;
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 요청과 응답에 대한 인코딩 설정
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);

        // 다음 필터로 체인을 전달
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 필터 종료 작업
    }
}
  1. Filter 인터페이스를 구현하여 사용자 정의 필터 클래스 EncodingFilter를 작성

  2. init 메서드에서 필터 초기화 시 수행할 작업을 정의. 여기서는 인코딩을 설정할 수 있도록 초기화 파라미터를 읽어들인다.

  3. doFilter 메서드에서 실제 필터 동작을 정의. 이 예시에서는 요청과 응답에 대한 인코딩을 설정하고, 그 다음 필터 체인에 계속 진행한다.

  4. destroy 메서드에서 필터 종료 시 수행할 작업을 정의

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<EncodingFilter> encodingFilter() {
        FilterRegistrationBean<EncodingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new EncodingFilter());
        registrationBean.addUrlPatterns("/*");  // 모든 URL 패턴에 대해 동작
        registrationBean.setInitParameters(Collections.singletonMap("encoding", "UTF-8"));  // 필터의 초기화 파라미터 설정
        return registrationBean;
    }
}
  1. @Configuration 어노테이션을 사용하여 스프링 구성 클래스 FilterConfig를 작성

  2. @Bean 어노테이션을 사용하여 FilterRegistrationBean을 반환하는 메서드를 작성

  3. FilterRegistrationBean 에는 등록할 필터 (EncodingFilter)와 해당 필터가 동작할 URL 패턴, 초기화 파라미터 등을 설정


정리

서블릿 필터를 IoC Container 에서 빈으로 등록하려면 Spring이 필터의 초기화와 실행을 제어할 수 있도록 FilterRegistrationBean 같은 메커니즘을 사용해야 한다.

이를 통해 Spring과 서블릿 컨테이너 간의 통합이 이루어져야 하며, 서블릿 필터가 정상적으로 빈으로 등록되고 실행될 수 있다.

profile
반갑습니다람지

0개의 댓글