Filter
: J2EE 표준 스펙을 구현한 기술이다. 톰캣과 같은 웹 컨테이너에 의해 관리된다.Interceptor
: 스프링에서 제공하는 기술이다. 디스패처 서블릿이 컨트롤러를 호출하기 전과 후에 응답을 참조하거나 가공한다.관리되는 컨테이너가 각각 웹 컨테이너와 스프링 컨테이너이다.
Filter
doFilter()
: 요청이 디스패처 서블릿에 전달되기 전에 수행된다.doFilter()
: 응답이 디스패처 서블릿을 거치고 난 이후에 수행된다.Interceptor
preHandle()
: 요청이 디스패처 서블릿에 전달된 이후에 수행된다.postHandle()
: 응답이 디스패처 서블릿을 거치기 전에 수행된다.필터는 Request
, Response
객체 자체를 조작할 수 있다. 반면에 인터셉터는 불가능하다. 이를 조작할 수 있다는 것은 다른 객체로 변경하여 전달할 수 있다는 뜻이다.
public class CustomFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// 조작된 request, response 로 doFilter() 의 호출이 가능하다.
chain.doFilter(request, response);
}
}
public class MyInterceptor implements HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// true, false 만 반환 가능하다.
return true;
}
}
Filter
는 스프링과 분리되어야 하는 기능을 적용 가능하다.
Interceptor
는 스프링과 연관이 많은 작업을 하기 쉽다.
사실상 둘 다 빈으로 등록이 가능하다고 보는 것이 맞다.
Interceptor
는 당연히 스프링에서 제공하는 기술이기에 빈 등록이 가능하다.
Filter
는 서블릿에서 제공하지만, 스프링에서 제공하는 DelegatingFilterProxy
로 프록시 필터 형태로 빈 등록이 가능하다.
스프링 부트에서는 내장 톰캣을 이용해 서블릿 컨테이너까지 스프링 부트가 제어하게 되므로 DelegatingFilterProxy 로 감싸서 등록할 필요도 없다.