필터(Filter)는 J2EE 표준 스펙 기능으로 클라이언트(Client)의 요청을 받은 Servlet/JSP가 수행되기 전, 후로 호출되어 수행되는 웹 컴포넌트입니다. Filter는 스프링(Spring) 범위 밖에서 처리됩니다. 즉, 스프링 컨테이너(Spring Container)가 아닌 톰캣(Tomcat)과 같은 서블릿 컨테이너(Servlet Container)에 의해 관리됩니다.
Filter Flow
▶ 호출 시점
Filter는 DispatcherServlet이 실행되기 전 호출됩니다.
▶ 설정 위치
web.xml (Web Application Server에 등록)
▶ 구현 방식
Filter는 web.xml에서 설정을 하면 구현이 가능합니다.
▶ 용도
데이터 변환(다운로드 파일의 압축 및 데이터 암호화 등)을 할 때 사용합니다.
XSL/T를 이용한 XML 문서 변경을 할 때 사용합니다.
사용자 인증을 할 때 사용합니다.
자원 접근에 대한 로깅을 할 때 사용합니다.
Filter에서 ServletRequest 혹은 ServletResponse를 교체할 수 있습니다. HttpServletRequest의 body(ServletInputStream의 내용)를 로깅하는 것을 예로 들 수 있습니다.HttpServletRequest는 body의 내용을 한 번만 읽을 수 있습니다. REST API Application을 작성할 때, 흔히 JSON 형식으로 요청을 받습니다. @Controller(Handler)에 요청이 들어오면서 body를 한 번 읽게 됩니다. 때문에 Filter나 Interceptor에서는 body를 읽을 수 없습니다. 읽으려고 하면, IOException이 발생합니다. body를 로깅하기 위해서는 HttpServletRequest를 감싸서 여러 번 inputStream을 열 수 있도록 커스터마이징 된 ServletRequest를 사용할 수 밖에 없습니다.
인터셉터(Interceptor)는 Filter와 달리 스프링(Spring)에서 제공하는 기술입니다. 디스패처 서블릿(Dispatcher Servlet)이 컨트롤러(Controller)를 호출하기 전과 후에 요청(Request)과 응답(Response)을 참조하거나 가공할 수 있는 기능을 제공합니다. 즉, 컨트롤러(Controller)에 들어오는 요청 HttpRequest와 컨트롤러(Controller)가 응답하는 HttpResponse를 가로채는 역할을 합니다.
Interceptor Flow
▶ 호출 시점
Interceptor는 DispatcherServlet이 실행된 후 호출됩니다.
▶ 설정 위치
spring-sevlet.xml (Spring의 Context에 등록)
▶ 구현 방식
Interceptor는 설정과 메서드 구현이 모두 필요합니다.
▶ 용도
관리자만 접근할 수 있는 관리자 페이지에 접근하기 전에 관리자 인증을 하는 용도로 활용될 수 있습니다.
핸들러 메서드(Handler Method)에서 사용자의 권한을 체크해서 다른 동작을 시켜준다거나 할 때 사용합니다.
뷰(View)를 렌더링하기 전에 추가 작업을 할 수 있습니다. 예를 들어 웹 페이지가 권한에 따라 GNB(Global Navigation Bar)이 항목이 다르게 노출되어야 할 때 등의 처리를 하기 좋습니다.
스프링(Spring) 애플리케이션에서 전역적으로 전후처리 로직에서 예외를 사용하도록 할 때 사용합니다.
AOP 흉내를 낼 수 있습니다.
@RequestMapping 선언으로 요청에 대한 HandlerMethod(@Controller의 메서드)가 정해졌다면, handler라는 이름으로 HandlerMethod가 들어옵니다. HandlerMethod로 메서드 시그니처 등 추가적인 정보를 파악해서 로직 실행 여부를 판단할 수 있습니다.