스프링 인터셉터

나무·2023년 11월 20일

스프링 MVC

목록 보기
11/12
post-thumbnail

0. 필터 vs 인터셉터

앞 시간에선 Filter 를 이용해 컨트롤러 시작전 먼저 request를 검사해 로그인 사용자와 비로그인 사용자를 구분하였다.

하지만 위와 같은 로그인 체크를 필터 말고도 인터셉터 라는 기술로도 구현 할 수 있다고 잠깐 언급되었었다.

사실 Filter 의 경우 눈치챘을 수도 있지만 J2EE 스펙 의 표준으로 스프링이 지원하는것이 아닌 톰캣과 같은 웹 컨테이너(서블릿 컨테이너) 가 지원하는 기능이다.

반면 Interceptor 는 스프링이 지원하는 기능으로 필터보다 훨씬 기능이 다양하고 사용이 편리하다는 장점이 있다.

  • 어떤 핸들러가 호출되는지 정보를 알수 있고
  • 어떤 ModelAndView 가 반환되는지도 알 수 있다.

1. Interceptor

인터셉터 또한 필터와 마찬가지로 컨트롤러가 호출 되기 전에 동작하는 기능이다. 하지만 인터셉터는 필터와 달리 DispatcherServlet 이 호출 된 직후에 호출된다.

즉, 서블릿과 컨트롤러 사이에 동작하게된다.

인터셉터 흐름

HTTP요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터 -> 핸들러 어댑터 -> 컨트롤러

인터셉터 체인

인터셉터도 필터와 마찬가지로 여러개의 인터셉터를 가질수 있고 체인형식으로 연결시킬 수 있다.

HTTP요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 인터셉터3 -> 핸들러 어댑터 -> 컨트롤러

2. Interceptor 인터페이스

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 {
	}
}

prehandle()

컨트롤러 호출 에 호출이 되며,

true 반환시 다음으로 진행하고
false 반환시 진행이 멈춘다.

posthandle()

컨트롤러가 호출 된 에 호출이 된다. 하지만 만일 컨트롤러에서 예외가 발생하게 되면 posthandle() 은 호출되지 않는다.

afterCompletion()

모두 끝나서 View까지 렌더링이 된 후에 호출이 된다. try-catch-finall 의 finally 처럼 만일 중간에 예외가 발생하더라도 afterCompletion() 는 끝까지 호출이 된다.

-> 파라미터의 정보를 통해 어떤 예외가 발생했는지 확인 할 수 있다.

본 포스트는
김영한의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 를 보고 정리했습니다.

profile
🍀 개발을 통해 지속 가능한 미래를 만드는데 기여하고 싶습니다 🍀

0개의 댓글