스프링 인터셉터(Interceptor)와 필터(Filter)는 웹 요청 처리 과정에서 사용되지만, 적용 시점, 범위, 기능 등에서 차이가 있습니다. 아래에 주요 차이점을 정리해드립니다.
1. 적용 시점과 위치
| 구분 | 필터(Filter) | 인터셉터(Interceptor) |
|---|
| 적용 영역 | 서블릿 컨테이너(스프링 밖) | 스프링 컨텍스트(DispatcherServlet 내부) |
| 실행 시점 | DispatcherServlet 이전에 동작 | DispatcherServlet 이후, 컨트롤러 진입 전/후에 동작 |
| 실행 순서 | 필터 → DispatcherServlet → 인터셉터 | 필터보다 나중에 실행 |
- 필터: 모든 요청이 서블릿에 도달하기 전에 동작 (예: 인코딩, 보안)
- 인터셉터: 스프링 MVC의 컨트롤러 호출 전/후, 뷰 렌더링 후에 동작 (예: 로깅, 권한 체크)
2. 설정 방식
| 구분 | 필터 | 인터셉터 |
|---|
| 등록 방법 | web.xml 또는 FilterRegistrationBean | WebMvcConfigurer의 addInterceptors() |
| 예시 코드 | ```java | ```java |
| @Bean | @Override |
| public FilterRegistrationBean myFilter() { | public void addInterceptors(...) { |
| FilterRegistrationBean reg = new ...; | registry.addInterceptor(new MyInterceptor()) |
| reg.addUrlPatterns("/*"); | .addPathPatterns("/admin/**"); |
| return reg; | } |
| } | ``` |
| ``` | |
3. 기능과 제어 범위
| 구분 | 필터 | 인터셉터 |
|---|
| 요청/응답 제어 | 요청/응답 객체를 변형 가능 (ServletRequestWrapper) | 기존 객체를 그대로 사용 (변형 불가) |
| 스프링 빈 주입 | 불가 (의존성 주입 어려움) | 가능 (스프링 빈으로 등록 가능) |
| 예외 처리 | 서블릿 단계에서 처리 | 컨트롤러 계층의 예외 처리 (예: @ExceptionHandler) 활용 가능 |
| URL 패턴 정밀도 | 서블릿 규격의 단순 패턴 (예: /*) | Ant 스타일 세부 패턴 (예: /admin/**) |
4. 인터셉터의 세부 동작 시점
인터셉터는 3가지 메서드로 세밀한 제어가 가능합니다:
1. preHandle: 컨트롤러 실행 전 (인증/인가 체크)
2. postHandle: 컨트롤러 실행 후 (모델 데이터 수정)
3. afterCompletion: 뷰 렌더링 후 (자원 정리)
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, ...) {
return true;
}
@Override
public void postHandle(...) {
}
@Override
public void afterCompletion(...) {
}
}
5. 사용 사례
| 필터 | 인터셉터 |
|---|
| - 크로스 사이트 스크립팅(XSS) 방어 | - 세션/인증 체크 |
| - 요청 데이터 압축 해제 | - API 호출 로깅 |
| - 공통 보안 헤더 추가 (CORS 등) | - 실행 시간 측정 |
| - 모든 요청에 대한 로깅 | - 컨트롤러 전/후 부가 작업 |
6. 선택 가이드
- 필터를 선택할 때:
- 서블릿 수준의 전역 처리 (예: 보안, 인코딩)
- 스프링과 무관한 기능이 필요할 때
- 인터셉터를 선택할 때:
- 스프링 빈 주입이 필요할 때
- 컨트롤러 실행 전/후의 세밀한 제어가 필요할 때
요약
- 필터는 서블릿 수준에서 전역적으로 적용되며, DispatcherServlet 진입 전에 동작합니다.
- 인터셉터는 스프링 MVC의 컨텍스트 내에서 세부적인 요청 흐름을 제어합니다.
- 실행 순서:
Filter1 → Filter2 → DispatcherServlet → Interceptor1 → Interceptor2 → Controller