Spring MVC에서 필터(Filter)와 인터셉터(Interceptor)는 둘 다 요청과 응답의 흐름을 가로채어 처리하는 기능을 제공한다. 하지만 동작 시점과 적용 범위에서 차이가 있다.
필터(Filter)는 서블릿(Servlet) 스펙에 정의된 기능으로, DispatcherServlet에 도달하기 전에 요청과 응답을 처리한다. 주로 웹 애플리케이션의 전반적인 요청/응답을 처리하는 데 사용된다.
/* 경로)@WebFilter(urlPatterns = "/*")
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletReponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Request received at: " + new Date());
chain.doFilter(request, response); // 다음 필터나 서블릿으로 요청 전달
}
}
인터셉터(Interceptor)는 Spring MVC 레벨에서 동작하며, 주로 컨트롤러(Controller)에 도달하기 직전/직후에 요청을 가로채어 처리한다.
public class LoggingInterceptor implemenets HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("Before handling the request: " + request.getRequestURI());
return true; // 요청 계속 진행
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object Handler, ModelAndView modelAndView) {
System.out.println("After handling the request");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("After rendering the view");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor());
}
}
| 특징 | 필터 (Filter) | 인터셉터 (Interceptor) |
|---|---|---|
| 실행 위치 | 서블릿 컨테이너 레벨 | Spring MVC DispatcherServlet 내부 |
| 동작 시점 | DispatchServlet 이전/이후 | 컨트롤러 호출 전/후, 뷰 렌더링 이후 |
| 주요 용도 | 공통 기능 적용 (인코딩, 인증, 로깅 등) | 비즈니스 로직 처리 전후의 작업 (권한 체크 등) |
| 적용 범위 | 전체 애플리케이션 요청/응답 | 특정 URL 매핑 또는 컨트롤러 메서드 수준 |
| 설정 방법 | @WebFilter 또는 FilterRegistrationBean | WebMvcConfigurer의 addInterceptors() 사용 |
필터 (Filter) → DispatcherServlet → 인터셉터 (Interceptor) → 컨트롤러 → 인터셉터 (postHandle) → 응답 처리 → 인터셉터 (afterCompletion) → 필터 (Filter) → 클라이언트
필터 (Filter) → 인터셉터 (afterCompletion) → 뷰 렌더링 → 인터셉터 (postHandle) → 컨트롤러 응답 → DispatcherServlet → 필터 (Filter)