7. StandardWrapperValve → FrameworkServlet: service()
Tomcat은 StandardWrapperValve에서 최종 서블릿 인스턴스를 확보한 뒤 service()를 호출합니다.
Spring MVC 애플리케이션에서는 이 서블릿이 보통 DispatcherServlet 계열이며, 상위 클래스인 FrameworkServlet이 공통 진입점을 제공합니다.
이번 단계의 역할
Tomcat 서블릿 컨테이너에서 Spring MVC 서블릿으로 제어가 넘어가는 구간입니다.
호출 흐름 요약
StandardWrapperValve.invoke(...)가 서블릿 인스턴스를 얻습니다.- Tomcat이
servlet.service(request, response)를 호출합니다. - Spring 쪽에서는
FrameworkServlet.service(...)가 진입점이 됩니다. - 이후
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