Spring Boot 기반의 Spring MVC 인터셉터 구현

  1. 인터셉터 개요

웹 애플리케이션 개발에서 클라이언트 요청을 필터링하는 두 가지 주요 메커니즘인 Filter(필터)와 HandlerInterceptor(인터셉터)가 존재합니다. 이 두 기술은 요청 처리 과정에서 유사한 역할을 하지만 구현 방식과 적용 범위에 차이가 있습니다.

필터는 서버 측 컴포넌트로, 요청과 응답 데이터를 가로채서 필터링하는 기능을 수행합니다. 반면 Spring MVC의 인터셉터는 Servlet 필터와 유사하지만, AOP(관점 지향 프로그래밍) 개념을 기반으로 동작하며 디스패처 서블릿을 통해 전달되는 요청에만 작동합니다. 자체 서블릿 요청은 인터셉터 체인의 대상이 되지 않습니다.

필터와 인터셉터의 주요 차이점은 다음과 같습니다:

  • 실행 원리: 필터는 함수 콜백 기반, 인터셉터는 리플렉션과 프록시 모델 기반
  • 적용 범위: 필터는 서블릿 컨테이너에 종속, 인터셉터는 스프링 컨테이너에 종속
  • 처리 대상: 필터는 모든 요청, 인터셉터는 액션 요청에 한함
  • 세부 제어: 필터는 요청/응답 객체를 감싸는 단순 처리, 인터셉터는 컨트롤러 처리 전후에 세부 제어 가능
  • 중단 메커니즘: 필터는 요청 재지정이 필요, 인터셉터는 preHandle 반환값 또는 예외 발생으로 중단
  1. 인터셉터 구현 예제
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean beforeProcessing(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 요청 처리 전 로직
        System.out.println("요청 처리 전");
        boolean accessGranted = false;
        if (accessGranted) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void afterProcessing(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 요청 처리 후 로직
    }

    @Override
    public void onCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 요청 완료 후 리소스 정리
    }

}
  1. 인터셉터 설정
import java.util.Arrays;
import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> excludedPaths = Arrays.asList("/test", "/user");

        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns(excludedPaths);
    }

}
  1. 인터셉터 테스트

태그: Spring Boot HandlerInterceptor WebMvcConfigurer AOP Request Filtering

7월 26일 13:15에 게시됨