
Filter란 DispatcherServlet 외부에서 동작하며 HTTP 요청 및 응답을 가로채 추가 작업을 수행할 수 있도록 지원하는 인터페이스입니다. 즉, Spring MVC 내부 로직에 들어가기 전 또는 응답이 클라이언트에게 반환되기 전 특정 작업을 수행할 수 있습니다.
Filter는 다음과 같이 init(), doFilter(), destory() 3개의 메서드로 구성되어 있으며, init()과 destory()는 Default 키워드가 선언되어 있어 구현에 대한 강제성은 없습니다.

Filter를 사용하는 방법은 다음과 같습니다.
Filter 인터페이스를 직접 구현하는 방법으로, 다음 예시와 같이 사용할 수 있습니다.

@WebFilter@WebFilter 어노테이션을 사용하는 방법으로, 다음 예시와 같이 사용할 수 있습니다.

Spring Security는 다양한 Filter를 제공하는데, 그중 하나인 OncePerRequestFilter를 사용하여 다음과 같이 구현할 수 있습니다.

Interceptor란 DispatcherServlet 내부에서 동작하며 HTTP 요청 및 응답을 가로채 추가 작업을 수행할 수 있도록 지원하는 인터페이스입니다. 즉, Controller 실행 전과 후에 특정 작업을 수행할 수 있습니다.
Interceptor는 다음과 같이 preHandle(), postHandle(), afterCompletion() 3개의 메서드로 구성되어 있습니다.

Interceptor를 사용하는 방법은 다음과 같습니다.
HandlerInterceptor 또는 WebRequestInterceptor 등을 구현하는 방식으로, 다음 예시와 같이 사용할 수 있습니다.

Filter와 달리 Interceptor는 여러개 사용할 경우 다음 예시와 같이 preHandle()은 정방향 순서로 작동합니다. 하지만, postHandle(), afterCompletion()의 경우 역방향 순서로 작동하게 됩니다.

Filter와 Interceptor 둘 다 요청이나 응답을 가로채 사용자가 정의한 특정 작업을 수행하려는 목적은 동일하지만, 다음과 같은 차이를 가지고 있습니다.
| 특징 | Filter | Interceptor |
|---|---|---|
| 동작 위치 | DispatcherServlet 외부 | DispatcherServlet 내부 |
| 적용 범위 | 모든 요청 처리 가능 | Spring MVC 요청만 처리 |
| Spring 예외 처리 | 불가능 | 가능 |
| Request/Response 객체 조작 | 가능 | 불가능 |
| Spring Context 접근 | 가능하지만 복잡함 | 가능 |
아래는 위 개념을 공부하면서 추가 학습이 필요할 것 같은 내용들입니다. 이 내용들은 차차 정리하여 링크를 달도록 하겠습니다.
둘 다 HTTP 요청이나 응답을 가로채 특정 작업을 수행하기 위한 목적은 동일하지만, Filter는 DispatcherServlet 외부 영역에서 Interceptor는 DispatcherServlet 내부 영역에서 동작한다는 차이점이 있습니다.
아닙니다. preHandle()의 경우 Interceptor 등록 순서와 일치하지만, postHandle(), afterCompletion()의 경우 등록 순서와 반대로 동작합니다.