[Spring] 인터셉터(Interceptor)란? - 동작 흐름과 설정 방법 및 주요 메서드
by 우와한개발자
[ 인터셉터 Interceptor ]

1.Interceptor란?
- 클라이언트의 요청이 컨트롤러에 도달하기 전/후 또는 뷰가 렌더링된 후에 공통 로직을 실행할 수 있는 Spring MVC의 기능
- DispatcherServlet이후에 HandlerMapping갔다온 후 동작.
- 스프링 컨테이너가 관리
- 인터셉터 구현 시 org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdapter를 상속
2. Interceptor 동작 흐름
Client 요청
↓
DispatcherServlet
↓
HandlerMapping (핸들러 조회)
↓
preHandle() ← 컨트롤러 실행 전
↓
HandlerAdapter ← 컨트롤러 실제 실행
↓
Controller 실행
↓
postHandle() ← 컨트롤러 실행 후, 뷰 렌더링 전
↓
View 렌더링
↓
afterCompletion() ← 뷰 렌더링 후 (항상 실행)
3. Interceptor 구현
| 메서드 | 실행 시점 | 반환값 |
| preHandle() | 컨트롤러 실행 전 | true : 계속 진행 / false : 요청 차단 |
| postHandle() | 컨트롤러 실행 후, 뷰 렌더링 전 | - |
| afterCompletion() | 뷰 렌더링 후 (항상 실행) | - |
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession();
// 세션에 로그인 정보 없으면 로그인 페이지로 이동 후 요청 차단
if (session.getAttribute("loginUser") == null) {
response.sendRedirect("/login");
return false;
}
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 {
// 뷰 렌더링 후 처리 (예외 발생해도 항상 실행)
}
}
4. Interceptor 설정
1) xml 방식 : <interceptors> 태그
- servlet-context.xml에 mvc:interceptors 태그로 등록
- 특정 URI 패턴에 한정해서 적용되도록 설정 가능
| 태그 | 설명 |
| mvc:interceptors | 인터셉터 설정 묶음 |
| mvc:interceptor | 개별 인터셉터 설정 (URI 패턴 지정 시 사용) |
| <mvc:mapping path=""> | 인터셉터를 적용할 URI 패턴 |
| <mvc:exclude-mapping path=""> | 인터셉터에서 제외할 URI 패턴 |
<!-- servlet-context.xml -->
<mvc:interceptors>
<!-- 방법 1 : 모든 요청에 적용 -->
<bean class="com.example.interceptor.LogInterceptor"/>
<!-- 방법 2 : 특정 URI 패턴에 한정 적용 -->
<mvc:interceptor>
<!-- 적용할 URI 패턴 -->
<mvc:mapping path="/mypage/**"/>
<mvc:mapping path="/admin/**"/>
<!-- 제외할 URI 패턴 -->
<mvc:exclude-mapping path="/admin/login"/>
<!-- 적용할 인터셉터 클래스 -->
<bean class="com.example.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2) Java Config 방식 : WebMvcConfigurer 인터페이스
- WebMvcConfigurer 인터페이스를 구현한 설정 클래스에서 addInterceptors() 메서드를 오버라이딩해 인터셉터를 등록하는 방식
- addPathPatterns() : 인터셉터를 적용할 URI 패턴 지정
- excludePathPatterns() : 인터셉터에서 제외할 URI 패턴 지정
- Spring Boot에서는 xml 방식 대신 이 방식을 주로 사용
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/mypage/**", "/admin/**")
.excludePathPatterns("/admin/login");
}
}
5. Filter vs Interceptor 비교
| 구분 | Filter | Interceptor |
| 관리 주체 | Tomcat (서블릿 컨테이너) | Spring 컨테이너 |
| 동작 시점 | DispatcherServlet 이전 | DispatcherServlet 이후 |
| Spring Bean 사용 | 어려움 | 가능 |
| 주 사용 목적 | 인코딩, 보안, CORS | 인증, 로깅, 공통 처리 |
'프레임워크 > Spring' 카테고리의 다른 글
블로그의 정보
우와한개발자 님의 블로그
우와한개발자