우와한 개발자

[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 인증, 로깅, 공통 처리

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기