삶의 공유

[Spring] Filter와 Interceptor 완벽 정리: 개념과 예제로 이해 본문

Web Dev/Java

[Spring] Filter와 Interceptor 완벽 정리: 개념과 예제로 이해

dkrehd 2025. 4. 6. 15:29
728x90
반응형

Java Spring에서 Filter와 Interceptor 완벽 정리: 개념과 예제로 이해하기

Spring 기반 웹 애플리케이션을 개발할 때, 요청(request)과 응답(response)의 흐름을 제어하거나 공통적인 작업을 처리하기 위해 자주 사용되는 두 가지 기능이 있습니다:

  • Filter (필터)
  • Interceptor (인터셉터)

이 글에서는 이 둘의 개념, 역할, 실행 시점, 사용 예제를 비교하며 설명해드릴게요.


🧩 Filter란?

Filter는 Servlet 레벨에서 동작하는 기능으로, 모든 요청/응답 전후에 공통적인 처리를 할 수 있게 해줍니다.

✅ 사용 목적

  • 요청/응답 로깅
  • 인증 처리
  • 성능 측정
  • 인코딩 처리 등

🔧 예제 코드 - PerformanceFilter

@WebFilter(urlPatterns = "/*") // 모든 요청에 Filter 적용
public class PerformanceFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {

        // 1. 전처리
        long start = System.currentTimeMillis();

        // 2. 서블릿(컨트롤러) 또는 다음 필터 실행
        filterChain.doFilter(servletRequest, servletResponse);

        // 3. 후처리
        long end = System.currentTimeMillis();
        System.out.print("[" + ((HttpServletRequest) servletRequest).getRequestURI() + "]");
        System.out.println(" time=" + (end - start));
    }
}

📌 필수 설정

메인 클래스에 아래 어노테이션을 추가해야 Filter가 동작합니다:

Filter는 Servlet 수준에서 작동하기 때문에, Spring이 아닌 서블릿 컨테이너(Tomcat 등) 가 인식할 수 있도록 등록해야 합니다. 이때 사용하는 것이 바로 @WebFilter와 함께 **@ServletComponentScan**입니다.

여기서 Servlet 수준이란, Spring MVC가 동작하기 전에 웹 서버(Tomcat 등)가 가장 먼저 요청을 받아 처리하는 계층을 의미합니다. 이 말은 곧 Filter는 Spring 프레임워크와 무관하게 동작한다는 뜻이죠.

Spring MVC는 DispatcherServlet을 중심으로 동작하는 구조인데, Filter는 그 DispatcherServlet 이전 단계에서 요청과 응답을 가로채기 때문에 Spring의 빈(Bean) 컨텍스트나 어노테이션 기반 DI를 직접 사용할 수 없습니다. 따라서 Filter를 등록하려면 Java Servlet API에 따라 웹 서버가 인식할 수 있는 방식으로 등록해야 합니다.

이를 도와주는 어노테이션이 바로 @WebFilter이고, 이 필터들을 스캔하고 등록하는 역할을 하는 설정이 @ServletComponentScan입니다.

@ServletComponentScan 어노테이션을 메인 클래스에 추가하면, @WebFilter, @WebServlet, @WebListener와 같은 서블릿 관련 컴포넌트들을 자동으로 스캔하고 등록해줍니다.

즉, Spring Boot 애플리케이션에서 Filter를 작동시키려면 단순히 클래스를 작성하는 것만으로는 부족하고, 이 어노테이션을 통해 ServletContext에 등록해줘야만 필터 체인에 포함되어 정상 작동하게 됩니다.

메인 클래스에 아래 어노테이션을 추가해야 Filter가 동작합니다:

@ServletComponentScan

 

 

반응형

 

 

🧩 Interceptor란?

Interceptor는 Spring MVC 레벨에서 동작하는 기능으로, 컨트롤러 진입 전후나 View 렌더링 직전에 동작합니다.

✅ 사용 목적

  • 권한 체크
  • 요청 인증
  • 로깅
  • 공통 모델 값 추가 등

🔧 예제 코드 - PerformaceIntercept

@Component
public class PerformaceIntercept implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        long start = System.currentTimeMillis();
        request.setAttribute("startTime", start);

        HandlerMethod method = (HandlerMethod) handler;
        System.out.println("method.getMethod() = " + method.getMethod());
        System.out.println("method.getBean() = " + method.getBean());

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        long start = (long) request.getAttribute("startTime");
        long end = System.currentTimeMillis();
        System.out.print("[" + request.getRequestURI() + "]");
        System.out.println(" time=" + (end - start));
    }
}

🛠️ 설정 - WebMvcConfig

Spring에서 Interceptor는 단순히 @Component로 등록한다고 자동 적용되지 않습니다. 반드시 WebMvcConfigurer를 구현한 설정 클래스에서 addInterceptors() 메서드를 통해 스프링 MVC의 Interceptor 체인에 수동으로 등록해야 동작합니다.

이렇게 설정하는 이유는 Spring MVC가 내부적으로 여러 개의 Interceptor를 사용할 수 있도록 설계되어 있기 때문입니다. 따라서 우리가 작성한 Interceptor가 언제, 어떤 경로에 적용될지를 명시적으로 지정해주는 과정이 필요한 거죠.

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new PerformaceIntercept())
                .addPathPatterns("/**") // 적용 대상
                .excludePathPatterns("/css/**", "js/**"); // 제외 대상
    }
}

🔍 Filter vs Interceptor 비교 정리

항목 Filter Interceptor

적용 레벨 Servlet (웹 컨테이너) Spring MVC
실행 시점 DispatcherServlet 이전 DispatcherServlet 이후
적용 대상 모든 요청 (정적 자원 포함) 주로 컨트롤러 매핑 요청
설정 방식 @WebFilter + @ServletComponentScan WebMvcConfigurer + addInterceptors()
주요 목적 보안, 인코딩, 로깅, 성능 측정 인증/인가, 비즈니스 로직 전후 처리
단점 Spring의 빈(bean)에 접근 어려움 DispatcherServlet 이후에만 실행

✅ 언제 어떤 걸 써야 할까?

상황 추천

정적 자원 포함한 전처리 필요 Filter
Spring 빈 활용 + 컨트롤러 전후 처리 Interceptor
보안 인증 또는 세션 체크 Interceptor
성능 측정 (전 범위) Filter 또는 Interceptor 혼합

✨ 마무리

Filter와 Interceptor는 Spring에서 요청의 흐름을 제어하고 공통 기능을 분리하는 데 중요한 도구입니다. 각각의 목적과 위치를 이해하고 상황에 맞게 활용하면, 코드의 응집도와 재사용성을 높일 수 있어요.

"Filter는 공항 검색대, Interceptor는 비행기 탑승구 앞 직원"이라고 비유하면 이해가 쉬울 거예요. ✈️


 

반응형