Spring Framework / / 2024. 12. 16. 12:37

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

필터(Filter)인터셉터(Interceptor)는 웹 애플리케이션에서 요청과 응답을 처리할 때 사용되지만, 서로의 동작 시점과 기능이 다릅니다.
이 두 개념은 주로 Spring 프레임워크Java EE 기반의 웹 애플리케이션에서 사용됩니다.


필터(Filter)

필터Servlet 스펙에서 제공하는 기능으로, 클라이언트 요청서버 응답의 흐름을 가로채고 변경하거나 처리할 수 있습니다.


📌 특징

  1. 서블릿 이전에 실행됨
    • 필터는 서블릿(Controller)이 실행되기 직전에 요청을 가로채고 처리합니다.
  2. 요청 및 응답 수정 가능
    • 요청(Request)과 응답(Response)의 데이터를 수정하거나 로깅하는 등 다양한 작업을 수행할 수 있습니다.
  3. 모든 요청에 대해 적용
    • 필터는 주로 URL 패턴에 매핑되어 모든 요청이나 특정 요청에 대해 실행됩니다.

📌 필터 동작 순서

  1. 클라이언트 → 필터 → 서블릿 → 필터 → 클라이언트
    • 요청이 필터를 거쳐 서블릿으로 전달되고, 서블릿의 응답도 필터를 거쳐 클라이언트로 전달됩니다.

📌 주요 사용 사례

  • 인코딩 처리: 요청과 응답의 문자 인코딩 설정
  • 로깅: 요청 및 응답 데이터 로깅
  • 보안: 인증 및 권한 검사
  • 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)의 전후 처리에 사용됩니다.


📌 특징

  1. Handler(Controller) 실행 전후에 동작
    • 인터셉터는 DispatcherServletController 사이에서 동작합니다.
  2. Spring MVC에서만 사용
    • 인터셉터는 Spring MVC의 HandlerMapping과 연동되어 동작합니다.
  3. 요청과 응답 수정 불가
    • 인터셉터는 요청 객체(Request)와 응답 객체(Response)를 수정할 수 없습니다.
  4. PreHandle / PostHandle / AfterCompletion 단계 제공
    • 요청 처리 전후에 다양한 작업을 수행할 수 있습니다.

📌 인터셉터 동작 순서

  1. 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에만 적용
데이터 수정 요청 및 응답 데이터 수정 가능 요청과 응답 데이터 수정 불가
사용 단계 웹 애플리케이션 전반 컨트롤러 전/후, 뷰 렌더링 후 단계별 실행
사용 목적 보안, 로깅, 인코딩 처리 인증, 권한 체크, 로깅

정리

  1. 필터(Filter):

    • Servlet 기반에서 동작하며, 요청과 응답을 가로채서 수정할 수 있습니다.
    • 범용적이고 모든 요청에 대해 동작합니다.
  2. 인터셉터(Interceptor):

    • Spring MVC 기반에서 동작하며, Controller 실행 전/후에 추가 작업을 수행합니다.
    • 요청과 응답의 수정은 불가능하지만 로직 처리와 권한 검사 등에 유용합니다.

언제 사용해야 할까?

  • 필터: 보안, 인코딩, 요청/응답 로깅 등 전반적인 요청 처리에 사용합니다.
  • 인터셉터: 권한 검사, 공통 로직, Controller 전후 로직 수행 등 비즈니스 로직 처리에 사용합니다.

'Spring Framework' 카테고리의 다른 글

아규먼트 리졸버(Argument Resolver)  (2) 2024.12.16
InitializingBean  (0) 2024.10.29
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유