Filter 와 Interceptor의 차이란?
Filter와 Interceptor의 차이에 대해 찾아보고 공부하면서 작성한 글입니다. 내용 중 잘못된 내용이 있다면 짚어주세요~
Filter
Filter는 자원에 대한 요청, 자원에 대한 응답에 대하여 필터링을 수행하는 객체이다.
init(), destroy()를 이용해 생성과 소멸 시 필요한 행동을 취할 수 있으며, doFilter() 메서드를 통해 요청과 응답을 다음 루틴으로 전송한다.
Tomcat javax.servlet 패키지에 구현되어 있으며 web.xml에서 Web Application에 등록한다 (당연히 Tomcat이 제공하는 클래스니까!).
등록방법
-
<filter>
<filter-name>
: 등록할 필터의 이름을 지정한다<filter-class>
: 등록한 필터 클래스를 지정한다
-
<filter-mapping>
<filter-name>
: url과 매핑 시키고 싶은 필터의 이름을 지정한다. 이때 필터의 이름은 filter태그에서 지정한 이름을 입력한다.<url-pattern>
: 매핑시키고싶은 url을 지정한다.
Interceptor
Interceptor는 Controller에 들어오는 요청 HttpRequest와 응답 HttpResponse를 가로채는 역할을 하는 객체이다.
Handler를 실행하기 전 (preHandle()) 후 (postHandle()), view를 렌더링 한 후(afterCompletion()) 실행할 수 있다는것이 장점이다.
Interceptor가 작업을 처리 중 Exception이 발생한다면 @ControllerAdvice 어노테이션을 통해 예외처리를 해줄 수 있다.
Filter와 Interceptor의 차이점
1. 호출시점
- Filter: DispatcherServlet 실행 전
- Interceptor: DispatcherServlet 실행 후
2. 설정 위치
- Filter: web.xml에 등록
- Interceptor: ApplicationContext에 등록
실제 적용에서의 차이점
스프링 HandlerInterceptor documentation에서는 Filter를 더 강력한 도구로 표현하고 있다.
Filter는 request와 response를 교체시켜 제공할 수 있기 때문이고, 실제로 자주 사용된다고 한다. 쓰임에 대해서는 Filter와 같은 경우 Request content나 View Content에 적합하다. 예를 들어 multipart form이나 GZIP 압축 지정에 사용된다. 필터마다 특정 content-type에 매핑시켜 필요에 맞게 자주 사용한다.
Interceptor는 들어온 요청에 대해 공통 핸들러 또는 권한을 체크하는데 정제하여 사용하는 것이 좋다. 또한 View를 렌더링 하기 전후로 작업을 할당할 수 있다는 것이 장점이다. 권한에 따라 다른 view를 렌더링 해야 하는 경우에 말이다.
참고자료
- https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html#postHandle-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-java.lang.Object-org.springframework.web.servlet.ModelAndView-
- http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html
- https://stackoverflow.com/questions/35856454/difference-between-interceptor-and-filter-in-spring-mvc
- https://supawer0728.github.io/2018/04/04/spring-filter-interceptor/
- https://goddaehee.tistory.com/154
- https://lemontia.tistory.com/648