01. Spring MVC의 인터셉터(Interceptor)
스프링 MVC에서 인터셉터는 웹 애플리케이션 내에서 특정한 URI 호출을 '가로채는' 역할
1. Filter와 Interceptor의 차이
(공통점) Servlet 기술의 Filter와 Spring MVC의 HandlerInterceptor는 특정 URI에 접근할 때 제어하는 용도로 사용
(차이점) 실행 시점에 속하는 영역(Context)의 차이, Filter는 동일한 웹 애플리케이션의 영역 내에서 필요한 자원들을 활용하나 Interceptor의 경우 스프링 내 모든 객체(빈)에 접근이 가능
> 예컨대, HandlerInterceptor의 경우 스프링의 빈으로 등록된 컨트롤러나 서비스 객체들을 주입받아 사용할 수 있기에 기존의 구조를 그대로 활용하면서 추가적인 작업이 가능
2. Spring AOP와 HandlerInterceptor의 차이
> AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이, Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해 호출 대상이 되는 메소드의 파라미터 등을 처리하는 방식. 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 받는 구조.
[HandlerInterceptor의 메소드]
메소드명 |
메소드 역할 |
preHandle(request, response, handler) |
지정된 컨트롤러의 동작 이전에 가로채는 역할 |
postHandle(request, response, handler, modelAndView) |
지정된 컨트롤러의 동작 이후에 처리 Spring MVC의 Front Controller인 DispatcherServlet이 화면을 처리하기 전에 동작 |
afterCompletion(request, response, handler, exception) |
DispatcherServlet의 화면 처리가 완료된 상태에서 처리 |
> Handler는 현재 실행하려는 메소드 자체를 의미, 이를 활용하면 현재 실행되는 컨트롤러를 파악하거나, 추가적인 메소드를 실행하는 등의 작업이 가능
3. HandlerInterceptorAdaptor
> HandlerInterceptor 인터페이스를 구현한 추상 클래스
> 일반적으로 디자인 패턴에서 Adapter라는 용어가 붙으면 특정 인터페이스를 미리 구현해서 사용하기 쉽게 하는 용도인 경우가 많음
4. Interceptor 설정
> servlet-context.xml에 설정
(샘플)
<beans:bean id="sampleInterceptor" class="com.app.interceptor.SampleInterceptor"></beans:bean>
<interceptors>
<interceptor>
<mapping path="/doSample" />
<beans:ref bean="sampleInterceptor" />
</interceptor>
</interceptors>
> <interceptors> 태그를 이용하기 위해서는 XML 네임스페이스에 spring mvc관련 설정이 추가되어 있어야 한다.
> <mapping> 태그에 원하는 URI 지정 (필요한 경로를 직접 지정하거나 '**', '*'와 같은 패턴 적용