Spring 웹 애플리케이션을 개발하다 보면 요청(request)이 컨트롤러에 도달하기 전이나 응답(response)이 클라이언트로 전달되기 전에 어떤 로직을 삽입하고 싶은 경우가 있습니다.
이럴 때 유용하게 사용할 수 있는 기능이 바로 인터셉터(Interceptor)입니다.
이번 글에서는 스프링에서 인터셉터가 무엇인지, 어떻게 사용하는지, 실제로 인증, 로깅 등에 어떻게 활용할 수 있는지 소개해보겠습니다.
인터셉터란?
인터셉터는 HandlerInterceptor 인터페이스를 구현하여 정의합니다.
이는 DispatcherServlet이 컨트롤러에 요청을 전달하기 전/후, 뷰 렌더링 전에 특정 작업을 수행할 수 있도록 해주는 가로채기(Interceptor) 기능입니다.
서블릿 필터(Filter)와 유사하지만, 보다 Spring MVC에 밀접하게 통합되어 있으며 컨트롤러 단위로 세밀한 처리가 가능하다는 점이 특징입니다.
핵심 메서드 3가지
HandlerInterceptor 인터페이스에는 세 가지 주요 메서드가 있습니다.
- preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- 컨트롤러 진입 전 실행
- false를 반환하면 이후 로직은 실행되지 않음
- postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- 컨트롤러 실행 후, 뷰 렌더링 전 호출
- afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- 요청 처리가 완료된 뒤, 예외 여부와 관계없이 실행
인터셉터 구현 예시 – 로깅용
@Component
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("[LOG] 요청 URI: " + request.getRequestURI());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
System.out.println("[LOG] 요청 처리 완료");
}
}
인터셉터 등록하기
인터셉터는 등록하지 않으면 동작하지 않기 때문에 WebMvcConfigurer를 구현한 설정 클래스에서 등록해주어야 합니다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoggingInterceptor loggingInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loggingInterceptor)
.addPathPatterns("/api/**") // 특정 경로에만 적용
.excludePathPatterns("/static/**"); // 제외할 경로
}
}
인증 처리에 인터셉터 활용
가장 대표적인 활용 사례는 로그인 인증입니다.
로그인하지 않은 사용자가 보호된 페이지에 접근하려 할 때 인터셉터에서 요청을 차단할 수 있습니다.
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
Filter와 Interceptor의 차이점
| 항목 | Filter | Interceptor |
| 위치 | 서블릿 컨테이너 레벨 | 스프링 MVC 레벨 |
| 대상 | DispatcherServlet 이전 요청 전체 | DispatcherServlet 이후의 요청 |
| 목적 | 공통 처리 (예: 인코딩) | 요청 흐름 제어, 컨트롤러 진입 전후 로직 |
| 등록 방식 | @WebFilter, FilterRegistrationBean 등 | WebMvcConfigurer를 통해 등록 |
주의할 점
- 인터셉터 내부에서 response.sendRedirect()를 사용할 경우 이후 컨트롤러는 실행되지 않음
- 정적 리소스 경로에는 기본적으로 적용되지 않지만 명시적으로 경로를 지정하면 적용 가능
- 너무 많은 로직을 넣으면 성능 저하의 원인이 될 수 있으므로 필요한 최소한의 처리만 수행하는 것이 좋음
Spring의 인터셉터는 필터보다는 좀 더 고수준의 요청 흐름 제어 도구로, 인증, 접근 제어, 요청 로깅, 타이머 처리 등 다양한 영역에서 유용하게 쓰입니다.
Filter와의 차이를 이해하고, 컨트롤러 이전/이후 단계에서 필요한 로직을 잘 설계하면, 코드의 분리도와 유지보수성이 훨씬 높아집니다.
애플리케이션 구조를 체계적으로 관리하고 싶다면 인터셉터는 꼭 익혀야 할 필수 도구 중 하나입니다.

'개발' 카테고리의 다른 글
| 스프링 시큐리티(Spring Security)란? (0) | 2025.04.25 |
|---|---|
| 마이크로서비스 아키텍처와 Spring Cloud (1) | 2025.04.25 |
| Spring에서 프로퍼티 파일 다루기 – application.properties와 application.yml (2) | 2025.04.23 |
| Spring Boot VS Spring Framework 차이점 (3) | 2025.04.22 |
| Spring에서 예외 처리하기 – @ControllerAdvice의 활용 (2) | 2025.04.22 |