전체코드는 아래 github을 참고하도록 한다.
github.com/mypiece/springboot-example/tree/master/intercepter-example
Interceptor는 Controller 메소드 처리 전/후에 공통적으로 어떠한 작업을 처리할 수 있게 해준다.
이것 없이도 기능 구현에는 문제가 없지만 Controller 메소드마다 동일한 기능을 중복으로 정의해야 한다.
Filter 와 동일하게 url 패턴을 지정할 수 있다.
구현 방법은 아래와 같다.
1. Interceptor 역할을 할 Bean 정의
AsyncHandlerInterceptor 에서는 HandlerInterceptor 를 extends 하고 있는데
두개의 interface 메소드가 모두 default 메소드로 정의되어 있기 때문에
최종 implements 시 필수 구현 대상이 아니라 필요한 것만 오버라이드 하면 된다.
여기에서는 일단 다 구현해보도록 한다.
각 메소드의 역할은 아래와 같다.
- preHandle
컨트롤러 메소드 실행 직전 수행되는 메소드
반환 값이 true일 경우 지정된 컨트롤러 메소드가 이어서 수행되고,
false일 경우 실행을 멈춘다.
전달인자 중 Object handler 인터셉터가 매핑된 컨트롤러 클래스의 메소드 객체이다. - postHandle
컨트롤러 메소드 진입 후 view가 랜더링 되기 전에 수행되는 메소드
전달인자의 modelAndView을 통해 화면 단에 들어가는 데이터 조작가능 - afterCompletion
컨트롤러 메소드가 종료되고 view가 정상적으로 랜더링 된 후 제일 마지막에 수행되는 메소드 - afterConcurrentHandlingStarted
비동기 요청시 각 요청의 종료시마다 호출되는 후처리 메소드
비동기 요청의 경우 후처리로 postHandle, afterCompletion 이 사용되지 않고 이것만 호출된다.
참고로 SpringBoot 과거 버전에서는 HandlerInterceptorAdapter 을 extends 하거나
HandlerInterceptor 를 implements 해서 구현했는데
Spring 5.3 을 사용하는 SpringBoot 2.4 버전부터는 HandlerInterceptorAdapter 이 Deprecated 되었다.
이에 HandlerInterceptor 또는 AsyncHandlerInterceptor 를 implements 해서 구현해야 하는데
비동기 요청까지 후처리까지 지원하려면 afterConcurrentHandlingStarted 메소드가 포함된
AsyncHandlerInterceptor 를 implements 해야한다.
2. Interceptor 등록
위와 같이 인터셉터를 등록할 수 있고 인터셉트를 적용하거나 적용하지 않을 url 패턴을 명시할 수 있다.
url 패턴을 명시하지 않을 경우 기본적으로 모든 컨트롤러 메소드에 적용된다.
위와 같이 여러개의 인터셉터를 적용할 수도 있다.
'Backend > Spring+Boot' 카테고리의 다른 글
SpringBoot 2.4 Config file processing (0) | 2021.04.16 |
---|---|
h2 DB 초기 데이터 생성 (0) | 2021.03.30 |
spring-config-server git 저장소 활용 (0) | 2021.03.22 |
DelegatingFilterProxy (0) | 2021.03.17 |
[Error] If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. (0) | 2021.03.17 |