Deep Dive /Java Web /7

7. StandardWrapperValve → FrameworkServlet: service()

Tomcat은 StandardWrapperValve에서 최종 서블릿 인스턴스를 확보한 뒤 service()를 호출합니다. Spring MVC 애플리케이션에서는 이 서블릿이 보통 DispatcherServlet 계열이며, 상위 클래스인 FrameworkServlet이 공통 진입점을 제공합니다.


이번 단계의 역할

Tomcat 서블릿 컨테이너에서 Spring MVC 서블릿으로 제어가 넘어가는 구간입니다.


호출 흐름 요약

  1. StandardWrapperValve.invoke(...)가 서블릿 인스턴스를 얻습니다.
  2. Tomcat이 servlet.service(request, response)를 호출합니다.
  3. Spring 쪽에서는 FrameworkServlet.service(...)가 진입점이 됩니다.
  4. 이후 processRequest(...)로 공통 요청 처리가 이어집니다.

호출 흐름 다이어그램

sequenceDiagram participant WrapperValve as StandardWrapperValve participant FrameworkServlet WrapperValve->>FrameworkServlet: service(request, response) FrameworkServlet->>FrameworkServlet: processRequest(...)

핵심 코드

// StandardWrapperValve.java
public final void invoke(Request request, Response response) throws IOException, ServletException {
    Servlet servlet = ...;
    servlet.service(request, response);
}
// FrameworkServlet.java
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    processRequest(request, response);
}

코드 해설

이 단계에서 중요한 것은 Tomcat이 Spring MVC 내부 구조를 모른 채 표준 service() 계약만 호출한다는 점입니다. 즉 컨테이너는 서블릿 스펙만 알고, 그 뒤의 MVC 세부 흐름은 Spring이 책임집니다.


설계 의도

1) 서블릿 표준 계약을 유지하기 위해

Tomcat은 특정 프레임워크 API를 알 필요 없이 Servlet.service()만 호출하면 됩니다.

2) Spring MVC 공통 진입점을 제공하기 위해

FrameworkServlet은 요청/응답 캐스팅과 공통 처리를 담당하고, 이후 하위 구현인 DispatcherServlet으로 세부 MVC 흐름을 넘깁니다.


다음 단계 연결

다음 문서 8번에서는 FrameworkServlet 공통 처리 이후 DispatcherServlet.doDispatch()가 실제 MVC 오케스트레이션을 시작하는 장면을 봅니다.

← 이전: 6. ApplicationFilterChain → StandardWrapperValve | 다음: 8. FrameworkServlet → DispatcherServlet