WAS에서 Rest API 또는 Servlet 호출 시 앞단에 처리해야할 행동에 대해 'Interceptor'와 'Filter'라는 전처리 및 후처리 기능을 사용하고 있다. 그럼 이 두 가지 기능의 차이점은 무엇이며 어떤 상황일 때 써야 할까?
먼저 이 둘의 정의를 알아보자.
필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.
디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다.
즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되는 것이고(스프링 빈으로 등록은 된다), 디스패처 서블릿 전/후에 처리하는 것이다. 이러한 과정을 그림으로 표현하면 다음과 같다.
인터셉터(Interceptor)는 Spring이 제공하는 기술로써, 디스패처 서블릿(Dispatcher Servlet)와 컨트롤러 사이에서 요청과 응답 값을 보거나 검사할 수 있다. 웹 컨테이너에서 동작하는 필터와 달리 인터셉터는 스프링 컨텍스트에서 동작을 하는 것이다.
디스패처 서블릿은 핸들러 매핑을 통해 적절한 컨트롤러를 찾도록 요청하는데, 그 결과로 실행 체인(HandlerExecutionChain)을 돌려준다. 그래서 이 실행 체인은 1개 이상의 인터셉터가 등록되어 있다면 순차적으로 인터셉터들을 거쳐 컨트롤러가 실행되도록 하고, 인터셉터가 없다면 바로 컨트롤러를 실행한다.
인터셉터는 스프링 컨테이너 내에서 동작하므로 필터를 거쳐 프론트 컨트롤러인 디스패처 서블릿이 요청을 받은 이후에 동작하게 되는데, 이러한 과정을 그림으로 표현하면 다음과 같다.
필터와 인터셉터의 가장 큰 차이점은 Request와 Response의 조작 가능 여부이다. 아래 그림과 같이 Filter의 경우 HttpServlet 값 들을 조작가능하나 인터셉터는 조작이 불가능하다.