필터(Filter)와 인터셉터(Interceptor)는 웹 애플리케이션에서 요청과 응답을 처리할 때 사용되지만, 서로의 동작 시점과 기능이 다릅니다.
이 두 개념은 주로 Spring 프레임워크나 Java EE 기반의 웹 애플리케이션에서 사용됩니다.
✅ 필터(Filter)
필터는 Servlet 스펙에서 제공하는 기능으로, 클라이언트 요청과 서버 응답의 흐름을 가로채고 변경하거나 처리할 수 있습니다.
📌 특징
- 서블릿 이전에 실행됨
- 필터는 서블릿(Controller)이 실행되기 직전에 요청을 가로채고 처리합니다.
- 요청 및 응답 수정 가능
- 요청(Request)과 응답(Response)의 데이터를 수정하거나 로깅하는 등 다양한 작업을 수행할 수 있습니다.
- 모든 요청에 대해 적용
- 필터는 주로 URL 패턴에 매핑되어 모든 요청이나 특정 요청에 대해 실행됩니다.
📌 필터 동작 순서
- 클라이언트 → 필터 → 서블릿 → 필터 → 클라이언트
- 요청이 필터를 거쳐 서블릿으로 전달되고, 서블릿의 응답도 필터를 거쳐 클라이언트로 전달됩니다.
📌 주요 사용 사례
- 인코딩 처리: 요청과 응답의 문자 인코딩 설정
- 로깅: 요청 및 응답 데이터 로깅
- 보안: 인증 및 권한 검사
- CORS 처리: Cross-Origin 요청 처리
📌 필터 예제 (Java)
@WebFilter("/*") // 모든 요청에 대해 필터 적용
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Request is passing through the filter.");
// 다음 필터 또는 서블릿으로 요청 전달
chain.doFilter(request, response);
System.out.println("Response is passing back through the filter.");
}
}
✅ 인터셉터(Interceptor)
인터셉터는 Spring 프레임워크에서 제공하는 기능으로, 주로 Handler(Controller)의 전후 처리에 사용됩니다.
📌 특징
- Handler(Controller) 실행 전후에 동작
- 인터셉터는 DispatcherServlet과 Controller 사이에서 동작합니다.
- Spring MVC에서만 사용
- 인터셉터는 Spring MVC의 HandlerMapping과 연동되어 동작합니다.
- 요청과 응답 수정 불가
- 인터셉터는 요청 객체(Request)와 응답 객체(Response)를 수정할 수 없습니다.
- PreHandle / PostHandle / AfterCompletion 단계 제공
- 요청 처리 전후에 다양한 작업을 수행할 수 있습니다.
📌 인터셉터 동작 순서
- DispatcherServlet → PreHandle → Controller → PostHandle → AfterCompletion
- PreHandle: 컨트롤러 실행 전
- PostHandle: 컨트롤러 실행 후, 뷰가 랜더링되기 전
- AfterCompletion: 뷰까지 모두 랜더링된 후
📌 주요 사용 사례
- 권한 검사: 사용자 인증 및 권한 체크
- 로깅: 요청 및 응답 시간 측정
- 공통 데이터 설정: 뷰에 전달할 공통 데이터 설정
📌 인터셉터 예제 (Spring)
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("Before Handler execution");
return true; // true 반환 시 Controller 실행
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) {
System.out.println("After Handler execution");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
System.out.println("After view rendering");
}
}
등록 방법 (WebMvcConfigurer):
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
✅ 필터와 인터셉터의 차이점 비교
구분 | 필터(Filter) | 인터셉터(Interceptor) |
---|---|---|
실행 위치 | 서블릿 실행 전/후 | Controller 실행 전/후 |
제공 방식 | Servlet 스펙 | Spring MVC에서 제공 |
수행 범위 | 모든 요청 (URL 패턴에 따라 적용) | Spring MVC의 Controller에만 적용 |
데이터 수정 | 요청 및 응답 데이터 수정 가능 | 요청과 응답 데이터 수정 불가 |
사용 단계 | 웹 애플리케이션 전반 | 컨트롤러 전/후, 뷰 렌더링 후 단계별 실행 |
사용 목적 | 보안, 로깅, 인코딩 처리 | 인증, 권한 체크, 로깅 |
✅ 정리
필터(Filter):
- Servlet 기반에서 동작하며, 요청과 응답을 가로채서 수정할 수 있습니다.
- 범용적이고 모든 요청에 대해 동작합니다.
인터셉터(Interceptor):
- Spring MVC 기반에서 동작하며, Controller 실행 전/후에 추가 작업을 수행합니다.
- 요청과 응답의 수정은 불가능하지만 로직 처리와 권한 검사 등에 유용합니다.
언제 사용해야 할까?
- 필터: 보안, 인코딩, 요청/응답 로깅 등 전반적인 요청 처리에 사용합니다.
- 인터셉터: 권한 검사, 공통 로직, Controller 전후 로직 수행 등 비즈니스 로직 처리에 사용합니다.
'Spring Framework' 카테고리의 다른 글
아규먼트 리졸버(Argument Resolver) (2) | 2024.12.16 |
---|---|
InitializingBean (0) | 2024.10.29 |