자바 스프링에서 필터(Filter)는 웹 애플리케이션에서 HTTP 요청과 응답을 가로채고, 특정 로직을 수행하거나 요청/응답을 수정하는데 사용된다. 스프링 필터는 일반적으로 다음과 같은 작업을 수행할 때 사용된다:
- 인증 및 권한 부여: 요청이 특정 리소스에 접근할 권한이 있는지 확인한다.
- 로깅 및 감사: 요청과 응답을 로깅하거나 감사 목적으로 기록한다.
- 데이터 압축: 응답 데이터를 압축하여 클라이언트로 전송한다.
- 데이터 변환: 요청 데이터 또는 응답 데이터를 변환한다.
스프링 필터는 자바 서블릿 필터를 기반으로 하며, javax.servlet.Filter 인터페이스를 구현해야 한다.
1. Filter 인터페이스 구현
먼저, javax.servlet.Filter 인터페이스를 구현하는 필터 클래스를 작성한다. 이 인터페이스에는 세 가지 메서드가 있다:
- init(FilterConfig filterConfig): 필터 초기화 시 호출된다.
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 요청을 필터링할 때 호출된다.
- destroy(): 필터가 제거될 때 호출된다.
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 필터 초기화 로직 (필요시)
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 요청 처리 전 로직
System.out.println("Request received at " + System.currentTimeMillis());
// 다음 필터 또는 서블릿으로 요청 전달
chain.doFilter(request, response);
// 응답 처리 후 로직
System.out.println("Response sent at " + System.currentTimeMillis());
}
@Override
public void destroy() {
// 필터 제거 시 로직 (필요시)
}
}
2. 필터 등록
스프링 부트에서는 @Component 어노테이션을 사용하여 필터를 등록하거나, FilterRegistrationBean을 사용하여 수동으로 등록할 수 있다.
@Component를 사용한 필터 등록
필터 클래스에 @Component 어노테이션을 추가하여 스프링 컨텍스트에 자동으로 등록되도록 한다.
import org.springframework.stereotype.Component;
@Component
public class MyFilter implements Filter {
// 필터 구현 내용
}
FilterRegistrationBean을 사용한 필터 등록
FilterRegistrationBean을 사용하여 필터를 수동으로 등록하고 설정을 추가할 수 있다.
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<MyFilter> loggingFilter() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/api/*"); // 특정 URL 패턴에만 필터 적용
registrationBean.setOrder(1); // 필터 체인에서 필터의 순서 지정
return registrationBean;
}
}
3. 필터 체인 관리
필터 체인에서 필터의 순서를 관리하는 것이 중요하다. FilterRegistrationBean의 setOrder 메서드를 사용하여 필터의 실행 순서를 지정할 수 있다. 순서가 낮을수록 먼저 실행된다.
4. 추가 기능
필터는 종종 다른 스프링 기능과 함께 사용된다. 예를 들어, Spring Security와 통합하여 인증 및 권한 부여 작업을 수행하거나, CORS(Cross-Origin Resource Sharing)를 처리할 수 있다.
Spring Security와 통합
Spring Security는 자체적으로 필터 체인을 관리한다. 따라서 Spring Security를 사용할 경우, SecurityConfigurerAdapter를 확장하여 필터를 추가할 수 있다.
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(new MyFilter(), UsernamePasswordAuthenticationFilter.class);
// 다른 보안 설정
}
}
스프링 필터는 HTTP 요청과 응답을 가로채고, 처리하는 데 강력한 도구이다. 필터를 구현하고 스프링 부트 애플리케이션에 등록하여 다양한 웹 애플리케이션 요구사항을 충족시킬 수 있다. 필터 체인의 순서를 관리하고, 필요에 따라 Spring Security와 같은 다른 스프링 모듈과 통합하여 더욱 복잡한 작업을 수행할 수 있다.