Interceptor는 가로채는 것, 요격기 라는 뜻이다.

graph LR V[View] --> C[Controller] V[View] --> I[Interceptor] I[Interceptor] --> C[Controller]

다시 말해서, Url Mapping된 Controller를 거치는 전, 후 처리를 할 수 있도록 도와주는 요소를 말하며 세션 검증, 로그 처리 같은 행위가 간단한 예시가 될 수 있다.

Dependency

Interceptor는 spring-webmvc에 포함되어 있다. Spring Boot에서는 spring-boot-starter-web을 가져옴으로 해결할 수 있다.

1
2
3
4
dependencies { 
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}

Interceptor

기본 인터페이스는 HandlerInterceptor이고, 이를 구현할 수 해도 되지만, 추상 클래스인 HandlerInterceptorAdapter를 구현할 수도 있다. HandlerInterceptorAdapter를 이용하면 모두를 구현할 필요가 없기 때문에 이를 이용해보자. (하지만, 예시를 위해 모두 구현 해본다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Component
public class HttpInterceptor extends HandlerInterceptorAdapter {

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를 등록하기 위해서 WebMvcConfigurerAdapter를 이용한다. Interceptor를 등록한 후 적용할 경로, 제외할 경로를 지정해줄 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

@Autowired
@Qualifier(value = "httpInterceptor")
private HandlerInterceptor interceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/**");
}
}

Controller

Test를 위해 콘솔에 해당 로그를 찍어보자.

IndexController (참고)
1
http://localhost:8080
UserController (참고)
1
http://localhost:8080/user
결과
1
~~ : Hello, User!
1
2
3
4
~~ : ================ Before Method
~~ : Hello, Spring Boot Interceptor
~~ : ================ Method Executed
~~ : ================ Method Completed

그 외

Interceptor 후처리를 이용하여 값을 가공하거나 header에 키값을 추가하는 등의 작업을 할 수 없다. (해도 header에서 해당 키값을 찾아볼 수 없다.) 이런 경우에는 ResponseBodyAdvice를 구현해야 한다.(참고)

참고

SpringBootSample / SpringBootInterceptor