Deep Dive /Java Web /6

6. ApplicationFilterChain → StandardWrapperValve → 서블릿 진입

Tomcat의 FilterChain이 끝나면, 실제로 서블릿이 호출되는 과정을 오픈소스 코드 근거로 분석합니다.


전체 흐름 요약

  1. ApplicationFilterChain의 모든 Filter가 끝나면, doFilter() 내부에서 서블릿 호출로 넘어감
  2. StandardWrapperValve가 서블릿 인스턴스를 찾아 service()를 호출
  3. 이때 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. (작성 예정)