Spring Framework

핸들러 인터셉터(Interceptor)

똥태 2022. 1. 28. 07:02

 

핸들러 매핑의 역할

  • URL과 요청 정보로부터 컨트롤러 빈을 찾아준다.
  • DispatcherServlet으로부터 매핑 작업을 요청받으면 그 결과로 핸들러 실행 체인(HandlerExecutionChain)을 돌려준다. 이 핸들러 실행 체인은 하나 이상의 핸들러 인터셉터를 거쳐서 컨트롤러가 실행될 수 있도록 구성되어 있다.

 

 

 

인터셉터(Interceptor)란?

  •  DispatcherServlet에서 Handler(컨트롤러)를 호출하기 전과 후에 request와 response를 참조하거나 가공할 수 있는 일종의 필터다.
  • 서블릿 필터와 쓰임새가 유사하기 때문에 둘 중 어떤것을 사용할지 신중히 선택해야한다.
  • 컨트롤러에 공통적으로 적용할 부가기능이라면 핸들러 인터셉터를 사용하는 것이 좋다.



서블릿 필터와 차이점

  • HttpServletRequest, HttpServletResponse뿐 아니라, 실행될 컨트롤러 빈 오브젝트, 컨트롤러가 돌려주는 ModelAndView, 발생 예외(Exception) 등을 제공받을 수 있다.
  • 필터 자체는 스프링의 빈이 아닌 반면 핸들러 인터셉터 자체가 스프링의 빈이다. 따라서 DI를 통해 다른 빈을 활용할 수도 있다.

 

 

인터셉터 작성법

  • org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현한다.
  • org.springframework.web.servlet.handler.HandlerInterceptorAdapter 클래스를 상속받는다.
  • Java Config를 사용한다면, WebMvcConfigurerAdapter가 가지고 있는 addInterceptors 메소드를 오버라이딩하고 등록하는 과정을 거친다.
  • xml 설정을 사용한다면, <mvc:interceptors> 요소에 인터셉터를 등록한다.

 

 

 

HandlerInterceptor  인터페이스의 메소드

 

preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

  • 컨트롤러가 호출되기 전에 실행된다. (이때 handler 파라미터는 핸들러 매핑이 찾아준 컨트롤러 빈 오브젝트다.)
  • 컨트롤러 실행 이전에 처리해야 할 작업이나 요청정보를 가공하거나 추가하는 경우 또는 요청에 대한 로그를 남기기 위해 사용한다.
  • return 값이 true면 핸들러 실행 체인의 다음 단계로 진행되지만, false라면 작업을 중단하고 리턴한다. 따라서 false인 경우엔 컨트롤러와 남은 인터셉터들은 실행되지 않는다.

 

postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

  • 컨트롤러를 실행하고 난 후에 호출된다.
  • 컨트롤러 실행 이후이므로 컨트롤러가 돌려준 ModelAndView 타입의 정보가 제공되어 컨트롤러 작업 결과를 참조하거나 조작할 수 있다.
  • preHandle() 메소드에서 false를 리턴했을 경우에는 postHandle()도 실행되지 않는다.

 

afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

  • 모든 뷰에서 최종 결과를 생성하는 일을 포함한 모든 작업이 다 완료된 후에 실행된다.
  • 요청 처리 중 사용한 리소스를 반환해주기에 적당한 메소드다.

 

핸들러 인터셉터는 하나 이상을 등록할 수 있다. preHandle()은 인터셉터가 등록된 순서대로 실행되는 반면 postHandle()과 afterCompletion()은 preHandle()이 실행된 순서와 반대로 실행된다.

'Spring Framework' 카테고리의 다른 글

클라이언트 요청 처리 순서  (0) 2022.01.28
Properties 값 져올때 오류  (0) 2022.01.14
DispatcherServlet과 MVC 아키텍쳐  (0) 2022.01.12
스프링 IoC/DI 컨테이너  (0) 2021.12.24