본문 바로가기
[개발] Info/소개

Apache Tomcat[톰캣]이란?

by Devsong26 2024. 12. 22.
반응형

톰캣이란?


1. Apache Tomcat은 무료 오픈 소스 Java 서블릿 컨테이너입니다. Java 서블릿과 JavaServer Pages(JSP) 사양을 구현하는 컨테이너입니다.Tomcat은 동적 웹 콘텐츠를 위한 안정적이고 확장 가능한 환경을 제공하며, Java 서블릿을 통해 클라이언트 요청을 처리하고 효율적으로 응답을 생성합니다.

 

서블릿(Servlet)은 Java 기반의 웹 애플리케이션에서 클라이언트 요청을 처리하고, 서버에서 동적 콘텐츠(HTML, JSON 등)를 생성하여 응답을 제공하는 자바 프로그램입니다. 예를 들어, 사용자는 로그인을 시도할 때 아이디와 비밀번호를 입력하고 로그인 버튼을 누르면, 서버는 클라이언트의 아이디와 비밀번호를 확인하고 다음 페이지를 띄워주어야 하는데, 이러한 역할을 수행하는 것이 바로 서블릿입니다.

 

Tomcat 같은 서블릿 컨테이너는 Java 서블릿에 대한 런타임 환경을 제공하며, 이는 동적 콘텐츠를 생성하고 웹 요청을 처리하여 웹 서버 기능을 확장합니다. 서블릿 컨테이너는 서블릿의 수명 주기를 관리하고, 필요에 따라 서블릿을 로드하거나 언로드하여 애플리케이션의 안정적 동작을 보장합니다. Java 서블릿 컨테이너는 다른 웹 서버와 결합되어 Java 기반 웹 애플리케이션을 배포하기 위한 보다 완벽한 런타임 환경을 제공할 수 있습니다. Apache Tomcat은 또한 보안 및 리소스 관리와 같은 추가 서비스를 제공합니다.

 

2. 아파치 톰캣은 Jakarta Servlet, Jakarta Expressions Language, WebSocket 기술의 무료 오픈 소스 구현입니다. Java 코드도 실행할 수 있는 "순수 Java" HTTP 웹 서버 환경을 제공합니다. Tomcat은 Java 서블릿 및 JSP 사양을 구현한 서블릿 컨테이너로, 독립형 웹 서버로도 동작할 수 있습니다. 다만, 전체 애플리케이션 서버의 기능은 제공하지 않으므로 JEE 표준을 완벽히 충족하지는 않습니다.

 

💡 용어 설명

Jakarta Servlet이란 Java 기반의 웹 애플리케이션에서 클라이언트 요청을 처리하고 동적으로 생성된 데이터를 응답으로 반환하는 데 사용되는 표준 기술입니다. Jakarta EE 플랫폼에서 웹과 상호작용하는 데 사용되는 표준 기술입니다. 

Jakarta Expression Language(EL이라고도 함)는 프레젠테이션 계층(웹 페이지)이 애플리케이션 로직(관리되는 빈)과 통신할 수 있도록 하는 중요한 메커니즘을 제공합니다. JSP와 JSF(JavaServer Faces)에서 자주 사용되며, 예를 들어 ${user.name} 과 같은 표현을 통해 백엔드의 Managed Beans 데이터를 뷰 템플릿에 쉽게 바인딩할 수 있습니다.

WebSocket은 클라이언트와 서버 간에 양방향 통신을 지원하는 프로토콜입니다. HTTP를 사용하여 초기 연결을 설정한 후, 클라이언트와 서버 사이에 영구적인 연결을 유지하여 실시간 데이터 교환을 가능하게 합니다. WebSocket은 특히 실시간 애플리케이션(예: 채팅, 실시간 알림, 온라인 게임, 주식 데이터 스트리밍 등)에 적합합니다. Jakarta WebSocket은 Java 개발자가 서버 측과 Java 클라이언트 측 모두에서 WebSocket을 애플리케이션에 통합할 때 사용할 수 있는 API를 지정합니다.

