Spring

[Spring] 필터(Filter)와 인터셉터(Interceptor) 정리 및 차이점

하부루 2024. 9. 21. 12:00

Filter란?

  • Java 웹 애플리케이션에서 요청과 응답을 처리하기 전에 또는 처리 후에 특정 작업을 수행할 수 있는 강력한 기능
  • 필터는 서블릿과 JSP 기술을 기반으로 한 웹 애플리케이션에서 작동하며, Spring 프레임워크에서도 자주 사용
  • 필터는 인증, 로깅, 보안 검사와 같은 비즈니스 로직과는 독립적인 공통 기능을 처리하는 데 주로 사용

 

Interceptor란?

  • 요청이 컨트롤러에 도달하기 전이나 응답이 클라이언트로 반환되기 전에 추가적인 작업을 수행할 수 있게 해주는 기능
  • 인터셉터는 주로 인증, 권한 체크, 로깅, 데이터 변환 등의 작업에 사용되지만 전역적이지 않음

 

Filter 와 Interceptor의 구조

  • Web Context
    • 클라이언트의 HTTP 요청을 처리하는 전체적인 환경을 의미
    • 웹 서버가 요청을 수신해 Spring Boot 애플리케이션의 Web Context로 전달
    • 여기서 Web Context는 요청을 적절한 Spring MVC 컴포넌트로 라우팅

 

  • Spring Context
    • 애플리케이션에서 사용하는 객체들(빈, Bean)을 관리하는 컨테이너
    • Spring 애플리케이션에서 객체의 생성, 초기화, 설정, 그리고 라이프사이클을 관리

 

  • DispatcherServlet
    • Spring MVC의 핵심 구성 요소
    • 클라이언트의 요청을 받아서 적절한 핸들러(Controller)에게 전달하는 역할

 

  • HandlerMapping
    • 클라이언트로부터 들어온 HTTP 요청을 적절한 핸들러(Controller)로 매핑하는 역할
    • 요청 URL, HTTP 메서드(GET, POST 등), 요청 파라미터 등의 정보에 기반하여 어떤 핸들러가 이 요청을 처리할지 결정

 

🚨 Filter의 위치는 웹 애플리케이션 밖의 Web Context에 위치함

🚨 웹 애플리케이션의 모든 HTTP 요청과 응답에 대해 전역적으로 적용되는 기능을 제공하기 때문

 

Filter 와 Interceptor 사용 예제

[ Filter ]

Filter 정의

  • @Component 어노테이션을 이용해 빈으로 등록해야 필터 사용 가능
  • Filter 인터페이스를 구현해주어야 함

[ 주요 메서드 ]

  • init()
    • 필터가 처음 생성될 때 호출되는 초기화 메서드
    • 필터가 요청을 처리하기 전에 필요한 리소스나 초기 설정 작업을 수행

 

  • doFilter()
    • 클라이언트의 요청이 필터를 통과할 때마다 호출
    • 필터의 주된 작업을 수행하며, 요청을 처리한 후에 다음으로 전달
    • FilterChaindoFilter() 메서드를 호출하여 요청을 다음 필터 또는 서블릿으로 넘김

 

  • destroy()
    • 필터가 종료될 때 호출
    • 필터가 더 이상 사용되지 않을 때 리소스를 정리하거나 종료 작업을 수행하기 위해 사용
     

Filter 실행 결과

[ Interceptor ]

Interceptor 정의

  • HandlerInterceptor 인터페이스를 구현해주어야 함

[ 주요 메서드 ]

  • preHandle()
    • 컨트롤러 이전에 처리해야 하는 전처리 작업이나 요청 정보를 가공하거나 추가하는 경우에 사용
    • preHandle의 반환 타입은 boolean인데 반환값이 true이면 다음 단계로 진행이 되지만, false라면 작업을 중단하여 이후의 작업은 진행되지 않음

 

  • postHandle()
    • 컨트롤러 이후에 처리해야 하는 후처리 작업이 있을 때 사용
    • 컨트롤러에서 작업을 진행하다가 중간에 예외가 발생하면 **postHandle()**은 호출되지 않음

 

  • afterCompletion()
    • 모든 작업이 완료된 후에 실행
    • 요청 처리 중에 사용한 리소스를 반환할 때 사용하기에 적합
    • 컨트롤러에서 작업을 진행하다가 중간에 예외가 발생해도 afterCompletion()은 반드시 호출
     

인터셉터 경로 설정 WebMvcConfigurer.class
Interceptor 실행 결과