Backend/Spring+Boot

SpringBoot Interceptor 구현

findmypiece 2021. 3. 25. 01:03
728x90

전체코드는 아래 github을 참고하도록 한다.

github.com/mypiece/springboot-example/tree/master/intercepter-example

 

mypiece/springboot-example

스프링부트 예제. Contribute to mypiece/springboot-example development by creating an account on GitHub.

github.com

 


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 패턴을 명시하지 않을 경우 기본적으로 모든 컨트롤러 메소드에 적용된다.

위와 같이 여러개의 인터셉터를 적용할 수도 있다.

728x90