Spring Boot - Interceptor
· 3 min read
Interceptor는 가로채는 것, 요격기 라는 뜻이다.
다시 말해서, Url Mapping된 Controller를 거치는 전, 후 처리를 할 수 있도록 도와주는 요소를 말하며 세션 검증, 로그 처리 같은 행위가 간단한 예시가 될 수 있다.
Dependency
Interceptor는 spring-webmvc
에 포함되어 있다. Spring Boot에서는 spring-boot-starter-web
을 가져옴으로 해결할 수 있다.
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Interceptor
기본 인터페이스는 HandlerInterceptor
이고, 이를 구현할 수 해도 되지만, 추상 클래스인 HandlerInterceptorAdapter
를 구현할 수도 있다. Java 1.8 부터는 굳이 HandlerInterceptorAdapter
를 이용하지 않아도 된다. 하지만, 예시를 위해 모두 구현 해본다.
@Component
public class HttpInterceptor extends HandlerInterceptor {
private static final Logger logger = Logger.getLogger(HttpInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
logger.info("================ Before Method");
return true;
}
@Override
public void postHandle( HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) {
logger.info("================ Method Executed");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
logger.info("================ Method Completed");
}
}
preHandle()
: 맵핑되기 전 처리를 해주면 됩니다.postHandle()
: 맵핑되고난 후 처리를 해주면 됩니다.afterCompletion()
: 모든 작업이 완료된 후 실행 됩니다.
Config
Interceptor를 등록하기 위해서 WebMvcConfigurer
를 이용한다. Interceptor를 등록한 후 적용할 경로, 제외할 경로를 지정해줄 수 있다.
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
@Qualifier(value = "httpInterceptor")
private HandlerInterceptor interceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/**");
}
}
Controller
Test를 위해 콘솔에 해당 로그를 찍어보자.
IndexController (참고)
http://localhost:8080
UserController (참고)
http://localhost:8080/user
결과
~~ : Hello, User!
~~ : ================ Before Method
~~ : Hello, Spring Boot Interceptor
~~ : ================ Method Executed
~~ : ================ Method Completed
그 외
Interceptor 후처리를 이용하여 값을 가공하거나 header에 키값을 추가하는 등의 작업을 할 수 없다. (해도 header에서 해당 키값을 찾아볼 수 없다.) 이런 경우에는 ResponseBodyAdvice
를 구현해야 한다.(참고)