JEE 애플리케이션 서버는 Jakarta EE(Java EE) 스펙을 준수하여 엔터프라이즈 애플리케이션을 실행, 관리, 배포할 수 있는 서버 소프트웨어입니다. 이 서버는 Jakarta EE(이전 Java EE) 표준을 준수하여 개발된 애플리케이션이 실행될 수 있는 런타임 환경을 제공합니다.

 

3. 아파치 톰캣은 개발자들에게 강력한 보안 기능, 유연한 설정, 그리고 고성능의 웹 애플리케이션 서버 환경을 제공합니다. SSL/TLS 암호화, 사용자 인증 및 권한 관리, 클러스터링을 통한 고가용성 및 부하 분산 등의 기능을 포함하고 있어 안전하고 안정적인 애플리케이션 운영이 가능합니다. 뿐만 아니라 JDBC 연결 풀링 및 JNDI 지원과 같은 엔터프라이즈급 기능을 통해 데이터베이스와의 통합을 간소화합니다.

 

 

핵심 구성 요소


Catalina

서블릿 컨테이너이며, Java 서블릿과 Jakarta Server Pages(JSP, 이전에는 JavaServer Pages)에 필요한 사양을 구현하고 컨테이너의 모든 서블릿의 수명 주기를 관리합니다.

 

Coyote

웹 서버로 HTTP 1.1 및 2 프로토콜을 지원하는 Tomcat용 Connector 구성 요소입니다. Coyote는 처리 스레드를 통해 HTTP 요청을 해석하고 처리하며 트래픽이 예기치 않게 증가하면 추가 스레드를 생성할 수 있습니다. 이런 방식으로 요청을 처리할 수 있는 능력은 Apache Tomcat이 독립형 웹 서버로 사용될 수 있는 능력을 부여합니다. Coyote는 특정 TCP 포트에서 서버로 들어오는 연결을 수신하고 요청을 Tomcat Engine으로 전달하여 요청을 처리하고 요청하는 클라이언트에 응답을 다시 보냅니다. 

 

Jasper

Tomcat의 JSP 엔진입니다. Jasper는 JSP 파일을 파싱하여 Java 코드로 컴파일하여 서블릿(Catalina에서 처리할 수 있음)으로 만듭니다. 런타임 시 Jasper는 배포된 JSP 파일이 수정된 경우 이를 다시 컴파일하여 최신 상태를 유지합니다. Jasper2는 이전 버전의 JSP 엔진(Jasper)을 대체한 Tomcat의 최신 JSP 엔진으로, 더 나은 성능과 향상된 기능을 제공합니다.

 

Cluster

클러스터는 함께 작동하는 Tomcat 서버 그룹입니다. Tomcat 클러스터링은 여러 대의 Tomcat 인스턴스를 조합하여 하나의 클러스터로 구성하고, 이를 통해 고가용성(High Availability)과 부하 분산(Load Balancing)을 구현하는 방법입니다. 이는 대규모 시스템에서 트래픽을 효율적으로 처리하고, 장애 상황에서도 서비스 연속성을 보장하기 위해 사용됩니다.

 

💡 용어 설명

고가용성(High Availability)
서버 장애 시에도 서비스가 지속적으로 제공될 수 있도록 다른 노드가 요청을 처리합니다. Tomcat 클러스터링은 여러 인스턴스를 연결하여 요청을 분산 처리하고, 세션 복제를 통해 장애 상황에서도 사용자 세션 데이터를 다른 인스턴스에서 처리할 수 있도록 보장합니다.

부하 분산(Load Balancing)
여러 Tomcat 인스턴스에 트래픽을 분산하여 처리합니다. 하나의 서버가 과부하 상태에 빠지지 않도록 요청을 효율적으로 분산합니다.

 

구조


출처: https://kbss27.github.io/2017/11/16/tomcatarchitecture/

 

Server

