Spring Boot에서 Filter와 Interceptor는 모두 요청(Request)과 응답(Response)을 가로채서 처리할 수 있게 해주는 기능이지만, 역할, 실행 시점, 적용 범위에서 차이가 있습니다. 아래에서 간단 + 예시와 함께 정리해볼게요.
🔹 1. Filter (서블릿 필터)
✅ 개요
- Servlet 스펙에 정의된 기능
- Spring보다 더 하위 레벨
- DispatcherServlet 이전에 실행됨
✅ 사용 예시
- 인증, 인코딩, 로깅, XSS 방어
- 공통 전처리/후처리
✅ 예제
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter: 요청 전");
chain.doFilter(request, response);
System.out.println("Filter: 응답 후");
}
}
🔹 2. Interceptor (스프링 인터셉터)
✅ 개요
- Spring MVC의 기능
- DispatcherServlet 이후에 동작
- 주로 컨트롤러 진입 전/후에 로직 적용
✅ 사용 예시
- 로그인 체크
- 권한 검사
- 요청 로깅
- 공통 응답 가공
✅ 예제
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("Interceptor: 컨트롤러 호출 전");
return true; // false면 컨트롤러로 안 넘어감
}
}
그리고 등록은 이렇게 해야 해요:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/api/**"); // 적용할 경로 지정
}
}
📌 핵심 차이 요약
| 항목 | Filter | Interceptor |
|---|---|---|
| 위치 | Servlet 레벨 | Spring MVC 레벨 |
| 실행 시점 | DispatcherServlet 이전 | DispatcherServlet 이후 |
| 대상 | 모든 요청 (정적 리소스 포함) | 컨트롤러로 가는 요청만 |
| 설정 방식 | Filter 인터페이스 구현 |
HandlerInterceptor 구현 + 등록 |
| 등록 방식 | @Component 또는 FilterRegistrationBean |
WebMvcConfigurer에서 등록 |
| 주로 쓰이는 곳 | 인코딩, 로깅, 보안 | 인증, 권한, 로깅, 응답 조작 |
🙋 요약하자면?
- Filter: 전반적인 요청 흐름 제어 (컨트롤러 이전 단계 포함)
- Interceptor: 컨트롤러 기준으로 요청 전/후 로직 처리
Spring Boot 웹 요청 처리 흐름에서 Filter, Interceptor, 그리고 Controller가 실행되는 순서를 도식처럼 설명해볼게요.
(요청부터 응답까지 전체 흐름 포함!)
🔁 요청 처리 순서 흐름도
클라이언트 요청
↓
[Filter] (서블릿 필터)
↓
DispatcherServlet
↓
[Interceptor - preHandle()]
↓
@Controller (핸들러 메서드)
↓
[Interceptor - postHandle()]
↓
View (템플릿 렌더링 or JSON 응답)
↓
[Interceptor - afterCompletion()]
↓
[Filter] (응답 처리)
↓
클라이언트 응답
🔍 각 단계 설명 요약
| 단계 | 설명 |
|---|---|
| Filter | 모든 요청과 응답을 가장 먼저 가로챔 (정적 리소스 포함) |
| DispatcherServlet | Spring의 중앙 컨트롤러, 요청을 실제 컨트롤러로 전달 |
| Interceptor - preHandle() | 컨트롤러 실행 전 (인증, 권한 확인) |
| Controller | 실제 요청 로직 처리 (예: /api/users) |
| Interceptor - postHandle() | 컨트롤러 실행 후, View 렌더링 전 |
| View | 템플릿 or JSON 응답 생성 |
| Interceptor - afterCompletion() | 응답 완료 후 (예외 처리, 로깅 등) |
| Filter (응답 처리) | 응답 마무리 (헤더 조작 등 가능) |
🎯 예시로 시나리오 설명
예: 사용자가 /api/user를 요청했다고 하면…
- Filter → 로그 찍음
- Interceptor → 로그인 체크
- Controller → 사용자 정보 반환
- Interceptor → 응답 데이터 가공
- Filter → 응답 로그 찍고 마무리