클라이언트로부터 요청이 들어온 후 Filter가 존재한다면 Filter가 수행됩니다. Filter 수행 이후 DispatcherServlet 수행되고, HandlerMapping을 통해서 실제 어떤 Handler가 동작을 해야 되는지 정보를 얻어내고, Handler가 실행됩니다. 이후, 이런 정보들을 DispatcherServler한테 넘기고 ViewResolver를 이용해서 View의 정보를 얻어오고 해당 View를 찾아서 응답하는 일까지 수행하는것이 스프링의 동작 과정입니다.
인터셉터(Interceptor)
그렇다면, 인터셉터(Interceptor)는 언제 수행될까?
인터셉터는 DispatcherServlet에서 Handler로 요청을 보낼 때, Handler에서 DispatcherServlet 으로 응답을 보낼 때 동작 합니다.
인터셉터 작성
1.org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현
2. org.springframework.web.servlet.handler.HandlerInterceptorAdapter 클래스를 상속
둘중의 하나의 방법을 사용해 인터셉터 클래스를 생성합니다.
인터셉터 적용
1. Java Config를 사용한다면, WebMvcConfigurerAdapter가 가지고 있는 addInterceptors 메소드를 오버라이딩하고 등록
2. xml 설정을 사용한다면, <mvc:interceptors> 요소에 인터셉터를 등록합니다.
인터셉터를 이용해 Controller 공통 로직 처리하기
위에서 설명한 인터셉터 작성법 중 HandlerInterceptorAdapter 클래스를 상속받고 postHandle()과 preHandle() 메소드를 재정의 하여 컨트롤러 메소드가 실행되기 전에, 컨트롤러 메소드가 실행된 이후에 콘솔에 로그를 남기는 예제입니다.
LogInterceptor.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LogInterceptor extends HandlerInterceptorAdapter{
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(handler.toString() + " 가 종료되었습니다. " + modelAndView.getViewName() + "을 view로 사용합니다.");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(handler.toString() + " 를 호출했습니다.");
return true;
}
}
이런식으로 인터셉터를 만들어낸 후, 인터셉터를 등록해야합니다.
WebMvcConfigurerAdapter를 상속받은 java config 파일에 아래와 같이 WebMvcConfigurerAdapter가 가지고 있는 addInterceptors 메소드를 오버라이딩하여 등록과정을 마칩니다.
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "kr.or.connect.reservation.controller"})
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
...
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor());
}
...
}
출처
1. https://www.edwith.org/boostcourse-web/lecture/16805/