Spring에서 Interceptor와 Filter는 요청(Request)와 응답(Response)을 가로채서 공통 처리를 할 수 있게 해주는 기능입니다.
둘은 비슷하지만 동작 시점과 목적이 다릅니다.
✅ 한눈에 보기: Filter vs Interceptor
항목 Filter Interceptor
| 소속 | 서블릿(Servlet) 스펙 | Spring MVC |
| 실행 시점 | DispatcherServlet 이전 | DispatcherServlet 이후 |
| 대상 | 모든 요청 (*.css, *.js, /api, 등 포함) | 컨트롤러 요청 (@Controller만) |
| 구현 방식 | javax.servlet.Filter 구현 | HandlerInterceptor 구현 |
| 사용 목적 | 인코딩, CORS, 보안, 인증 등 전역 처리 | 로그인 체크, 권한 체크, 로깅 등 컨트롤러 전용 처리 |
| 설정 위치 | WebFilter, FilterRegistrationBean 등 | WebMvcConfigurer의 addInterceptors() |
✅ 1. Filter (필터)
- Servlet 기반 동작 → Spring이 아닌 일반 Java 웹앱에서도 사용 가능
- 클라이언트 요청 → 필터 → DispatcherServlet
- 정적 리소스도 필터링 가능
📌 예시: 로그인 체크용 Filter
@Component
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String uri = req.getRequestURI();
if (uri.startsWith("/admin") && req.getSession().getAttribute("loginUser") == null) {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect("/login");
return;
}
chain.doFilter(request, response); // 다음 필터 or 서블릿으로 전달
}
}
✅ 2. Interceptor (인터셉터)
- Spring MVC 전용 기능
- DispatcherServlet에서 컨트롤러를 호출하기 직전/직후에 개입
- 주로 컨트롤러 진입 전/후 처리가 필요한 경우 사용
📌 인터셉터 구현
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession();
if (session.getAttribute("loginUser") == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
📌 등록 방법 (WebMvcConfigurer)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginCheckInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/login", "/css/**");
}
}
✅ 동작 순서 비교
클라이언트 요청
↓
[Filter] (서블릿 전역 처리)
↓
DispatcherServlet
↓
[Interceptor - preHandle()] (컨트롤러 전)
↓
@Controller
↓
[Interceptor - postHandle()] (컨트롤러 후)
↓
View Resolver
↓
[Interceptor - afterCompletion()] (뷰 렌더링 후)
↓
응답
✅ 정리 요약
구분 Filter Interceptor
| 동작 위치 | DispatcherServlet 이전 | DispatcherServlet 이후, 컨트롤러 전후 |
| 사용 목적 | 전역 요청 필터링 (보안, 인코딩, 로깅 등) | 컨트롤러 로직에 대한 사전/사후 처리 |
| 정적 리소스 처리 | O | X |
| 요청 정보 접근 | ServletRequest | HttpServletRequest |
| 설정 위치 | FilterChain | WebMvcConfigurer |
✅ 실제 사용 예시
기능 추천 방식
| 인코딩 설정 (UTF-8) | Filter |
| 인증 토큰 검사 (JWT 등) | Filter or Interceptor |
| 로그인 세션 체크 | Interceptor |
| 요청 로깅 | Interceptor (또는 AOP) |
| 정적 리소스 차단 | Filter |
'탐구하기' 카테고리의 다른 글
| Dispatcher Servlet은 무엇일까? (0) | 2025.07.02 |
|---|---|
| @Controller와 @RestController의 차이점 (0) | 2025.07.01 |
| JPA와 MyBatis의 차이점 (0) | 2025.07.01 |
| JPA란 무엇일까? (0) | 2025.07.01 |
| MyBatis란 무엇일까? (0) | 2025.06.30 |