| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- jsp permission denied
- 분산파일
- LLM기반 콘텐츠 추천
- staem algorithm
- steam game score
- 자바스크립트 깨질 때
- 스팀 게임 스코어 알고리즘
- set-cookie 안만들어짐
- 존폴결혼예물
- spring unit test
- integrationtest
- 스프링단위테스트방법
- jqxWidget워터마크
- 분산파일시스템
- 존폴반지
- Akamai 연구결과
- cookie refreshToke
- 한글 특수문자 자바스크립트
- 존폴결혼반지
- 존폴쥬얼리
- tomcat튜닝
- 외부 톰캣 특수문자 깨질 때
- dial timeout
- jsp 예외 permission
- jqx워터마크제거
- 비개인화추천모델
- LLM기반CBF
- 동시 요청 처리
- dialtimeout
- 추천시스템steam
- Today
- Total
hola 개발
[ Tomcat ] Tomcat의 네트워크 스택 본문
[ 들어가기 전 ]
현재 회사에서는 서버에 외장 Tomcat을 설치 후 디렉토리 배포를 하는 방식입니다. 취업 전에 Spring boot로만 작업을 했었기에 따로 Tomcat에 대해 깊이 공부한 적이 없었습니다. 하지만 이번에 스케쥴러의 마이그레이션 업무를 담당하게 되었고, 이에 따라 Tomcat도 공부하게 되었습니다.
[ Tomcat의 핵심 : Connector → Coyote → Catalina로 이어지는 파이프라인 ]
전체 구조
Client
↓
[OS TCP stack]
↓
Connector
↓
Coyote (ProtocolHandler)
↓
Endpoint
├─ Acceptor
├─ Poller
└─ Worker (Executor)
↓
Adapter
↓
Catalina (Servlet Container)
├─ Engine
├─ Host
└─ Context
↓
Servlet
# Connector
- server.xml 설정에 따라 Coyote의 ProtocolHandler 구현체를 생성하고 관리하는 역할
- Coyote와 Catalina를 연결하는 브릿지 역할
# Coyote
- 실제 TCP/HTTP 처리를 담당합니다.
- Coyote의 각 레이어에서는 아래와 같이 동작합니다.
클라이언트의 요청이 서버와 TCP 3-way handshake 완료되면 TCP 연결 성립이 되고 OS socket 생성이 되고 kernel에 등록됩니다.
Coyote 내부의 Acceptor가 serverSocket.accept()를 수행하여 OS socket을 가져와 JVM에 socket 인스턴스를 생성 후 Poller queue에 넣습니다.
Poller 내부에 Selector가 있는데, kernel network stack에 segment가 일부라도 kernel buffer에 도착하면 read event가 발생하며, selector가 이를 감지해 읽을 준비된 socket 객체는 Poller를 통해 worker thread에게 넘기게 됩니다.
(참고로 이 때 사용되는 worker thread는 server.xml에서 <Connector> 에서 설정한 worer thread pool에 있는 worker thread 입니다.)
worker thread는 SocketProcessor를 실행합니다.
SocketProcessor는 socket을 읽은 후 Http11Processor를 호출 합니다.
Http11Processor는 HTTP를 해석하여 request line,header 파싱하고 body를 처리하여 Coyote Request를 생성합니다.
그 다음 Mapper가 실행되어 Coyote Request로부터 데이터 파싱하여 Host,Context,Wrapper를 결정합니다.
CoyoteAdapter가 Coyote에서 만든 request와 Mapper 결과를 받아 Catalina의 Engine Pipline 실행을 시작하면서 Catalina 레이어로 진입하게 됩니다.
( Engine Pipline이란 Tomcat에서 요청이 Catalina로 들어온 뒤, Engine → Host→ Context → Wrapper 순서로 Valve 체인을 통해 요청을 하위 컨테이너로 전달하는 실행 구조입니다.)
# Catalina
- Catalina 구조는 아래와 같습니다.
Engine
└─ Host
└─ Context
└─ Wrapper
Engine은 전역 정책, Host는 도메인 정책, Context는 웹앱 실행 준비를 담당하는 Valve들이 각각 Pipeline에 존재하며 단계별로 요청을 처리합니다. 모든 Valve(정책 단계)를 통과하면, 최종적으로 Wrapper에서 Servlet으로 넘어갑니다.
전부터 coyote,catalina 에 대해서 정확히 알지 못했지만, 이렇게 Tomcat의 네트워크 스택을 공부하게 되면서 클라이언트 요청이 어떻게 구체적으로 처리가 되는지 알게 되었습니다.
'자바' 카테고리의 다른 글
| [ JVM ] 왜 같은 API인데 시간이 지날수록 빨라질까? (Spirng) (0) | 2026.04.17 |
|---|---|
| [ Tomcat ] 외장 Tomcat 로그 설정 관련 (0) | 2026.04.14 |
| [ Tomcat ] Spring Boot 디렉토리 배포 방법 (0) | 2026.03.27 |
| [ MSA ] ActiveMQ를 이용한 비동기처리 맛보기 (0) | 2025.03.19 |
| [ Java ] 동기화 비동기화 블로킹 논블로킹 외우지말고 이해하자 (0) | 2024.10.30 |