Interceptor를 알아보자

임종혁·2024년 4월 19일

interceptor = 가로채다

무엇을 가로챈다 말인가

sevlet container 와 springcontainer 를 보면 springContainer 속 Handler interceptor 를 찾을 수 있을 것이다.

이로써 interceptor는 디스패쳐 서블릿에서 요청 혹은 스프링 컨트롤러에서 처리후 디스패쳐서블릿으로 반환시 가로채 무엇인가를 해준다는 것을 알 수 있다.

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

}

인터셉터를 구현하기 위해서는 다음 과 같이 HandlerInterceptor 를 확장해야하는데

HandlerInterceptor 는 특이하게도 모든 메서드가 default로 되어있다.

그래서 다음같이 implements를 받아도 우리가 구현하고 싶은 메소드만 오버라이드 할 수있도록 되어있다.

그럼 HandlerInterceptor 에서 주어지는 메서드 preHandle, postHandle, afterCompletion 는 무엇인가.

우선 preHandle 부터 확인 하겠다.

@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		return HandlerInterceptor.super.preHandle(request, response, handler);
	}

다음과 같이 preHandle 메소드는 boolean return 타입이며 이름과 타입으로 추측컨데 return true 시 디스패쳐 서블릿에서 request가 spring 컨테이너로 가도록 가기전 실행 한 다는 것을 추측 할 수 있다.

@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}

그럼 postHandle 은 스프링 컨테이너 에서 디스패처 서블릿으로 가기 전에 수행 할 것이라 추측이 가능하다.
여기서 특이한 점은 인자값으로 ModelAndView를 받는 다는 것이다. 아마 spring 컨테이너가 모든 요청을 수행후 디스패처 서블렛으로 가니 Model AndView를 사용할 수 있을 것이다.

@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
	}

afterCompletion은 이름만으로 역할을 알 수가 없어 찾아 보았다.
이 메서드는 view 찾아 디스패처 서블릿에 반환전 실행한다 한다.

그럼 실제 맞는지 실행 순서를 보도록 하겠다.


@Component("interceptor")
public class SessionInterceptor implements HandlerInterceptor {
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("preHandle");
		return true;
	}

	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("postHandle");
	}
	
	
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("afterCompletion");
	}
	
}

다음과 같이 인터셉터를 세팅 하고 bean으로 등록을 할 것이다.

<context:component-scan base-package="com.ssafy.*.controller, com.ssafy.interceptor" />
	<interceptors>
		<interceptor>
		<mapping path="/**"/>
	<beans:ref bean="interceptor"/>
	
	</interceptor>
	</interceptors>

다음과 같이 xml 에 등록후
/ view에 해당하는 index.jsp 에 "view" 라는 System.out.println()을 수행할 것 이다.

그럼

요청시 pre 가 수행되고 그 후 post 가 실행 된 후 다시 view 리저버로 통해 view를 찾아 반환시 aftercompletion이 수행하는 것을 볼 수 있다.

0개의 댓글