1. Filter
- DispatcherServlet에 진입하기 전에 클라이언트의 요청 및 응답을 제어하는 구간
- Spring 외부의 공간이라 Spring 함수 사용 불가
2. Filter vs Interceptor vs AOP
Filter
- 서버의 진입로에서 클라이언트의 접근을 처리
- 클라이언트의 상태에 상관 없이 동일한 행동을 수행
- Spring 외부 : Spring의 도움을 받을 수 없고, DB 접근도 불가
Interceptor
- 서버 내부에서 클라이언트의 요청 및 응답을 처리
- 클라이언트의 상태에 상관 없이 동일한 행동을 수행
- Spring 내부 : Spring 함수 사용 가능, DB에 접근 가능
AOP
- 서버 내부에서 클라이언트의 요청 및 응답을 처리
- 클라이언트의 상태에 따라 다른 동작을 수행 (클라이언트를 분석 가능)
- Spring 내부 : Spring 함수 사용 가능, DB에 접근 가능
- LogFilter
@WebFilter("/*")
public class LogFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter working-------------------------------------");
// HttpServletResponse resp = (HttpServletResponse) servletResponse; // downcasting
// servletResponse.getWriter().println("Hello world");
filterChain.doFilter(servletRequest, servletResponse);
}
}
- main에서 @ServletComponentScan 어노테이션 추가 : ServletComponent ( Filter ) 를 찾음

Bean 활용
- Spring 밖에 있는 Filter의 제어권을 확장하기 위해, Configuration을 통해 Spring에서 외부의 Filter를 자동으로 설정
- 이와 같은 디자인 패턴을 Delegate 패턴이라고 함
- Filter의 기능을 Spring이 대신 수행하는 것이 아닌, Spring의 요청 전 처리를 Filter에게 위임시킴
- Filter는 Filter의 기능을 수행하면서도 Spring의 기능을 일부 사용 가능 (DB 접근 가능 등)
- FilterConfig
@RequiredArgsConstructor
@Configuration
public class FilterConfig {
private final UserRepository userRepository;
@Bean
public FilterRegistrationBean<LogFilter> loggingFilter() {
FilterRegistrationBean<LogFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new LogFilter(userRepository));
registrationBean.addUrlPatterns("/*"); // 모든 요청에 적용
registrationBean.setOrder(1); // 필터 순서 설정
return registrationBean;
}
}
Share article