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 ]
- @Component 어노테이션을 이용해 빈으로 등록해야 필터 사용 가능
- Filter 인터페이스를 구현해주어야 함
[ 주요 메서드 ]
- init()
- 필터가 처음 생성될 때 호출되는 초기화 메서드
- 필터가 요청을 처리하기 전에 필요한 리소스나 초기 설정 작업을 수행
- doFilter()
- 클라이언트의 요청이 필터를 통과할 때마다 호출
- 필터의 주된 작업을 수행하며, 요청을 처리한 후에 다음으로 전달
- FilterChain의 doFilter() 메서드를 호출하여 요청을 다음 필터 또는 서블릿으로 넘김
- destroy()
- 필터가 종료될 때 호출
- 필터가 더 이상 사용되지 않을 때 리소스를 정리하거나 종료 작업을 수행하기 위해 사용
[ Interceptor ]
- HandlerInterceptor 인터페이스를 구현해주어야 함
[ 주요 메서드 ]
- preHandle()
- 컨트롤러 이전에 처리해야 하는 전처리 작업이나 요청 정보를 가공하거나 추가하는 경우에 사용
- preHandle의 반환 타입은 boolean인데 반환값이 true이면 다음 단계로 진행이 되지만, false라면 작업을 중단하여 이후의 작업은 진행되지 않음
- postHandle()
- 컨트롤러 이후에 처리해야 하는 후처리 작업이 있을 때 사용
- 컨트롤러에서 작업을 진행하다가 중간에 예외가 발생하면 **postHandle()**은 호출되지 않음
- afterCompletion()
- 모든 작업이 완료된 후에 실행
- 요청 처리 중에 사용한 리소스를 반환할 때 사용하기에 적합
- 컨트롤러에서 작업을 진행하다가 중간에 예외가 발생해도 afterCompletion()은 반드시 호출