Spring - 인터셉터(Interceptor)

박민수·2023년 11월 14일
0

Spring

목록 보기
6/46
post-thumbnail

인터셉터(Interceptor)

인터셉터(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 {}
}
  • preHandle() : 컨트롤러가 실행되기 전에 호출된다. 컨트롤러가 실행 되기 이전에 처리해야 할 작업이 있는 경우 사용한다.
  • postHandle() : 컨트롤러가 실행된 후에 호출된다.
  • afterCompletion() : 뷰가 렌더링 된 이후에 호출된다.

인터셉터 등록

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 경로는 서블릿 기술이 제공하는 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

profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글