스프링 MVC | Filter와 Interceptor

Faithful Dev·2025년 2월 25일

스프링 프레임워크

목록 보기
12/20

Spring MVC에서 필터(Filter)인터셉터(Interceptor)는 둘 다 요청과 응답의 흐름을 가로채어 처리하는 기능을 제공한다. 하지만 동작 시점적용 범위에서 차이가 있다.


필터 (Filter)

필터(Filter)서블릿(Servlet) 스펙에 정의된 기능으로, DispatcherServlet에 도달하기 전에 요청과 응답을 처리한다. 주로 웹 애플리케이션의 전반적인 요청/응답을 처리하는 데 사용된다.

  • 위치: 서블릿 컨테이너 레벨 (예: Tomcat)
  • 적용 범위: 모든 요청 (/* 경로)
  • 주요 사용 목적:
    • 인코딩 설정 (예: UTF-8)
    • 보안 검사 (예: 인증, 권한 확인)
    • 로깅 및 요청/응답 가공
  • 실행 시점:
    1. 클라이언트 요청 수신
    2. 서블릿 컨테이너 → 필터 실행
    3. DispatcherServlet 호출 전 처리
    4. 서블릿 처리 후 응답 전 다시 필터 실행 (응답 가공)

구현 예시

@WebFilter(urlPatterns = "/*")
public class LoggingFilter implements Filter {
	@Override
    public void doFilter(ServletRequest request, ServletReponse response, FilterChain chain)
    		throws IOException, ServletException {
        System.out.println("Request received at: " + new Date());
        chain.doFilter(request, response); // 다음 필터나 서블릿으로 요청 전달
	}
}

인터셉터 (Interceptor)

인터셉터(Interceptor)Spring MVC 레벨에서 동작하며, 주로 컨트롤러(Controller)에 도달하기 직전/직후에 요청을 가로채어 처리한다.

  • 위치: Spring MVC의 DispatcherServlet 내부
  • 적용 범위: 스프링 컨트롤러 핸들러 (핸들러 메서드)
  • 주요 사용 목적:
    • 권한 체크
    • 로깅 및 감사 (Auditing)
    • 비즈닛스 로직 전/후 처리
  • 실행 시점:
    1. DispatcherServlet → 인터셉터 (preHandle)
    2. 컨트롤러 메서드 호출
    3. 인터셉터 (postHandle)
    4. 뷰 렌더링 후 인터셉터 (afterCompletion)

구현 예시

public class LoggingInterceptor implemenets HandlerInterceptor {
	@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    	System.out.println("Before handling the request: " + request.getRequestURI());
        return true; // 요청 계속 진행
	}
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object Handler, ModelAndView modelAndView) {
    	System.out.println("After handling the request");
	}
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    	System.out.println("After rendering the view");
	}
}

등록 방법

@Configuration
public class WebConfig implements WebMvcConfigurer {
	@Override
    public void addInterceptors(InterceptorRegistry registry) {
    	registry.addInterceptor(new LoggingInterceptor());
	}
}

주요 차이점

특징필터 (Filter)인터셉터 (Interceptor)
실행 위치서블릿 컨테이너 레벨Spring MVC DispatcherServlet 내부
동작 시점DispatchServlet 이전/이후컨트롤러 호출 전/후, 뷰 렌더링 이후
주요 용도공통 기능 적용 (인코딩, 인증, 로깅 등)비즈니스 로직 처리 전후의 작업 (권한 체크 등)
적용 범위전체 애플리케이션 요청/응답특정 URL 매핑 또는 컨트롤러 메서드 수준
설정 방법@WebFilter 또는 FilterRegistrationBeanWebMvcConfigureraddInterceptors() 사용

실행 순서

요청(Request) 처리 순서

필터 (Filter) → DispatcherServlet → 인터셉터 (Interceptor) → 컨트롤러 → 인터셉터 (postHandle) → 응답 처리 → 인터셉터 (afterCompletion) → 필터 (Filter) → 클라이언트

응답(Response) 처리 순서

필터 (Filter) → 인터셉터 (afterCompletion) → 뷰 렌더링 → 인터셉터 (postHandle) → 컨트롤러 응답 → DispatcherServlet → 필터 (Filter)


언제 사용해야 할까?

필터 (Filter)

  • 서블릿 레벨에서 공통적인 전처리/후처리가 필요할 때 (예: 요청 인코딩, CORS 설정)
  • 스프링 프레임워크와 무관한 서블릿 관련 작업이 필요할 때

인터셉터(Interceptor)

  • 컨트롤러 전/후 로직에 집중할 때 (예: 인증, 권한 검사, 로깅)
  • 스프링 빈 주입이 필요한 경우
profile
Turning Vision into Reality.

0개의 댓글