개요
콘서트 프로젝트에서 대기열을 구현하는 과정에서, 대기열 검증 로직을 어디서 처리할지 고민하게 되었다.
대기열 토큰을 가지고 입장 가능 여부를 검증하는 로직을 작성했는데, 이 로직을 필터나 인터셉터 중 어디에 두는 게 적절할지 알아보면서, 필터와 인터셉터의 차이점과 용도에 대해 정리해보았다.
필터(Filter)
필터는 J2EE 스펙에서 제공하는 기능으로, 디스패처 서블릿(Dispatcher Servlet) 요청 전에 부가적인 작업을 처리할 수 있다. 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이며, 필터는 스프링의 범위를 벗어나 톰캣과 같은 웹 컨테이너에서 관리된다. 즉, 디스패처 서블릿의 전후에 처리되는 것이다.
필터는 디스패처 서블릿 전에 특정 요청을 선별하거나, 요청과 응답을 가로채는 등의 작업을 수행할 수 있다.
디스패처 서블릿에 대한 자세한 내용은 Dispatcher Servlet (디스패처 서블릿) 글을 참고하자.
인터셉터(Interceptor)
인터셉터는 스프링이 제공하는 기능으로, 디스패처 서블릿이 컨트롤러를 호출하기 전과 후에 요청과 응답을 가로채거나, 부가적인 작업을 수행할 수 있다. 필터와 달리 스프링 컨테이너에 의해 관리되며, 핸들러 매핑을 통해 컨트롤러 실행 전에 실행된다.
디스패처 서블릿은 적절한 컨트롤러를 찾기 위해 핸들러 매핑을 사용하는데, 그 결과로 HandlerExecutionChain이 반환된다. 이 실행 체인에 인터셉터가 등록되어 있으면, 인터셉터를 순차적으로 거쳐서 컨트롤러가 실행되며, 등록된 인터셉터가 없다면 바로 컨트롤러가 실행된다.
필터(Filter)와 인터셉터(Interceptor)의 차이 및 용도
구분 | 필터(Filter) | 인터셉터(Interceptor) |
---|---|---|
관리 컨테이너 | 서블릿 컨테이너(톰캣 등) | 스프링 컨테이너 |
스프링의 예외처리 여부 | X | O |
Reqeust/Response 객체 조작 가능 여부 |
O | X |
처리 시점 | 디스패처 서블릿 전/후 | 디스패처 서블릿 이후, 컨트롤러 호출 전/후 |
용도 | - 공통된 보안 및 인증/인가 관련 작업 - 모든 요청에 대한 로깅 또는 감사 - 이미지/데이터 압축 및 문자열 인코딩 - Spring과 분리되어야 하는 기능 |
- 세부적인 보안 및 인증/인가 공통 작업 - API 호출에 대한 로깅 또는 감사 - Controller로 넘겨주는 정보(데이터)의 가공 |
참고 링크
'프레임워크 > Spring' 카테고리의 다른 글
Spring Boot 콘서트 예약 시나리오 동시성 문제 분석 (2) | 2024.10.31 |
---|---|
Spring Global Exception Handler (전역 예외 처리) (0) | 2024.10.20 |