인터셉터(Interceptor)는 클라이언트의 요청이 컨트롤러의 핸들러에 도달하기 이전에 낚아채서 원하는 작업을 먼저 처리한 후에 핸들러로 보낼 수 있기 때문에 필터(Filter)와 마찬가지로 공통 관심사를 효과적으로 처리하기에 적합한 기술이다.
예를들어 모든 페이지에서 로그인 유무를 확인해야 할 경우 각각의 컨트롤마다 로그인 유무를 체크 할 필요 없이, 인터셉터를 이용하여 공통 로직을 한 곳에서 처리할 수 있다.
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
인터셉터는 DispatcherServlet이 실행 된 후에 호출된다. (<ㅡ> 필터는 DispatcherServlet이 실행되기 전에 호출)
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러
인터셉터는 체인으로 구성되어서, 중간에 인터셉터를 자유롭게 추가할 수 있다.

컨트롤러에서 예외가 발생한 경우에는 postHandle은 호출되지 않고 afterCompletion만 호출이 된다. 이때 발생한 예외 정보가 afterCompletion에 전달된다.
스프링의 인터셉터를 사용하기 위해서는 HandlerInterceptor 인터페이스를 구현해야한다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response,Object handler) throws Exception {}
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) throwsException {}
}
WebMvcConfigurer가 제공하는 addInterceptors()를 통해 인터셉터를 등록할 수 있다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor()) // 인터셉터 등록
.order(1) // 호출 순서 지정
.addPathPatterns("/**") // 적용할 URL 패턴 지정
.excludePathPatterns("/css/**", "/*.ico", "/error"); // 적용에서 제외할 URL 패턴 지정
}
}
스프링이 제공하는 URL 경로는 서블릿 기술이 제공하는 URL 경로보다 더 자세하고 세밀하게 설정할 수 있다.

참조
PathPattern 공식 문서 (링크 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/pattern/PathPattern.html)
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2