삶의 공유
[Spring] Filter와 Interceptor 완벽 정리: 개념과 예제로 이해 본문
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는 비행기 탑승구 앞 직원"이라고 비유하면 이해가 쉬울 거예요. ✈️
'Web Dev > Java' 카테고리의 다른 글
[Spring] Annotation@Mapping 역할 (0) | 2025.04.03 |
---|---|
HTTP 요청방법_GET/POST (0) | 2025.04.01 |
Intellij 내부 Tomcat 사용 시 LifeCycleException:Failed to start component (0) | 2024.10.27 |
[Java] Random Dice 출력 Web 프로그램 만들기 (1) | 2023.01.19 |
이클립스 Spring boot 설정 및 첫 Web Site 만들어보기 (0) | 2022.06.21 |