인터셉터(HandlerInterceptor
) 란?
커스터마이즈된 핸들러 실행 체인을 허가하는 워크플로우 인터페이스이다. 애플리케이션은 이미 존재하는 인터셉터 혹은 커스텀 인터셉터를 특정한 그룹에 추가할 수 있다. 공통적인 전처리 행위를 추가하기 위해 각 핸들러 구현을 수정할 필요는 없다. (다만 새롭게 추가하면 된다.)
HandlerInterceptor
는 적절한 HandlerAdapter
가 핸들러를 수행하기 전에 호출된다. 전처리 관점에서 꽤 많은 범위에 사용될 수 있는 매커니즘이다. 이를테면 권한 체크, 언어 설정, 테마 설정 등 공통 핸들러 행위가 있다. 반복되는 핸들러 코드를 뽑아내는 것(factoring out repetitive handler code)이 주 목적이다.
비동기 처리 시나리오에서는 메인 스레드가 렌더링 postHandle
, afterCompletion
콜백의 호출 없이 종료되는 동안 핸들러는 각 스레드에서 실행될 것이다. 동시에 작동하는 핸들러 실행이 끝날 때, 요청은 모델을 렌더링하기 위해 다시 되돌아간다. 그리고 모든 메서드가 다시 호출된다. org.springframework.web.servlet.AsyncHandlerInterceptor
를 참조하자.
일반적으로 인터셉터 체인은 HandlerMapping
빈 당 하나가 정의되어 그 세분성을 공유한다. 핸들러 그룹에 특정한 인터셉터 체인을 적용하기 위해서는 HandlerMapping
빈을 통해 원하는 핸들러에 매핑이 필요하다. 인터셉터 자체도 애플리케이션에 빈으로 정의된다. 그리고 매핑 빈 정의에 의해 참조된다. XML 에서는 <ref>
의 <list>
에 interceptors
라는 프로퍼티를 통해 이루어진다.
HandlerInterceptor
는 기본적으로는 ServletFilter
와 비슷한데, ServletFilter
와 달리 핸들러 자체의 실행을 금지하는 옵션과 함께 커스텀 전처리를 허용하고 커스텀 후처리를 허용한다. 필터는 인터셉터보다 강력하다. 이를테면 체인에 전달되는 request
와 response
를 교환할 수 있다. filter
는 web.xml
에서 설정된다. HandlerInterceptor
는 application context 에서 설정된다.
인터셉터에 대한 기본 지침은 핸들러와 관련된 전처리 작업은 HandlerInterceptor
구현 후보이다. 특히 공통 핸들러 코드나 권한 체크같은 것들을 생각해볼 수 있다. 필터는 멀티파트 폼이나 GZIP 압축 같은 요청 컨텐츠 혹은 뷰 컨텐츠 핸들링에 잘 맞는다. 이 때는 필터를 특정한 컨텐츠 타입(ex. 이미지) 혹은 모든 요청에 매핑이 필요하다.
인터셉터의 메서드
스프링에서 인터셉터를 구현하려면, HandlerInterceptor
인터페이스에서 상속받은 메서드 시그니처들을 구현하면 된다.
preHandle
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception;
핸들러 수행 전의 인터셉션 포인트이다. HandlerMapping
이 적절한 핸들러 오브젝트를 결정한 이후에 HandlerAdapter
가 핸들러를 호출하기 전에 호출된다. DispatcherServlet
는 수많은 인터셉터를 포함하는 실행 체인에서 핸들러를 처리하며, 핸들러 자체는 마지막에 처리한다. 이 메서드를 이용해 커스텀 응답이나 HTTP 에러를 보낸 뒤에 실행 체인을 중지시키도록 결정할 수도 있다. (이를 이용해 권한처리도 할 수 있다.)
비동기 요청 프로세싱을 적용할 수도 있다. 이는 비동기 핸들러 인터셉터에서 자세한 정보를 알아볼 수 있다.
기본 구현은 true
를 반환한다. true
인 경우 다음 실행 체인을 이어서 진행한다.
파라미터
request
,response
,handler
반환 값
true
면, 다음 인터셉터 혹은 핸들러를 진행한다.true
가 아니라면,DispatcherServlet
은 응답에 대한 처리가 끝났다고 가정한다.
postHandle
default void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
@Nullable
ModelAndView modelAndView)
throws Exception
핸들러의 성공적인 수행이 끝난 후의 인터셉션 포인트이다. HandlerAdapter
가 핸들러를 수행한 이후이며, DispatcherServlet
이 뷰를 렌더하기 전이다. ModelAndView
객체를 통해 추가적인 모델 오브젝트를 뷰에 더 노출할 수 있다.
DispatcherServlet
은 많은 인터셉터를 포함하는 실행 체인에서 핸들러 처리를 하고, 핸들러 자체는 마지막에 처리한다. 이 메서드로 각 인터셉터는 실행 후처리를 할 수 있다. 실행 체인의 역순으로 적용된다.
비동기 요청 프로세싱을 적용할 수도 있다. 이는 비동기 핸들러 인터셉터에서 자세한 정보를 알아볼 수 있다.
기본 구현은 empty
이다.
파라미터
request
,response
,handler
,modelAndView
afterCompletion
default void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
@Nullable
Exception ex)
throws Exception
요청 프로세싱의 완료 이후, 뷰 렌더링 이후 콜백이다. 핸들러 실행의 어떤 결과에 따라 호출된다. 적절한 리소스 정리를 허용한다.
preHandle
메서드가 성공적으로 완료되고, true
를 반환했다면, 호출될 것이다.
postHandle
메서드처럼, 메서드가 체인에서 역순으로 각 인터셉터에 대해 호출될 것이다. 첫번째 인터셉터가 가장 나중에 호출될 것이다.
비동기 요청 프로세싱을 적용할 수도 있다. 이는 비동기 핸들러 인터셉터에서 자세한 정보를 알아볼 수 있다.
기본 구현은 empty
이다.
파라미터
request
,response
,handler
,ex
(exception)
레퍼런스
'Java > 자바 잡지식' 카테고리의 다른 글
javadoc 한글 깨짐 문제 해결 (0) | 2022.05.15 |
---|---|
Filter, Interceptor, AOP 알아보기 (0) | 2022.05.10 |
자바 EE 필터 (Filter) 란? (0) | 2022.05.04 |
스프링의 @Value 애노테이션이란? (2) | 2022.05.01 |
DTO (Data Transfer Object) 란? (0) | 2022.04.27 |