[스프링부트] 29. Filter

문정준's avatar
Apr 23, 2025
[스프링부트] 29. Filter

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 ) 를 찾음
 
 
notion image
 
 

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

sxias