6. ApplicationFilterChain → StandardWrapperValve → 서블릿 진입
Tomcat의 FilterChain이 끝나면, 실제로 서블릿이 호출되는 과정을 오픈소스 코드 근거로 분석합니다.
전체 흐름 요약
- ApplicationFilterChain의 모든 Filter가 끝나면, doFilter() 내부에서 서블릿 호출로 넘어감
- StandardWrapperValve가 서블릿 인스턴스를 찾아 service()를 호출
- 이때 DispatcherServlet 등 Spring MVC의 진입점이 실행됨
실제 코드 흐름 분석
1) ApplicationFilterChain
// ApplicationFilterChain.java
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
if (pos < n) {
... // Filter 처리
return;
}
// 모든 Filter가 끝나면 서블릿 호출
try {
if (dispatcherWrapsSameObject) {
lastServicedRequest.set(request);
}
servlet.service(request, response); // 서블릿 진입
} finally {
...
}
}
2) StandardWrapperValve
// StandardWrapperValve.java
public final void invoke(Request request, Response response) throws IOException, ServletException {
...
// 서블릿 인스턴스 획득
Servlet servlet = ...;
...
servlet.service(request, response); // 실제 서블릿 호출
...
}
시퀀스 다이어그램
sequenceDiagram
participant FilterChain as ApplicationFilterChain
participant WrapperValve as StandardWrapperValve
participant Servlet
FilterChain->>WrapperValve: invoke()
WrapperValve->>Servlet: service()
설계 의도 및 이유
- FilterChain이 끝나야만 서블릿이 실행되어, 보안/로깅/공통처리 등 사전 작업이 보장됨
- Valve(밸브) 구조로 서블릿 호출 전후에 추가 로직 삽입 가능
- Spring MVC, DispatcherServlet 등은 이 서블릿 진입점에서 동작 시작
← 이전: 5. DelegatingFilterProxy → FilterChainProxy.doFilter() | 다음: 7. (작성 예정)