2026-05-20
# [TIL] 서블릿 필터(Filter)와 스프링 인터셉터(Interceptor)의 본질적 차이
- 날짜: 2026-05-20
- 카테고리: Web Development / Backend Architecture
- 키워드: Servlet, Filter, Listener, Spring MVC, Interceptor
---
## 1. 개요: 웹 애플리케이션의 공통 관심사 (Cross-Cutting Concerns)
웹 개발을 진행하다 보면 로그인 인증, 권한 체크, 한글 인코딩 설정 등 모든 페이지(URL)에서 공통으로 처리해야 하는 일들이 발생한다. 이를 모든 서블릿이나 컨트롤러에 일일이 비즈니스 로직과 함께 구현하면 코드의 중복이 심해지고 유지보수가 불가능해진다.
자바 웹 에코시스템에서는 이러한 공통 작업을 효율적으로 처리하기 위해 요청을 중간에 가로채는 도구인 필터(Filter)와 인터셉터(Interceptor)를 제공한다. 비슷해 보이지만 구동되는 생태계와 동작 원리가 완전히 다른 두 기술의 차이를 정리한다.
---
## 2. 서블릿 컨테이너의 핵심 요소: Filter와 Listener의 구분
인터셉터를 이해하기 전, 톰캣(Tomcat)과 같은 웹 컨테이너 수준에서 구동되는 두 기술의 차이를 명확히 해야 한다.
### ① 필터 (Filter)
- 정의: HTTP 요청과 응답을 거르고 가공하는 서블릿 표준 기술. 아파트 단지의 '정문 경비원'과 같다.
- 동작 특징:
- 여러 필터가 연쇄적으로 사슬처럼 엮인 *FilterChain** 구조로 동작한다.
- 반드시 다음 단계로 요청을 넘겨주는 *chain.doFilter(request, response)**를 호출해야 한다. 만약 개발자의 실수로 이를 누락하면 요청이 다음 단계(스프링 영역 등)로 넘어가지 못하고 공중분해(먹통)된다.
- 요청HttpServletRequest)과 응답HttpServletResponse) 객체 자체를 조작할 수 있는 강력한 통제권을 가진다.
### ② 리스너 (Listener)
- 정의: 웹 애플리케이션 내의 특정 객체 상태 변화나 생명주기(Life Cycle) 이벤트를 감시하는 센서/CCTV.
- 동작 특징:
- 웹 애플리케이션의 시작/종료, 세션 생성/소멸 등의 이벤트가 발생할 때 백그라운드 작업을 처리한다.
- 필터와 달리 지나가는 HTTP 요청/응답 데이터를 중간에 가로채거나 수정(조정)하는 일은 불가능하다.
---
## 3. 스프링의 가로채기 도구: 인터셉터 (Interceptor)
### ① 인터셉터의 정의
인터셉터(Interceptor)는 단어 뜻 그대로 흘러가는 요청을 '중간에 낚아채는 도구'이다. 서블릿 표준 기술이 아닌 '스프링 MVC 프레임워크'가 제공하는 독자적인 기술이다.
### ② 구동 위치
서블릿 컨테이너를 통과하여 스프링의 대표 서블릿인 디스패처 서블릿(Dispatcher Servlet)에 요청이 도착한 후, 실제 업무를 처리하는 컨트롤러(Controller)로 넘어가기 직전과 직후의 길목(스프링 컨테이너 내부)을 지킨다.
### ③ 핵심 동작 메서드 HandlerExecutionChain)
인터셉터는 서블릿 체인과 달리 스프링의 제어 하에 3가지 정교한 타이밍에 개입한다.
1. *preHandle() (컨트롤러 실행 전):** true를 반환하면 다음 단계로 진행하고, false를 반환하면 요청을 즉시 중단하여 컨트롤러를 실행하지 않는다. (로그인 인증 체크의 핵심 길목)
2. *postHandle() (컨트롤러 실행 후):** 컨트롤러가 비즈니스 로직을 마친 직후 실행되며, 반환된 데이터나 화면 정보ModelAndView)를 가공할 수 있다.
3. *afterCompletion() (뷰 렌더링 후):** 모든 요청 처리가 끝나고 클라이언트에게 화면이 전달된 후 실행된다. 에러 발생 여부를 확인하여 실행 시간을 측정하거나 리소스를 해제(로그 정리 등)하는 데 쓰인다.
---
## 4. 핵심 차이점 비교 (Filter vs Interceptor)
| 비교 항목 | 필터 (Filter) | 인터셉터 (Interceptor) |
| :--- | :--- | :--- |
| 관리 주체 | 웹 컨테이너 (Tomcat 등 서블릿 영역) | 스프링 컨테이너 (Spring MVC 영역) |
| 작동 위치 | 웹 애플리케이션의 최전방 (스프링 바깥) | 디스패처 서블릿과 컨트롤러 사이 (스프링 내부) |
| 스프링 Bean 접근 | 기본적으로 불가능 (특별한 설정 필요) | 의존성 주입(DI)을 통해 자유롭게 접근 가능 |
| 예외(에러) 처리 | 스프링 바깥이므로 스프링의 예외 처리기 사용 불가 ➡️ 톰캣 자체 에러 페이지 노출 | 스프링 내부이므로 @ControllerAdvice 등을 통해 예쁜 에러 화면이나 JSON으로 제어 가능 |
---
## 5. 결론: 언제 무엇을 써야 할까?
- 필터(Filter) 추천:
- 자바 웹 애플리케이션 전체에 공통으로 적용되어야 하는 거대하고 로우레벨(Low-level)인 웹 표준 작업.
- 예시: UTF-8 인코딩 설정, XSS 및 CORS 같은 전반적인 웹 보안 방어, 로깅, 대용량 데이터 압축.
- 인터셉터(Interceptor) 추천:
- 주소(URL)별로 세밀하게 제어해야 하며, 데이터베이스 조회 등 스프링의 자원과 비즈니스 로직을 적극적으로 활용해야 하는 작업.
- 예시: 세션 기반 로그인 인증 체크, 세부 페이지 접근 권한 검사, 컨트롤러로 넘겨주는 데이터 가공.
---
## 6. 오늘의 한 줄 깨달음 (Takeaway)
> "전체 아파트 단지 정문을 지키며 거대 보안을 책임지는 경비원(필터)과, 각 호수 문 앞 비서실에서 집안 내부 장부(Bean)를 열어보며 꼼꼼하게 손님을 맞이하는 비서(인터셉터)의 역할 분담을 이해하자."
댓글
댓글이 없습니다.
