🧩 Interceptor

정의

InterceptorSpring MVC에서 컨트롤러가 실행되기 전과 후에 요청/응답을 가로채는 기능이다. DispatcherServlet이 컨트롤러를 호출하는 흐름 안에서 동작한다.

필터보다 Spring MVC에 더 가깝고, 컨트롤러 단위의 전처리/후처리에 적합하다.

🧩 역할

  • 컨트롤러 호출 전후를 가로챈다
  • 요청 검증이나 공통 처리에 사용한다
  • 응답 후처리를 수행한다
  • Spring MVC 흐름 안에서 동작한다

🛠 동작 흐름

  1. 요청이 들어온다.
  2. preHandle()이 실행된다.
  3. 컨트롤러가 호출된다.
  4. postHandle()이 실행된다.
  5. 뷰 렌더링 이후 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 흐름에 가까운 전처리/후처리 훅이다.

연결문서

댓글남기기