Tomcat 은 어떻게 동작할까? - Spring 과의 연동을 중점으로 (1)
23년 5월에 작성한 글입니다.
개요
- 본 시리즈에서는 사용자의 요청이 톰캣에서 어떻게 처리되어 우리가 작성한 비즈니스 로직에 도달하는지에 대해 다룹니다.
- 첫번째 편에서는 Servlet 과 Tomcat 의 주요 개념을 정리합니다.
사용한 버전
- Servlet: 4.0.1
- Tomcat: 9.0.60
- Spring Boot: 2.6.6
- Spring WebMvc: 5.3.18
Servlet 개념 정리
Java Servlet
- Servlet
- Java 기반의 웹 컴포넌트로 동적 콘텐츠 를 생성
- Servlet Container 에 의해 관리됨
- Servlet Container
- Web Application Server 의 일부로 수명 주기 동안 Servlet 을 포함하고 관리
- HTTP/1.1 과 HTTP/2 를 지원해야함
- Web Application Server 에서 요청을 받아 Servlet Container 로 넘기고 Servlet Container 는 적절한 Servlet 을 찾아 실행
Servlet Context
- Servlet Config
- Servlet Container 가 Servlet 초기화시에 사용
- Servlet 에게 초기화 파라미터 제공
- Servlet 에게 Servlet Context 에 대한 접근 제공
- Servlet Context
- 특정 경로에 설정될수 있음 (
http://example.com/context1
, http://example.com/context2
)
- Servlet 의 런타임 환경 정보를 지님
- Servlet, Filter, Listener 생성, 설정 가능
- Web Application
- Servlet, JSP 페이지, 클래스, 정적 문서 등의 모음
- Servlet Context 와 1대1 관계를 지님
- Web ARchive format (WAR) 파일로 패키징 될수 있음
톰캣 용어 정리
Server
- Server
- 전체 카탈리나 서블릿 컨테이너를 의미합니다.
- Catalina: 톰캣에서 제공하는 서블릿 컨테이너
- 루트 컴포넌트 입니다.
- 1..N 개의 Service 를 가집니다.
- Service
- 1..N 개의 Connector 와 1개의 Engine 으로 구성됩니다.
- Server 안에 속합니다.
- Connector
- 클라이언트와의 통신을 담당
- HTTP1.1 Conenctor, HTTP2 Connector, AJP Connector 존재
- Coyote: 톰캣에서 제공하는 HTTP Connector
Container
- Engine
- 전체 카탈리나 서블릿 엔진을 의미하는 컨테이너 입니다.
- Service 에 속하여 하나 이상의 Connector 로부터 모든 요청을 수신 및 처리하여 응답합니다.
- 구현에 따라 Host 혹은 Context 를 자식 컨테이너로 가집니다.
- Host
- 카탈리나 서블릿 엔진에서 가상 호스트를 나타내는 컨테이너 입니다.
- 네트워크 이름을 가집니다. (ex:
www.example.com
)
- 주로 부모 컨테이너로는 Engine 을 자식 컨테이너로는 Context 를 가집니다.
- Context
- 카탈리나 서블릿 엔진에서 Servlet Context 를 (Web Application) 나타내는 컨테이너 입니다.
- 해당 Web Application 은 WAR 파일에 기반합니다.
- 특정 경로에 설정되어 클라이언트로부터 요청이 왔을때, 선택되며
선택된 Context 는 WAR 파일에 정의된 서블릿 매핑에 따라 서블릿을 호출합니다.
- Loader
- Wab Application 클래스 로더로서 필요한 클래스와 리소스를 로딩합니다.
/WEB-INF/classes
의 클래스 파일
/WEB-INF/lib
의 JAR 파일
- Valve
- 컨테이너(
Engine
, Host
, Context
) 내에서 요청을 처리합니다.
- 파이프라인으로 구성되어 서로 연결됩니다.
- 다양한 Valve 구현체가 존재합니다.
AccessLogValve
RemoteAddrValve
ErrorReportValve
HealthCheckValve
- ...
- Realm
- 사용자의 이름, 패스워드, 권한 정보를 저장합니다.
- 다양한 인증정보 시스템과 통합하여 컨테이너에서 관리하는 보안 구성을 만들수 있습니다.
결론
- 사용자의 요청은 아래의 과정을 거쳐 Servlet 에 도달합니다.
Servlet 스펙
Tomcat 스펙
Reference
- Servlet 4.0
- 톰캣 공식 문서
- Spring 공식 문서