Engine

2024. 5. 31. 11:28Spring Framework/Apache Tomcat Server

Apache Tomcat에서 Engine은 톰캣의 내부에서 중요한 역할을 하는 컴포넌트로, 톰캣의 Service와 연관된 여러 가상 호스트(Host)에 대한 요청을 처리하는 서블릿 컨테이너입니다. 클라이언트의 요청이 Connector를 통해 수신되면, 그 요청은 Engine으로 전달되어 적절한 웹 애플리케이션으로 라우팅되고, 실제로 서블릿과 JSP 페이지가 처리되는 과정이 시작됩니다.

아래는 Engine 컴포넌트의 상세한 설명입니다.

1. Engine의 주요 역할

Engine은 Service의 핵심 컴포넌트로서, 여러 Connector에서 전달된 요청을 처리합니다. 엔진은 요청을 적절한 가상 호스트로 라우팅하고, 각 가상 호스트는 해당하는 웹 애플리케이션을 통해 클라이언트에게 응답을 생성합니다.

  • 요청 라우팅: 엔진의 가장 기본적인 역할은 클라이언트로부터 전달받은 요청을 올바른 Host(가상 호스트)로 전달하는 것입니다. 하나의 Engine에는 여러 Host가 있을 수 있으며, 각 Host는 서로 다른 도메인 또는 서브도메인에 대응합니다.

  • 서블릿 처리: 톰캣 Engine은 요청을 적절한 Host와 그 안의 Context(웹 애플리케이션)에 라우팅하여, 해당 서블릿을 실행합니다. 서블릿의 실행 결과로 생성된 응답은 클라이언트에게 반환됩니다.

  • 구성 요소 통합: Engine은 톰캣의 다양한 구성 요소들을 결합하여 전체 서블릿 실행 환경을 구성합니다. 이는 요청을 수신하고, 올바른 웹 애플리케이션으로 전달한 후, 서블릿을 통해 응답을 생성하는 전체 과정의 중심에 있습니다.

2. Engine의 구조

Engine은 여러 하위 컴포넌트들과 함께 작동하여 요청을 처리합니다. 주요 구성 요소는 아래와 같습니다.

2.1 Host

  • HostEngine 내에서 특정 가상 호스트를 나타내며, 각 도메인 또는 서브도메인에 대응합니다. Engine은 여러 Host를 가질 수 있으며, 각 Host는 하나 이상의 웹 애플리케이션을 관리합니다.

  • 요청이 엔진에 전달되면, Host는 요청의 도메인 이름에 따라 적절한 가상 호스트를 선택하여 요청을 처리합니다.

  • Host는 server.xml 파일에서 <Host> 요소로 설정됩니다. 예를 들어, 다음과 같은 설정을 통해 특정 도메인에 대해 가상 호스트를 정의할 수 있습니다.

    <Host name="www.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
        <Context path="" docBase="exampleApp" reloadable="true"/>
    </Host>

    여기서 name 속성은 도메인 이름을 지정하며, appBase는 웹 애플리케이션이 배치된 디렉토리를 가리킵니다.

2.2 Context

  • Context는 Host 내에서 개별 웹 애플리케이션을 나타냅니다. Host가 도메인별로 가상 호스트를 관리하는 반면, Context는 특정 경로(예: /app1, /app2)에 대응하는 개별 애플리케이션을 관리합니다.
  • 각 Context는 웹 애플리케이션의 루트 디렉토리나 WAR 파일을 가리키며, 서블릿 및 JSP 파일을 포함한 애플리케이션의 전반적인 실행 환경을 제공합니다.
  • Context는 Host 내에서 여러 개가 존재할 수 있으며, 이를 통해 하나의 호스트에 여러 웹 애플리케이션을 배포할 수 있습니다.

2.3 Realm

  • Realm은 보안과 인증을 담당하는 컴포넌트로, 사용자의 자격 증명(예: 사용자 이름과 비밀번호)을 확인하고, 웹 애플리케이션 내의 리소스에 대한 접근 권한을 부여하는 역할을 합니다.
  • Engine 수준에서 설정된 Realm은 엔진 내부의 모든 Host와 Context에 대해 적용됩니다. 즉, 엔진 레벨에서 정의된 Realm은 엔진 내의 모든 웹 애플리케이션에 동일하게 적용됩니다.
  • Realm은 여러 종류가 있으며, 데이터베이스나 LDAP, 파일 기반 사용자 인증을 지원합니다.

