1. 프로토콜 핸들러 (Protocol Handler)
• 클라이언트가 HTTP/HTTPS 요청을 보내면, 가장 먼저 프로토콜 핸들러가 이 요청을 처리해.
• Tomcat은 주로 HTTP/1.1, HTTP/2, AJP 같은 프로토콜을 처리하는 핸들러를 가지고 있어. 이 핸들러는 들어오는 네트워크 연결을 처리하고, 이를 Tomcat 내부에서 사용할 수 있는 요청 객체로 변환해줘.
• 예를 들어, Http11Protocol은 HTTP/1.1 요청을 처리하는 프로토콜 핸들러야. 이 핸들러는 들어오는 TCP 연결을 처리하고, 요청을 커넥터로 넘겨.
2. 커넥터 (Connector)
• Tomcat 커넥터는 프로토콜 핸들러에서 받은 요청을 처리하고, Tomcat의 내부 엔진으로 전달하는 역할을 해. 이 단계에서 Coyote 커넥터가 사용되는데, Coyote는 Tomcat이 사용하는 기본 HTTP 커넥터야.
• Coyote는 클라이언트의 요청을 받으면, 이를 HTTP 요청 메시지로 변환해서 내부의 서블릿 컨테이너에 전달할 준비를 해.
• Coyote는 실제로 요청을 처리하기 위해 프로토콜 핸들러와 엔진 간의 연결을 담당하며, 클라이언트가 보낸 요청을 분석하고, 요청의 메타데이터(헤더, 파라미터 등)를 추출해 Tomcat 내부로 전달해.
3. Coyote
• Coyote는 Tomcat의 커넥터 구현체로, HTTP 요청을 받아서 Catalina 엔진과 서블릿 컨테이너에 전달하는 역할을 해. Coyote는 소켓을 통해 들어온 네트워크 연결을 관리하고, 요청을 적절히 처리하도록 Catalina 엔진에 넘겨줘.
• Coyote는 기본적으로 HTTP 요청을 처리하지만, AJP 같은 다른 프로토콜을 처리하는 데도 사용될 수 있어.
• 클라이언트가 보낸 HTTP 요청은 Coyote에서 적절히 분석된 후, Catalina 엔진으로 전달돼.
4. 어댑터 (Adapter)
• Coyote가 받은 요청을 Catalina 엔진에서 처리할 수 있도록 어댑터가 요청을 변환해 줘. 어댑터는 Coyote 커넥터에서 받아들인 요청을 Catalina가 이해할 수 있는 형태로 바꿔주는 역할을 해.
• 어댑터는 Coyote 요청 객체를 Catalina 요청 객체로 변환해서, Catalina 엔진이 서블릿에 전달할 수 있게 만들어.
5. Catalina 엔진 (Engine)
• Catalina는 Tomcat의 핵심 서블릿 엔진이야. 요청을 서블릿 컨테이너에 전달하고, 해당 서블릿이 요청을 처리할 수 있도록 관리해.
• Catalina 엔진 내부에는 Host, Context, Wrapper라는 컴포넌트가 있어서 각각의 요청을 적절히 처리할 서블릿을 찾는 역할을 해.
Catalina 내부의 주요 컴포넌트:
• Engine: 요청을 처리할 호스트를 선택하는 역할을 해. 여러 개의 가상 호스트(서버)를 관리할 수 있어.
• Host: 가상 호스트를 의미하며, 하나의 호스트는 여러 애플리케이션을 가질 수 있어. localhost 같은 도메인 이름을 기준으로 특정 애플리케이션에 요청을 전달해.
• Context: 웹 애플리케이션의 컨텍스트 경로를 관리해. /app1, /app2처럼 경로별로 애플리케이션을 구분할 수 있어.
• Wrapper: 각 컨텍스트 내에서 특정 서블릿을 감싸고 있는 요소로, 최종적으로 서블릿을 호출하는 역할을 해.
6. 벨브 (Valve)
• **Valve(벨브)**는 요청이 서블릿으로 전달되기 전에 추가 작업을 수행할 수 있는 구성 요소야. Valve는 요청을 가로채서 로그를 남기거나, 인증, 압축 등 추가적인 처리를 할 수 있어.
• Tomcat에서 기본적으로 제공하는 AccessLogValve는 요청을 기록해서 로그로 남기거나, RequestDumperValve는 요청 헤더 정보를 출력하는 역할을 하지.
• Valve는 체인 구조로 이루어져 있어서, 요청이 벨브 체인을 통과하면서 여러 개의 작업을 수행할 수 있게 돼.
예를 들어, 인증에 실패한 요청은 인증 벨브에서 차단되거나, 잘못된 요청은 처리되지 않고 오류 처리 벨브에서 처리될 수 있어.
7. 서블릿 (Servlet)
• 서블릿은 최종적으로 클라이언트 요청을 처리하는 비즈니스 로직을 담고 있어. Catalina 엔진은 요청이 도착하면 적절한 서블릿을 찾아 실행해.
• 각 서블릿은 클라이언트의 요청을 처리하고, 그에 맞는 응답을 생성해. 예를 들어, 데이터베이스에서 정보를 조회하거나, POST 요청으로 클라이언트 데이터를 저장할 수 있어.
8. 응답 처리
• 서블릿에서 응답을 생성한 후, 그 응답은 다시 Catalina 엔진을 거쳐 Coyote 커넥터를 통해 클라이언트에게 전달돼. 이 과정에서 벨브가 중간에서 응답을 수정하거나 추가 작업을 수행할 수 있어.
전체 요청 처리 흐름 요약:
1. 프로토콜 핸들러: 클라이언트의 HTTP/HTTPS 요청을 받아들이고, 이를 처리할 준비를 함.
2. Coyote 커넥터: 프로토콜에 맞는 요청을 내부적으로 처리하고, Tomcat 엔진에 전달할 준비를 함.
3. 어댑터: Coyote에서 받은 요청을 Catalina 엔진이 처리할 수 있는 형태로 변환.
4. Catalina 엔진: 서블릿 컨테이너에서 요청을 처리할 서블릿을 찾아 실행.
5. 벨브 (Valve): 요청이나 응답을 중간에 가로채서 추가 작업을 수행. (예: 인증, 로깅)
6. 서블릿 (Servlet): 요청을 처리하고, 결과를 생성.
7. 응답 처리: 서블릿에서 생성된 응답을 클라이언트에게 전달.
정리: 클라이언트가 Tomcat 서버에 요청을 보내면, 그 요청은 프로토콜 핸들러에서 시작해 Coyote 커넥터, Catalina 엔진, 서블릿을 거쳐 최종적으로 응답이 생성돼. 이 과정에서 벨브(Valve) 같은 중간 구성 요소가 요청을 가로채 추가적인 작업을 수행할 수 있어.
'Apache Tomcat' 카테고리의 다른 글
ActiveMQ와 Kafka (0) | 2024.12.17 |
---|---|
SLF4J (0) | 2024.10.15 |
MVC Config API (0) | 2024.10.15 |
Enable MVC Configuration (0) | 2024.10.15 |
@RequestMapping handler method (0) | 2024.10.11 |