241206 TIL - Spring Filter와 Interceptor

J_log·2024년 12월 6일
0
post-thumbnail

Interceptor와 Filter는 요청 처리 과정에서 공통 작업을 수행하기 위해 사용된다. 하지만 두 개념은 서로 다른 용도와 실행 범위를 가진다.

1. Filter

필터는 Servlet 레벨에서 동작하며, 요청이 DispatcherServlet에 도달하기 전에 처리된다.

  • Java EE 표준으로 구현 (javax.servlet.Filter)
  • DispatcherServlet이 처리하기 전의 요청/응답에 대해 작업 가능
  • 모든 요청에 대해 공통 작업을 수행할 때 적합, 로그인 검증, 인코딩 설정 등

Filter 동작 흐름
1. 클라이언트 요청 -> Filter -> DispatcherServlet -> 컨트롤러
2. 컨트롤러 응답 -> DispatcherServlet -> Filter -> 클라이언트 반환

@Component
public class CustomFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 요청 전 처리
        System.out.println("Filter: 요청 전 처리");
        
        chain.doFilter(request, response); // 다음 필터로 전달 (또는 DispatcherServlet)
        
        // 응답 후 처리
        System.out.println("Filter: 응답 후 처리");
    }
}

2.Interceptor

인터셉터는 Spring MVC 레벨에서 동작하며, DispatcherServlet이 요청을 컨트롤러로 전달하기 전후를 가로챈다. HandlerInterceptor 인터페이스를 구현하여 사용한다.

  • Spring MVC의 기능이며, 컨트롤러와 뷰 사이의 로직에 집중
  • 특정 URL 패턴에 따라 요청을 필터링 가능
  • 요청을 컨트롤러로 넘기기 전, 후처리를 할 때 적합, 권한 체크, 로깅 등

Interceptor 동작 흐름
1. 클라이언트 요청 -> DispatcherServlet -> Interceptor -> 컨트롤러
2. 컨트롤러 응답 -> Interceptor -> DispatcherServlet -> 클라이언트 반환

@Component
public class CustomInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 요청 전 처리
        System.out.println("Interceptor: 요청 전 처리");
        return true; // true: 요청 진행, false: 요청 차단
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 컨트롤러 처리 후, 뷰 렌더링 전
        System.out.println("Interceptor: 컨트롤러 처리 후");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 뷰 렌더링 후
        System.out.println("Interceptor: 뷰 렌더링 후");
    }
}

Filter와 Interceptor 차이점 정리

구분FilterInterceptor
레벨ServletSpring MVC
진입 시점DispatcherServlet 이전DispatcherServlet 이후
목적전역적인 요청/응답 처리컨트롤러와 관련된 요청 전/후 처리
주요 기능인코딩, 보안, CORS, 요청/응답 로깅권한 체크, 세션 관리, 로깅, 비즈니스 처리
적용 대상모든 요청특정 URL 패턴에 맞는 요청
기술 스펙Java EE 표준Spring MVC 전용

Filter와 Interceptor 함께 사용하기

Filter와 Interceptor는 동시에 사용할 수 있다.
Filter는 전역적인 작업(인증 토큰 확인)에 사용하고, Interceptor는 비즈니스 로직 중심의 작업(사용자 역할에 따른 권한 확인)에 활용할 수 있다.

실행 순서

Filter -> DispatcherServlet -> Interceptor -> 컨트롤러
반환은 역순으로 실행된다.

결론적으로 Filter와 Interceptor는 비슷해 보이지만, 용도와 적용 범위가 다르다
전역적인 작업은 Filter, 컨트롤러 관련 작업은 Interceptor를 이용하면 좋다고 생각한다.

0개의 댓글