Apache Tomcat / / 2024. 10. 15. 12:12

Apache Tomcat 전체 흐름

Tomcat이 클라이언트의 요청을 처리하는 과정은 여러 구성 요소들을 거치면서 일어나는데, 각 구성 요소들이 어떻게 협력해서 요청을 처리하는지 더 자세하게 설명할게.

 

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

 

CoyoteTomcat의 커넥터 구현체로, 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' 카테고리의 다른 글

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
@GetMapping, @PostMapping  (0) 2024.10.08
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유