레벨 4의 첫 미션은 "Tomcat 구현하기" 였다.
그동안 내가 알고 있던 Tomcat은 Web Application Server 중 하나로, 스프링 부트가 톰캣을 내장하고 있다는 정도였다.
이번 미션을 통해 Tomcat의 구성 요소와 역할 등등에 대해 더 자세하게 공부하고자 글을 작성하게 되었다.
이번 글에서는 톰캣의 역할과 전체적인 구조에 대해 다루고자 하니 참고바란다.
톰캣
톰캣이란
먼저 톰캣이란 무엇일까?
Tomcat은 Apache 재단에서 릴리즈한 Web Application Server이다.
이때 Apache는 같은 재단에서 릴리즈한 Web Server인데, 때문에 나는 톰캣이 웹 서버의 역할을 전혀 하지 않는 줄 알고 있었다.
(정확히 말하자면 명확히 구분되어 사용하는 줄 알았다)
Tomcat의 주요 역할은 WAS이지만, 정적 파일 처리 등 제한적으로 Web Server의 역할도 수행한다. Tomcat 뿐만 아니라 Oracle의 WebLogic 등 대부분의 WAS는 웹 서버 역할을 포함하고 있다고 한다.
Was와 Web Server이 무엇인지 궁금하다면 aws의 이 글이 설명이 잘되어있기 때문에 참고하면 좋을 듯하다.
톰캣의 요청 처리 과정
톰캣의 요청 처리 과정은 다음과 같다. 갱장히 복잡함
그림만 봐서는 하나도 모르겠으니 전체적인 톰캣의 컴포넌트와 구조를 파악해보자.
톰캣의 구조
그렇다면 톰캣은 어떤 구조로 이루어져 있으며 어떻게 요청을 처리할 수 있는지 살펴보자.
톰캣은 크게 5개의 컴포넌트로 이루어져 있다.
- Server
- Service
- Engine
- Host
- Connector
하나씩 각 컴포넌트가 무엇을 관리하는지 알아보자
톰캣의 컴포넌트
1. Server
Tomcat의 최상위 컴포넌트인 Server는 전체 컨테이너를 나타낸다.
또한 Server는 Tomcat 서버 전체에서 공유되는 자원인 Global Resource를 관리한다. Global Resource에는 대표적으로 Database Connection Pool가 있다.
즉, 최상위 컴포넌트가 Database Connection Pool 같은 리소스를 관리함으로써 자원이 여러 Service에서 사용되도 한 곳에서 관리할 수 있게 되는 것이다.
Server는 여러개의 Service를 가질 수 있으며, Tomcat Server를 실행하는 것은 전체 Tomcat 인스턴스, 즉 Web Application Server(WAS)를 시작하는 것과 같다고 생각해도 될 듯하다.
2. Service
Tomcat Service는 하나 이상의 Connector와 하나의 Engine을 그룹화하는 계층이다.
Connector를 통해 받은 클라이언트의 요청을 적절한 Engine으로 전달한다.
설정 예시를 통해 알아보자.
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="engines" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- Context 설정들 -->
</Host>
</Engine>
</Service>
예시를 보면 HTTP(8080 포트)와 AJP(8009 포트) 등 여러 Connector로부터 요청을 받는다. 두 커넥터로부터 받은 모든 요청은 "engines"라는 Engine에 의해 처리하게 된다.
보통은 Connector 또한 하나만 사용한다고 하니, 이점 또한 알아두면 좋을 듯 하다.
3. Engine
Engine은 서비스에 대한 요청 처리 파이프라인을 나타낸다. 쉽게 말해 요청을 처리한다.
앞서 서비스 설명에 잠깐 나왔지만, 서비스는 여러 개의 Connector가 있을 수 있는데, 엔진은 이러한 커넥터로부터 모든 요청을 수신하고 처리하여 클라이언트에 전송할 적절한 커넥터로 응답을 다시 전달하는 역할을 한다.
Engine 또한 여러 Host 컨테이너를 포함할 수 있으며, 각 Host는 특정 도메인에 대한 요청을 처리한다.
따라서 하나의 엔진에서 여러개의 Host에 대한 요청을 처리할 수도 있다.
4. Host
Host는 Tomcat에서 특정 도메인 이름에 대한 요청을 처리하는 가상 호스트를 나타낸다.
특정 도메인 이름에 대한 요청을 적절한 웹 애플리케이션(Context)으로 라우팅하며 여러 웹 애플리케이션을 호스팅할 수 있다.
또한 Host는 도메인별로 로그 파일, 애플리케이션 디렉토리 등을 분리하여 관리할 수 있게 한다.
🤔 가상 호스트가 뭐지?
가상호스트 (Virtual Host)는 한 컴퓨터에서 여러 웹사이트를 (예를 들어, www.company1.com과 www.company2.com) 서비스함을 뜻한다.
가상호스트에는 "IP기반 (IP-based)" 방식과 "이름기반 (name-based)" 방식이 있다. 가상호스트 때문에 여러 사이트들이 같은 서버에서 돌고있다는 사실을 웹사용자는 눈치채지 못한다.
같은 서로 다른 도메인을 같은 서버에서 호스팅하면서도, 각각을 별도의 웹사이트처럼 운영할 수 있다는 장점이 있다.
Apache 가상 호스트 문서 참고
5. Connector
Connector는 클라이언트와 Tomcat 서버 사이의 통신을 담당하는 컴포넌트로, 클라이언트로부터 요청을 받아 내부 Tomcat의 Engine 로 전달한다. 그 후 응답을 다시 클라이언트에게 전송한다.
Connector의 종류로는
- HTTP/1.1 프로토콜을 지원하는 HTTP Connector
- HTTP/2 프로토콜을 지원하는 HTTP/2 Connector
- Apache 웹 서버와의 통신에 사용되는 AJP (Apache JServ Protocol) Connector
등이 있다.
Context, Servlet
그런데 그림에는 있지만 아직 나오지 않은 Context, Servlet란 뭘까?
Context란 바로 하나의 웹 애플리케이션을 나타내는 컴포넌트다.
예시로, 쉽게 말해 보통 우리가 스프링 부트로 프로젝트 하나를 개발하면 스프링 애플리케이션을 개발했다고도 하는데, 이런 하나의 웹 프로젝트?라고 생각하면 된다.
Servlet이란 자바 진영에서 웹 개발을 하기 위해 사용하는 웹 사양이다.
쉽게 말해, HttpServlet 클래스를 생각해보면 된다. HttpServlet를 통해 우리는 Http Protocol 기반의 웹 요청을 처리할 수 있는데, 이를 생각하면 된다.
따라서 Context, Servlet는 톰캣의 컴포넌트라기 보다는 Tomcat이 구현하고 관리하는 Java EE의 표준 컴포넌트이다. (착각금지)
참고
https://tomcat.apache.org/tomcat-10.1-doc/architecture/overview.html
'우아한테크코스 6기 > 4단계' 카테고리의 다른 글
API 성능 개선하기 2탄 (feat. 검색 전문 인덱스 적용하기) (1) | 2024.09.28 |
---|---|
API 성능 개선하기 1탄 (feat. N + 1과 불필요한 쿼리 개선) (0) | 2024.09.25 |
ApplicationContext vs ServletContext (0) | 2024.09.17 |
Tomcat의 Coyote와 Catalina에 대해 알아보자 (1) | 2024.09.08 |
Http Status 300 Multiple Choices와 수동 리다이렉션은 언제 사용할까? (0) | 2024.09.04 |