Spring

[Spring] Filter와 Interceptor 차이

찹쌀궁뎅이 2025. 3. 18. 14:30
반응형

새로운 프로젝트를 시작하면서 Redis를 통하여 세션 관리를 하도록 설정하였다. 그래서 세션이 없어도 사용할 수 있는 API 이외에는 세션 체크를 공통으로 처리해줘야 했다.
처음에 잘 모르고 Filter로 무작정 설정하였다가 복잡한 세팅으로 애를 먹고 Interceptor로 수정하며 찾아본 Filter와 Interceptor의 차이점을 알아보았다.


1. Filter란?

Filter는 DispatcherServelt에 요청이 전달되기 전/후에 URL 패턴에 맞는 모든 요청에 대하여 부가 작업 처리할 수 있는 기능을 제공한다.

Filter 주요 특징

  • ServeltRequest, ServleResponse 객체를 직접 다룰 수 있음
  • DispatcherServlet 이전 단계에서 실행되므로 Spring MVC와 무관하게 동작
  • 요청(Request)과 응답(Response)에 모두 적용 가능

Filter 사용 예시

@Slf4j
public class CustomFilter implements Filter {

    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
        log.info("필터 초기화");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        System.out.println("필터 실행: 요청 전 처리");
        
        chain.doFilter(request, response); // 다음 필터 or 서블릿 실행

        System.out.println("필터 실행: 응답 후 처리");
    }
    
    @Override  
    public void destroy() {  
        log.info("필터 종료");
    }
}
  • init(): Filter 인스턴스 초기화 시 한 번만 실행되는 메소드
  • doFilter(): 요청(Request)과 응답(Response)을 가로채서 처리하는 핵심 메소드
  • destroy(): 필터가 제거될 때 실행되는 메소드

이 중에서 주로 doFilter를 자주 사용하게 되고, 주요 핵심 메소드이다.

 

2. Interceptor란?

intercept라는 단어가 ‘가로채기’라는 뜻이다. 그래서 Interceptor는 Dispatcher Servelt이 Controller를 호출하기 전후로 가로채서 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다.
추가로 만약 Interceptor가 여러 개 등록되었으면 순차적으로 Interceptor를 수행 후 Controller를 실행하게 된다. 

Interceptor 주요 특징

  • Spring MVC의 HandlerInterceptor 인터페이스를 구현
  • Spring의 컨텍스트(Bean, Service, Repository 등) 접근 가능
  • 특정 컨트롤러 요청에 대해 적용할 수 있음

Interceptor 사용 예시

아래는 Interceptor의 Interface이며 preHandle (), postHandle(), afterCompletion() 총 3가지의 메소드로 구성되어있다.

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("인터셉터 실행: 컨트롤러 호출 전");
        return true; // false 반환 시 요청을 중단함
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("인터셉터 실행: 컨트롤러 호출 후");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("인터셉터 실행: 뷰 렌더링 후");
    }
}

 

  • preHandle() : 컨트롤러가 실행되기 전에 실행되는 메소드이다. 그래서 Controller 이전에 처리해야 하는 전처리나 가공을 해당 메소드에서 실행할 수 있다. 해당 메소드는 return 타입이 boolean인데 true일 경우 다음 단계로 진행되지만 false인 경우 다음 단계(다음 Interceptor, Controller 등의 작업)를 진행하지 않는다.
  • postHandle() : 컨트롤러 실행 후, 뷰 렌더링 전에 실행되는 메소드이다. 그래서 Controller 이후에 후처리가 필요할 경우 해당 메소드에서 실행할 수 있다.
  • afterCompletion() : 뷰가 렌더링 된 후에 실행되는 메소드이다.

 

3. Filter와 Interceptor의 차이점

구분 🛠 Filter (필터) 🚀 Interceptor (인터셉터)
동작 위치 Servlet 수준에서 동작 Spring MVC 수준에서 동작
실행 시점 DispatcherServlet 실행 전 컨트롤러 실행 전/후, 뷰 렌더링 전
주요 용도 인코딩, 인증, 보안 (XSS Filter 등), 로깅 API 요청 검증, 권한 체크, 공통 응답 처리
Request/Response 조작 가능 여부 O X
Spring Context 접근 가능 여부 X O

 


 

반응형