앞 시간에선 Filter 를 이용해 컨트롤러 시작전 먼저 request를 검사해 로그인 사용자와 비로그인 사용자를 구분하였다.
하지만 위와 같은 로그인 체크를 필터 말고도 인터셉터 라는 기술로도 구현 할 수 있다고 잠깐 언급되었었다.
사실 Filter 의 경우 눈치챘을 수도 있지만 J2EE 스펙 의 표준으로 스프링이 지원하는것이 아닌 톰캣과 같은 웹 컨테이너(서블릿 컨테이너) 가 지원하는 기능이다.
반면 Interceptor 는 스프링이 지원하는 기능으로 필터보다 훨씬 기능이 다양하고 사용이 편리하다는 장점이 있다.
인터셉터 또한 필터와 마찬가지로 컨트롤러가 호출 되기 전에 동작하는 기능이다. 하지만 인터셉터는 필터와 달리 DispatcherServlet 이 호출 된 직후에 호출된다.
즉, 서블릿과 컨트롤러 사이에 동작하게된다.
HTTP요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터 -> 핸들러 어댑터 -> 컨트롤러
인터셉터도 필터와 마찬가지로 여러개의 인터셉터를 가질수 있고 체인형식으로 연결시킬 수 있다.
HTTP요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 인터셉터3 -> 핸들러 어댑터 -> 컨트롤러
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
컨트롤러 호출 전에 호출이 되며,
true 반환시 다음으로 진행하고
false 반환시 진행이 멈춘다.
컨트롤러가 호출 된 후 에 호출이 된다. 하지만 만일 컨트롤러에서 예외가 발생하게 되면 posthandle() 은 호출되지 않는다.
모두 끝나서 View까지 렌더링이 된 후에 호출이 된다. try-catch-finall 의 finally 처럼 만일 중간에 예외가 발생하더라도 afterCompletion() 는 끝까지 호출이 된다.
-> 파라미터의 정보를 통해 어떤 예외가 발생했는지 확인 할 수 있다.
본 포스트는
김영한의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 를 보고 정리했습니다.