6. ApplicationFilterChain → StandardWrapperValve: invoke()
Spring Security를 포함한 모든 필터 처리가 끝나면, Tomcat은 이제 실제 서블릿 호출 단계로 넘어갑니다.
이 문서는 ApplicationFilterChain.doFilter()가 마지막에 어떻게 서블릿 호출 경계로 연결되는지 오픈소스 코드 기준으로 설명합니다.
이번 단계의 역할
필터 체인 단계가 끝나고, 실제 서블릿 실행 단계로 진입하는 전환 구간입니다.
호출 흐름 요약
ApplicationFilterChain.doFilter()가 다음 필터를 계속 호출합니다.- 더 이상 남은 필터가 없으면 마지막 분기로 들어갑니다.
- 그 지점에서 실제
servlet.service(request, response)가 호출됩니다. - 이 호출은
StandardWrapperValve가 준비한 서블릿 인스턴스 경로와 연결됩니다.
호출 흐름 다이어그램
sequenceDiagram
participant Chain as ApplicationFilterChain
participant Servlet
participant MVC as FrameworkServlet / DispatcherServlet
Chain->>Servlet: service(request, response)
Servlet->>MVC: Spring MVC entry
핵심 코드
// ApplicationFilterChain.java
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
if (pos < n) {
filter.doFilter(request, response, this);
return;
}
servlet.service(request, response);
}
// StandardWrapperValve.java
public final void invoke(Request request, Response response) throws IOException, ServletException {
Servlet servlet = ...;
servlet.service(request, response);
}
코드 해설
핵심은 ApplicationFilterChain이 끝나기 전까지는 절대 서블릿이 실행되지 않는다는 점입니다.
즉 보안, 로깅, 공통 전처리 같은 필터가 모두 끝난 뒤에만 실제 애플리케이션 서블릿이 호출됩니다.
설계 의도
1) 필터 기반 공통 처리를 보장하기 위해
서블릿 호출 전에 인증, 인가, 로깅, 압축 같은 공통 처리를 반드시 수행하려면 필터 체인이 먼저 끝나야 합니다.
2) 컨테이너와 애플리케이션 실행 경계를 분리하기 위해
Tomcat은 필터 체인을 관리하고, 마지막에 서블릿 인스턴스를 호출하는 역할만 담당합니다. 이 구조 덕분에 애플리케이션은 컨테이너 전처리 이후의 표준 요청만 받게 됩니다.
다음 단계 연결
다음 문서 7번에서는 Tomcat이 StandardWrapperValve에서 FrameworkServlet.service()를 호출하며 Spring MVC로 진입하는 과정을 봅니다.
← 이전: 5. DelegatingFilterProxy → FilterChainProxy.doFilter() | 다음: 7. StandardWrapperValve → FrameworkServlet