Interceptor와 Filter는 요청 처리 과정에서 공통 작업을 수행하기 위해 사용된다. 하지만 두 개념은 서로 다른 용도와 실행 범위를 가진다.
필터는 Servlet 레벨에서 동작하며, 요청이 DispatcherServlet에 도달하기 전에 처리된다.
Filter 동작 흐름
1. 클라이언트 요청 -> Filter -> DispatcherServlet -> 컨트롤러
2. 컨트롤러 응답 -> DispatcherServlet -> Filter -> 클라이언트 반환
@Component
public class CustomFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 요청 전 처리
System.out.println("Filter: 요청 전 처리");
chain.doFilter(request, response); // 다음 필터로 전달 (또는 DispatcherServlet)
// 응답 후 처리
System.out.println("Filter: 응답 후 처리");
}
}
인터셉터는 Spring MVC 레벨에서 동작하며, DispatcherServlet이 요청을 컨트롤러로 전달하기 전후를 가로챈다. HandlerInterceptor 인터페이스를 구현하여 사용한다.
Interceptor 동작 흐름
1. 클라이언트 요청 -> DispatcherServlet -> Interceptor -> 컨트롤러
2. 컨트롤러 응답 -> Interceptor -> DispatcherServlet -> 클라이언트 반환
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 요청 전 처리
System.out.println("Interceptor: 요청 전 처리");
return true; // true: 요청 진행, false: 요청 차단
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 컨트롤러 처리 후, 뷰 렌더링 전
System.out.println("Interceptor: 컨트롤러 처리 후");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 뷰 렌더링 후
System.out.println("Interceptor: 뷰 렌더링 후");
}
}
구분 | Filter | Interceptor |
---|---|---|
레벨 | Servlet | Spring MVC |
진입 시점 | DispatcherServlet 이전 | DispatcherServlet 이후 |
목적 | 전역적인 요청/응답 처리 | 컨트롤러와 관련된 요청 전/후 처리 |
주요 기능 | 인코딩, 보안, CORS, 요청/응답 로깅 | 권한 체크, 세션 관리, 로깅, 비즈니스 처리 |
적용 대상 | 모든 요청 | 특정 URL 패턴에 맞는 요청 |
기술 스펙 | Java EE 표준 | Spring MVC 전용 |
Filter와 Interceptor는 동시에 사용할 수 있다.
Filter는 전역적인 작업(인증 토큰 확인)에 사용하고, Interceptor는 비즈니스 로직 중심의 작업(사용자 역할에 따른 권한 확인)에 활용할 수 있다.
Filter -> DispatcherServlet -> Interceptor -> 컨트롤러
반환은 역순으로 실행된다.
결론적으로 Filter와 Interceptor는 비슷해 보이지만, 용도와 적용 범위가 다르다
전역적인 작업은 Filter, 컨트롤러 관련 작업은 Interceptor를 이용하면 좋다고 생각한다.