서버는 최상위 구성요소이며 톰캣의 인스턴스를 나타내는 것을 볼 수 있습니다. 서버는 한 개의 포트를 가지며, 디버그 모드 설정을 통해 JVM 디버깅을 시작할 수 있습니다. 하나의 머신에 애플리케이션을 분리하여 재시작할 수 있도록 각 서버들을 설정할 수도 있습니다. 또한 하나의 JVM에서 실행되는 한 서버에서 오류가 발생하더라도 다른 서버에는 영향을 주지 않고 분리되어 운영될 수 있습니다.

 

Service

서비스는 하나의 컨테이너(주로 엔진)를 컨테이너의 커넥터들과 묶는 컴포넌트입니다. 서비스는 로그 메시지를 식별할 수 있도록 이름이 주어집니다.

 

Connector 

커넥터(디폴트: Coyote)는 클라이언트와 통신을 담당하며 HTTP 요청을 받아들이고 처리하는 역할을 합니다. 톰캣의 기본 커넥터는 HTTP/1.1 표준에 따라 클라이언트로부터의 요청을 처리합니다. 기존 웹 서버의 80번 포트와 충돌을 피하기 위해 기본값으로 8080 포트를 통해 요청을 수신합니다. redirectPort 속성은 SSL(HTTPS) 연결이 필요한 경우, 요청을 안전한 포트(기본적으로 8443)로 리디렉션 합니다.

 

Engine

엔진은 톰캣의 핵심이며 하나의 컨테이너로 전체 Catalina 서블릿 엔진을 나타냅니다. 서비스에 여러 개의 커넥터가 있다면 엔진은 이러한 커넥터로부터 모든 요청을 수신하고 처리하여 클라이언트에 전송할 적절한 커넥터로 응답을 다시 전달합니다. Engine은 요청의 HTTP 헤더와 URI를 분석하여, 이를 처리할 적절한 Host와 Context를 결정합니다. 엔진에는 하나 이상의 호스트가 포함되어야 하며, 그 중 하나가 기본 호스트로 지정되어 있어야 합니다. 기본 Tomcat 구성에는 localhost 호스트를 포함하는 Catalina 엔진이 포함됩니다. 특정 설정에 대한 변경이 없이 실행된다면 디폴트 엔진을 사용합니다.

 

Realm

Realm 요소는 해당 사용자에게 할당된 사용자 이름, 비밀번호 및 역할( Unix 그룹과 유사)의 "데이터베이스"를 나타냅니다. 모든 컨테이너 구성 요소(엔진, 호스트, 컨텍스트) 안에 나타날 수 있습니다. 사용자, 비밀번호, 사용자 역할의 데이터베이스를 나타냅니다. Realm의 다양한 구현을 통해 Catalina를 이러한 인증 정보가 이미 생성되고 유지 관리되는 환경에 통합한 다음 해당 정보를 사용하여 서블릿 사양에 설명된 대로 컨테이너 관리 보안을 구현할 수 있습니다.

 

Valves

밸브는 컨테이너(컨텍스트, 호스트 또는 엔진)에 삽입하면 애플리케이션에 도달하기 전에 들어오는 모든 HTTP 요청을 가로채는 인터셉터와 같은 요소입니다. 이를 통해 특정 애플리케이션, 가상 호스트에서 실행되는 애플리케이션 또는 엔진 내에서 실행되는 모든 애플리케이션으로 향하는 요청을 사전 처리할 수 있습니다.

 

Logger

로거는 컴포넌트의 내부 상태를 리포팅합니다.

 

Host

Host는 Tomcat 내에서 가상 호스트를 나타내며, 도메인 이름 기반으로 요청을 특정 웹 애플리케이션(Context)으로 라우팅합니다. 대부분의 클라이언트는 서버의 IP주소와 IP주소에 사용되는 호스트명을 같이 보내는 방식을 취합니다. 호스트명은 HTTP 헤더로 제공되기에 엔진은 헤더를 확인해서 요청이 어느 호스트에 연결되는지 결정할 수 있습니다.

 

Context

