Spring Boot 애플리케이션을 개발하다 보면, HTTP 요청과 응답을 중간에 가로채어 처리해야 하는 경우가 자주 발생한다. 이때 사용하는 대표적인 방법이 바로 Filter와 Interceptor이다. 두 기능 모두 비슷한 역할을 하지만, 동작하는 시점과 활용 목적이 다르기 때문에 그 차이를 명확히 이해하고 적절한 상황에 적용하는 것이 중요하다.
Filter는 서블릿 API의 일부로, Spring의 DispatcherServlet에 도달하기 이전 단계에서 모든 요청을 처리한다. 즉, Spring Framework의 처리 흐름에 진입하기 전에 동작하게 된다.
@Component
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Request received: " + request.getRemoteAddr());
chain.doFilter(request, response); // 다음 필터 또는 서블릿으로 전달
System.out.println("Response sent.");
}
}
Interceptor는 Spring MVC의 구성 요소로, Spring 내부의 DispatcherServlet이 요청을 Controller로 전달하기 전후에 작동한다.
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("Checking authentication...");
return true; // 컨트롤러로 요청 계속 전달
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) {
System.out.println("Controller executed.");
}
}
| 항목 | Filter | Interceptor |
|---|---|---|
| 실행 시점 | DispatcherServlet 이전 | Controller 실행 전/후 |
| 적용 범위 | 모든 요청 (정적 리소스 포함) | Spring MVC Controller 요청 |
| Spring Bean 접근 | ❌ 불가능 | ✅ 가능 |
| 요청 타입 | 전체 HTTP 요청 | Controller 요청만 |
| 요청/응답 수정 | 헤더, 인코딩, 압축 등 가능 | Model, View 수정 가능 (응답 바디 직접 수정은 어려움) |
| 주요 용도 | 보안 필터, 로깅, 인코딩 | 인증, 권한 검사, 컨트롤러 후처리 |
| 구분 | Filter | Interceptor |
|---|---|---|
| 레벨 | 서블릿 레벨 | Spring MVC 레벨 |
| 적용 대상 | 전체 HTTP 요청 | Spring Controller 요청 |
| Spring Bean 접근 | ❌ 불가능 | ✅ 가능 |
| 대표 용도 | 인코딩, 압축, 보안 | 인증, 로깅, 모델 처리 |
Spring Boot에서 HTTP 흐름을 제어해야 할 때 Filter와 Interceptor는 매우 유용한 도구이다. 기능적으로 겹치는 부분도 있지만, 실행 시점과 활용 목적이 분명히 다르기 때문에 상황에 따라 적절하게 선택하여 사용해야 한다.
실무에서는 이 둘을 조합하여 사용하는 경우도 많으므로, 명확한 이해를 바탕으로 설계하는 것이 중요하다.