
Spring에서 Filter와 Interceptor는 HTTP 요청을 가로채고 처리하는 데 사용되지만, 그 동작 방식과 적용 범위에서 몇 가지 차이가 있다.
Filter는 Servlet API의 일부이며, 요청과 응답을 변환하거나 가로채는 데 사용된다. Spring에서도 Servlet 필터를 지원한다.
@WebFilter 어노테이션.FilterRegistrationBean을 사용하여 Spring Bean으로 등록.@Component
public class CustomFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
System.out.println("CustomFilter: Request URI is " + httpRequest.getRequestURI());
// 요청 처리 후 다음 필터로 전달
chain.doFilter(request, response);
// 응답 처리
System.out.println("CustomFilter: Response completed");
}
}
Interceptor는 Spring MVC의 HandlerInterceptor 인터페이스를 구현한 클래스이다. 주로 컨트롤러 로직 전후를 제어할 때 사용된다.
WebMvcConfigurer를 통해 등록.@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("CustomInterceptor: Before Controller");
return true; // true: 다음 단계 진행, false: 요청 처리 중단
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
System.out.println("CustomInterceptor: After Controller but before View");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("CustomInterceptor: After View Rendered");
}
}
| 구분 | Filter | Interceptor |
|---|---|---|
| 레벨 | Servlet 레벨에서 동작 | Spring MVC 레벨에서 동작 |
| 사용 목적 | 요청/응답 전반적인 처리 (헤더, 본문 등) | 핸들러(컨트롤러) 호출 전후 제어 |
| 작동 시점 | DispatcherServlet 전후 | DispatcherServlet 이후 |
| 구현 인터페이스 | javax.servlet.Filter | HandlerInterceptor |
| 주요 용도 | 인증/인가, 요청 변환, 로깅 | 컨트롤러 전/후 공통 로직 처리 |
| Spring 의존성 | Spring에 의존하지 않음 | Spring MVC와 밀접히 연관 |
| 등록 방법 | @WebFilter 또는 FilterRegistrationBean | WebMvcConfigurer를 통한 등록 |
Filter와 Interceptor는 함께 사용할 수 있다. 이 경우 Filter가 먼저 실행되고, 그다음 Interceptor가 실행된다.
필터는 더 범용적이고, 인터셉터는 더 구체적으로 Spring MVC 로직을 다룬다는 점에서 차이가 있다.
필터와 인터셉터는 역할과 책임이 명확히 구분되기 때문에 둘 중 하나만 사용하기보다 각자의 특성을 살려 적합한 경우에 사용하는 것이 더 효과적이다. 인터셉터로 대부분의 로직을 처리할 수 있을 것 같아 보이지만, 필터가 필요한 경우도 많다. 다음은 필터와 인터셉터를 따로 사용하는 이유를 설명한다.
이 두 가지를 분리함으로써 역할이 명확해지고, 시스템 설계가 더 유연하며 유지보수도 쉬워진다.
필터를 사용하지 않고 인터셉터만으로 모든 로직을 처리하려 하면 HTTP 레벨의 세부 작업을 처리할 수 없어 한계에 봉착할 수 있다.