컨텍스트는 웹 애플리케이션으로도 불립니다. 웹 애플리케이션의 설정에는 루트 폴더 위치를 엔진과 호스트에 알려주는 것이 포함되며, 컨텍스트는 시스템 관리자가 설정할 수 있는 특정 에러 페이지도 포함합니다. 컨텍스트는 애플리케이션 또는 접근 통제 등을 위한 초기 파라미터를 설정할 수 있습니다. 

 

 

Tomcat 요청 처리


출처: https://www.logicmonitor.com/blog/what-is-apache-tomcat-server-and-how-does-it-work

 

Tomcat의 요청 흐름은 다음과 같습니다.

 

1. Coyote Connector가 네트워크 소켓에서 HTTP 요청을 수신합니다.

2. HTTP 요청을 파싱하여 HttpServletRequest 객체로 변환하여 Catalina에 전달합니다.

3. Catalina가 요청 URI를 분석하고 요청에 해당하는 서블릿이나 JSP를 결정합니다.

4. (필요 시) 요청이 JSP에 매핑되면 Jasper가 JSP 파일을 서블릿으로 변환하여 실행합니다.

5. 서블릿이 클라이언트 요청을 처리하고 HttpServletResponse 객체로 응답 데이터를 생성합니다.

6. 생성된 응답은 다시 Coyote로 전달되며 HTTP 응답으로 반환하여 클라이언트에 전송합니다.

 

세부적으로 보면 다음과 같습니다.

 

Coyote Connector

Coyote는 네트워크 소켓을 열고 클라이언트 요청을 기다립니다. 요청이 들어오면 HTTP 요청 메시지를 읽어 파싱하고, 이를 내부적으로 HttpServletRequest 객체로 변환합니다. 

 

HTTP/1.1, HTTP/2, AJP(Apache JServ Protocol) 등 다양한 프로토콜을 처리할 수 있습니다. 클라이언트와 Keep-Alive 설정, Chunked Transfer-Encoding 등을 관리합니다.

 

요청 데이터를 Catalina 서블릿 컨테이너에 전달하여 실제 애플리케이션 로직을 실행할 수 있도록 준비합니다.

 

Catalina로부터 생성된 응답 데이터를 받아 클라이언트로 전송합니다.

 

Catalina Servlet Container

Coyote로부터 전달받은 HttpServletRequest를 분석하여, 어떤 서블릿이나 JSP가 요청을 처리할지 결정합니다. 요청 URI와 web.xml 또는 애노테이션 설정을 기반으로 서블릿 매핑을 수행합니다.

 

해당 요청을 처리하기 위해 적절한 서블릿 인스턴스를 로드하고 실행합니다. 서블릿의 doGet, doPost와 같은 메서드가 호출됩니다.

 

요청 및 응답에 대해 지정된 Filter 체인을 적용하여 전처리/후처리를 수행합니다.

 

서블릿에서 처리된 결과를 HttpServletResponse 객체로 생성합니다. 필요에 따라 HTTP 상태 코드, 헤더, 본문 데이터를 포함합니다.

 

 

 


 

https://www.logicmonitor.com/blog/what-is-apache-tomcat-server-and-how-does-it-work

GPT

https://en.wikipedia.org/wiki/Apache_Tomcat

https://mangkyu.tistory.com/14

https://projects.eclipse.org/projects/ee4j.servlet

https://projects.eclipse.org/projects/ee4j.websocket

https://www.simplilearn.com/what-is-tomcat-article

https://www.openmaru.io/opensource/apache-tomcat/

https://medium.com/@potato013068/%ED%86%B0%EC%BA%A3%EC%9D%98-%EA%B5%AC%EC%A1%B0%EC%99%80-%EB%8F%99%EC%9E%91-%EB%A9%94%EC%BB%A4%EB%8B%88%EC%A6%98-91fbebf0eb67

https://kadensungbincho.tistory.com/62

https://medium.com/@nikhilmanikonda/tomcat-who-i-am-and-what-i-do-e91ff72fb2ea

https://jiminbyun.medium.com/apache-tomcat-1-core-components-and-their-interactions-939f1f476544

 

 

반응형