2.4 Valve

  • Valve는 요청 처리의 특정 단계에서 작동하는 필터와 비슷한 역할을 합니다. 엔진, 호스트, 또는 컨텍스트 수준에서 설정할 수 있으며, 요청이 해당 단위로 들어올 때마다 작동합니다.

  • Valve는 보안 로깅, 인증 및 권한 부여와 같은 작업을 수행하는 데 자주 사용됩니다.

  • Engine 수준에서 설정된 Valve는 엔진 내의 모든 Host와 Context에 적용되며, 엔진을 거치는 모든 요청에 대해 작동합니다.

    예를 들어, 다음과 같은 AccessLogValve는 요청에 대한 접근 로그를 기록하는 데 사용될 수 있습니다.

    <Valve className="org.apache.catalina.valves.AccessLogValve"
           directory="logs"
           prefix="localhost_access_log"
           suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b"/>

3. Engine의 동작 과정

Engine은 톰캣에서 HTTP 요청을 처리하는 중요한 단계에 위치합니다. 다음은 톰캣이 요청을 처리하는 기본적인 과정입니다.

  1. Connector로부터 요청 수신: 클라이언트로부터 HTTP 요청이 Connector로 들어오면, Connector는 이 요청을 Engine으로 전달합니다.
  2. Host 선택: 엔진은 요청의 호스트 헤더(도메인 이름)를 분석하여 적절한 가상 호스트(Host)를 선택합니다.
  3. Context 선택: Host는 요청의 URI를 분석하여 적절한 Context(웹 애플리케이션)를 선택합니다. URI의 루트 경로와 일치하는 Context가 선택됩니다.
  4. 서블릿 실행: 선택된 Context 내에서 서블릿 컨테이너는 요청을 처리할 서블릿을 찾아 실행합니다. 서블릿은 클라이언트 요청을 처리하고 응답을 생성합니다.
  5. 응답 반환: 서블릿이 응답을 생성한 후, 응답은 Connector를 통해 클라이언트로 반환됩니다.

4. Engine의 설정

톰캣의 server.xml 파일에서 Engine 컴포넌트를 설정할 수 있습니다. 다음은 Engine 설정의 예시입니다.

<Service name="Catalina">
  <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
  <Engine name="Catalina" defaultHost="localhost">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
           resourceName="UserDatabase"/>
    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"/>
  </Engine>
</Service>
  • name: 엔진의 이름을 지정하며, 주로 Catalina가 기본값으로 사용됩니다.
  • defaultHost: 엔진이 요청을 처리할 때 사용할 기본 호스트를 지정합니다. 호스트 헤더가 비어 있거나 일치하지 않을 때, 기본 호스트가 사용됩니다.
  • Realm: 인증과 권한 부여를 처리하는 Realm을 설정할 수 있습니다.
  • Host: 여러 호스트를 정의하여 도메인별로 웹 애플리케이션을 배포할 수 있습니다.

5. Engine의 특징 요약

  • Engine은 톰캣의 핵심 서블릿 컨테이너로서, HTTP 요청을 처리하고 서블릿 및 JSP를 실행하는 과정의 중추적 역할을 합니다.
  • 여러 가상 호스트(Host)와 웹 애플리케이션(Context)을 처리하며, 요청을 올바른 웹 애플리케이션으로 라우팅하는 역할을 합니다.
  • ValveRealm과 같은 기능을 통해 추가적인 보안 및 로깅 기능을 제공합니다.

'Spring Framework > Apache Tomcat Server' 카테고리의 다른 글

context root  (0) 2024.04.26
Thread Pool  (0) 2023.09.21
Apache Tomcat Server Arch  (0) 2023.06.23
Tomcat 서버에서 정적 페이지를 처리하는 방법  (0) 2023.06.13
Service  (0) 2023.06.06