기존 필터와 인터셉터의 개념이 좀 모호했는데 좀 자세히 정리해보았다.
필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다.
즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되는 것이고(스프링 빈으로 등록은 된다), 디스패처 서블릿 전/후에 처리하는 것이다.
HandlerInterceptor
는 특정한 URI 호출을 '가로채는' 역할을 한다고 생각하자. 이를 이용하여 기존 컨트롤러의 로직을 수정하지 않고도, 사전이나 사후 제어가 가능하다.
HandlerInterceptor
메소드의 메소드에는 다음 3가지가 정의 되어있다.
preHandle(request, response, handler)
postHandle(request, response, handler, modelAndView)
afterCompletion(request, reponse, handler, exception)
그러면 필터와 인터셉터의 차이는 무엇일까?
두 기능 모두 특정 URI에 접근할 때 제어하는 용도로 사용되긴 한다. 두 기능의 가장 큰 차이는 Context(실행 영역)에 있다고 할 수 있다.
필터는 웹 어플리케이션 내에서 동작하기 때문에 Spring Context에 접근하기 어려운 반면 인터셉터의 경우 Spring 영역 내에서 동작하기 때문에, Spring Context에 접근하기 용이하다.