본문 바로가기

프로그래밍/Spring

Filter & Interceptor

Filter, Interceptor



웹 프로그래밍을 하다보면 컨트롤러에 도달하기전 전처리가 필요한 경우가 있다. 

후처리일수도 있고..


가령.. 

회원 인증 여부를 체크하고 싶다던가,

개인정보 보호를 위해 로그 기능을 끄고 싶다던가..

권한 체크..

Cross Site Script(XSS) 방어..

PC/Mobile web 분기..

인코딩 변환... 등등등


공통적인 기능들은 각 컨트롤러에서 할게 아니라 전처리 또는 후처리를 해주면 매우 좋다. 



그럼 컨트롤러에 도달하기 전에 어떤 레이어가 있을까?

Spring MVC life cycle를 검색해보면 아래와 같은 그림을 볼 수 있다. 



출처: https://all-record.tistory.com/164 [세상의 모든 기록]>




Request가 들어오면 Filter를 맨 먼저 거친다.


그런 뒤 DispatcherServletHandlerMapping을 통해 Request에 해당하는 Controller를 찾는다.


찾은 뒤, Handler Adapter에 Controller 정보를 전달한다.


Handler Adapter는 Controller를 호출한다. 


Controller는 Request를 처리한다. 해당하는 Service를 호출하고 필요한 경우 Database에도 접근한다. 


처리된 결과는 Model에 담기게 되고 View의 정보는 Handler Adapter에 전달된다. 


View Resolver에서 View를 찾는다.


DispatcherServlet이 찾은 View를 전달한다.





어라?


Interceptor가 빠졌다. 

아래 그림을 보자. 



< https://justforchangesake.wordpress.com/2014/05/07/spring-mvc-request-life-cycle/>



위에 있는 그림과 유사한데, Interceptor는 DispatcherServlet과 Handler사이에 존재하는 걸 볼 수 있다.





Filter는 Web Application에 등록되고

Interceptor는 Spring의 Context에 등록된다. 

호출 시점이 다르다. 


Filter는 Servlet에서 처리되기 전/후를 다룰 때 좋다.

Interceptor는 Handler 실행 전/후, View가 랜더링 된 후 등 실행 시점이 다양하다.

(preHandler, postHandler, afterCompletion...)



예외를 전역적으로 처리하고 싶다면?

Interceptor는 프레임워크 내 영역에 존재하기 때문에 @ControllerAdvice, @ExceptionHandler를 사용할 수 있다. 

즉, Interceptor에서 처리하면 좋다.


게다가 AOP를 적용해 볼 수도 있다. 



그럼 Filter는 언제 쓰면 좋냐?

기본적으로는 한글 처리를 위한 인코딩에 쓰인다. 









잠깐.. AOP는 뭐더라?

주로 Transaction, logging, error 처리 등의 기능 단위의 것들을 세밀하게 조정할 수 있게 한다.

어떤 책에서는 OOP를 더 OOP스럽게 해주는 기능이라고 적혀있었던 기억이 난다. 


AOP는 호출 시점이 정해져 있는 Filter나  Interceptor 달리 Method 전후에 자유롭게 설정을 할 수 있다. 

xml에 기술해도 되고 Annotation을 활용해도 된다. 






공통적인 기능을 어떻게 처리할지에 대해서는 크게 3가지로 볼 수 있을 것 같다. 

전후처리가 필요하다면 일단 위 3가지를 고민해보고 경우에 맞는 녀석을 선택해서 사용하면 되겠다. 






아래 블로그 내용이 좋은 것 같아 추가함. (20190617)


https://jaehun2841.github.io/2018/08/25/2018-08-18-spring-filter-interceptor/#filter-chain

https://www.baeldung.com/spring-delegating-filter-proxy






'프로그래밍 > Spring' 카테고리의 다른 글

AWS + Spring boot + Java + Oauth + Mustache + JPA (sample project)  (0) 2020.04.28
REST API sample With Kotiln  (0) 2020.04.28
String(date foramt) in Json to LocalDateTime  (0) 2019.09.27
Spring AOP  (0) 2019.04.22
Annotation 정리  (0) 2019.04.05