Interceptor
🧩 Interceptor
정의
Interceptor는 Spring MVC에서 컨트롤러가 실행되기 전과 후에 요청/응답을 가로채는 기능이다.DispatcherServlet이 컨트롤러를 호출하는 흐름 안에서 동작한다.
필터보다 Spring MVC에 더 가깝고, 컨트롤러 단위의 전처리/후처리에 적합하다.
🧩 역할
- 컨트롤러 호출 전후를 가로챈다
- 요청 검증이나 공통 처리에 사용한다
- 응답 후처리를 수행한다
- Spring MVC 흐름 안에서 동작한다
🛠 동작 흐름
- 요청이 들어온다.
preHandle()이 실행된다.- 컨트롤러가 호출된다.
postHandle()이 실행된다.- 뷰 렌더링 이후
afterCompletion()이 실행된다.
🛠 사용 예시
Interceptor 구현
public class DataSourceInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if (request.getRequestURL().toString().contains("/dev")) {
DataSourceContextHolder.setDataSourceKey("devDataSource");
} else {
DataSourceContextHolder.setDataSourceKey("prodDataSource");
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
DataSourceContextHolder.clearDataSourceKey();
}
}
WebMvcConfigurer에 등록
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new DataSourceInterceptor())
.addPathPatterns("/**");
}
}
🧩 특징
- Spring MVC 내부에서 동작한다
- 컨트롤러 전후 처리에 적합하다
- 요청/응답의 특정 시점에 개입할 수 있다
Filter보다 더 MVC에 가까운 계층이다
⚠️ 주의사항
preHandle()에서false를 반환하면 이후 처리가 중단된다.afterCompletion()은 예외가 발생해도 정리 작업에 유용하다.- 필터와 역할이 다르므로 인증/인코딩 같은 범용 처리는 구분해서 선택하는 것이 좋다.
WebMvcConfigurerAdapter는 오래된 방식이므로WebMvcConfigurer를 사용하는 것이 좋다.
📌 정리
Interceptor는 Spring MVC에서 컨트롤러 전후로 동작하는 기능이다.- 요청 검증, 로깅, 데이터소스 전환 같은 공통 작업에 유용하다.
Filter보다 MVC 흐름에 가까운 전처리/후처리 훅이다.
댓글남기기