Web/WAS
tomcat - The Context Container
linuxism
2012. 5. 26. 13:33
The Context Container
| 소개(Introduction) |
Context 엘리먼트는 특정 가상호스트 내에서 실행되는 웹어플리케이션을 나타냅니다. 각 웹어플리케이션은 웹어플리케이션 아카이브(Web Application Archive) (WAR) 파일 또는, 패킹하지 않은 채로 그에 상응하는 내용을 담고 있는 디렉토리를 기준으로 하며, 이러한 내용은 서블릿 스펙(버전 2.2 또는 그 이상)에 설명되어 있습니다. 웹어플리케이션 아카이브에 관한 더 많은 정보를 원하시면 서블릿 스펙을 다운로드해서 참고하십시오. 그리고 Tomcat 어플리케이션 개발자 가이드(Application Developer's Guide)를 검토하시기 바랍니다. 각 HTTP 요청을 처리하는데 사용할 웹어플리케이션의 선택은, 각각 정의된 Context의 컨텍스트 경로(context path)에 대해 요청 URI의 가능한 전치어(prefix) 중 가장 길게 매칭가능한 컨텍스트 경로를 가진 컨텍스트를 선택함으로써 이루어집니다. 선택된 Context는 수신된 요청을 처리하기 위해 적절한 서블릿을 선택합니다. 서블릿 선택 작업은 웹어플리케이션 배치 디스크립터(web application deployment descriptor) 파일(반드시 웹어플리케이션 디렉토리 하위의 /WEB-INF/web.xml에 위치함)에 정의된 서블릿 매핑 정보에 따라서 이루어집니다. Context 엘리먼트는 횟수의 제한 없이 정의할 수 있으며, conf/server.xml의 Host 엘리먼트 내에 중첩시키면 됩니다. 각각의 Context는 반드시 유일한 컨텍스트 경로를 가져야 하며, 컨텍스트 경로는 path 속성으로 정의됩니다. 또 컨텍스트 경로의 문자열 길이가 0인 Context를 추가로 지정해야 하는데, 이렇게 정의한 Context는 이 가상 호스트에 대하여 default 웹어플리케이션이 되어, 다른 어떤 Context의 컨텍스트 경로에도 매칭되지 않는 모든 요청을 처리하는데 사용됩니다. Context 엘리먼트를 Host 엘리먼트에 중첩시키는 방법 외에도, Host의 appBase로 지정된 디렉토리 안에 이들을 각각의 파일(확장자는 ".xml")로 저장하는 방법이 있습니다. 어플리케이션의 자동배치(Automatic Application Deployment)에서 더 자세한 정보를 볼 수 있습니다. 명시적으로 Context 엘리먼트를 지정하는 방법 뿐만 아니라, 당신을 위해 자동으로 Context 엘리먼트를 생성해 주는 몇가지 테크닉도 존재합니다. 어플리케이션의 자동배치(Automatic Application Deployment)와 사용자 웹어플리케이션(User Web Applications)에서 더 많은 정보를 볼 수 있습니다. 이하의 설명에서는 $CATALINA_HOME 변수명을 사용하여 당신이 Tomcat 4를 설치한 디렉토리를 참조하며, 이 디렉토리가 대부분의 상대경로에 대한 기준 디렉토리(base directory)가 됩니다. 그러나 만약 CATALINA_BASE 디렉토리를 설정하여 Tomcat 4를 여러개 설치했다면, 이러한 디렉토리 변수 참조에 대해 $CATALINA_HOME 대신 $CATALINA_BASE 를 사용해야 합니다.
|
| 속성(Attributes) |
| 공통속성(Common Attributes) | Context의 모든 구현체는 다음 속성들을 제공하게 됩니다: | 속성 | 설명 |
|---|
className | 사용할 Java 구현체 클래스의 이름. 이 클래스는 반드시 org.apache.catalina.Context 인터페이스를 구현해야 합니다. 지정하지 않으면 표준값 (아래에 정의됩니다)이 사용됩니다. | cookies | true(디폴트)로 지정하면 클라이언트가 쿠키를 지원하는 경우 세션확인의 통신수단(session identifier communication)으로 쿠키를 사용합니다. false로 지정하면 세션확인의 통신수단으로 쿠키 사용을 하지 않고, 어플리케이션에 의한 URL 다시쓰기(URL rewriting)에만 의존한다는 의미입니다.
| crossContext | true로 지정하면 이 어플리케이션에서 ServletContext.getContext() 호출을 통해, 이 가상호스트에서 실행중인 다른 웹어플리케이션에 대한 요청디스패쳐(request dispatcher)를 성공적으로 얻을 수 있습니다. 보안상의 이유로 false(디폴트)로 지정하면 getContext()는 언제나 null을 반환하게 됩니다.
| docBase | 이 웹어플리케이션에 대한 Document Base (Context Root로도 알려져 있습니다) 디렉토리, 또는 웹어플리케이션 아카이브 파일의 경로명(웹어플리케이션을 WAR 파일로 직접 실행하는 경우)을 나타냅니다. 이 디렉토리나 WAR 파일에에 대한 절대경로명을 지정할 수도 있고, 이 Context가 정의된 Host의 appBase 디렉토리에 대한 상대경로명을 지정할 수도 있습니다. | override | 이 Context가 정의된 Host의 DefaultContext에 정의된 각 설정내용을, 이 Context 엘리먼트에서 재정의(override) 할 수 있도록 하려면 true로 지정합니다. 디폴트로는 DefaultContext 엘리먼트의 설정이 사용되도록 되어 있습니다. | privileged | true로 설정하면 이 컨텍스트는 관리자서블릿(manager servlet) 같은 컨테이너 서블릿을 사용할 수 있습니다.
| path | 이 웹어플리케이션의 컨텍스트 경로(context path)를 나타내며, 각 요청 URI의 시작부분이 컨텍스트 경로와 같을 때 해당 웹어플리케이션이 그 요청을 처리하게 됩니다. 하나의 특정 Host 내의 컨텍스트 경로들은 모두 각각 유일해야 합니다. 만약 컨텍스트 경로를 빈 스트링("")으로 지정하면, 이 Context는 이 Host에 대한 디폴트 웹어플리케이션으로 정의된 것입니다. 디폴트 웹어플리케이션은 다른 Context 들에 해당되지 않는 모든 요청을 처리할 것입니다. | reloadable | true로 지정하면, Catalina는 /WEB-INF/classes/와 /WEB-INF/lib 안 클래스 들의 변경여부를 감시하다가, 변경이 발견되면 웹어플리케이션을 자동으로 재적재(reload)합니다. 이 기능은 개발중에는 매우 유용하지만 얼마간의 실행부하(runtime overhead)가 발생하므로, 실제 운영할 용도로 어플리케이션을 배치(deploy)할 때는 사용하지 않도록 합니다. 그러나 이미 배치가 끝난 어플리케이션이라도 Manager 웹어플리케이션을 이용하면 필요할 때 재적재 하도록 할 수 있습니다.
| wrapperClass | 이 Context로 관리할 서블릿 들에 대해 사용할 org.apache.catalina.Wrapper 구현체 클래스의 Java 클래스명입니다. 지정하지 않으면 표준값이 사용됩니다. |
|
| 표준구현체(Standard Implementation) | Context의 표준구현체 클래스는 org.apache.catalina.core.StandardContext 입니다. 이 클래스는 위에 나열한 공통속성 외에도 다음과 같은 추가적인 속성을 제공합니다: | 속성 | 설명 |
|---|
debug | 이 Context가 해당 Logger에 디버깅 로그를 출력하는 상세수준을 의미합니다. 숫자가 높을 수록 더 자세한 출력을 생성합니다. 지정하지 않으면, 디버깅 상세수준의 디폴트 값은 0 입니다. | swallowOutput | 이 값이 true 이면, 웹어플리케이션에서 System.out과 System.err 으로 보내지는 바이트 출력은 모두 웹어플리케이션의 로거(logger)로 재지정(redirect)됩니다. 이 값을 지정하지 않으면false로 인식합니다. | useNaming | 이 웹어플리케이션에서 Java2 Enterprise Edition (J2EE) 플랫폼 규약에 맞는 JNDIInitialContext를 사용가능하게 하도록 설정하려면 true(디폴트값)로 지정합니다. | workDir | 이 Context에서 사용할 임시 디렉토리에 대한 경로명입니다. 이 디렉토리는 관련 웹어플리케이션의 서블릿들이 임시로 읽기-쓰기 작업을 하는 용도로 사용합니다. 웹어플리케이션의 서블릿 들은 이름이 javax.servlet.context.tempdir인 서블릿-컨텍스트 속성(타입은 java.io.File)을 통해 이 디렉토리를 볼 수 있으며, 이 내용은 서블릿 스펙에 기술되어 있습니다. 지정하지 않은 경우에는 적절한 디렉토리가 $CATALINA_HOME/work 아래에 제공됩니다. |
|
|
| 내부 컴포넌트(Nested Components) |
아래의 유틸리티 컴포넌트들은 해당 엘리먼트를 Context 엘리먼트 안에 최대 하나까지 포함시킬 수 있습니다: - Loader - 이 웹어플리케이션의 서블릿과 빈 클래스들을 로드하는 웹어플리케이션 클래스 로더를 설정합니다. 일반적으로 디폴트로 설정되어 있는 것을 그냥 사용하는 것으로 충분합니다.
- Logger - 이 Context에 대한 모든 로그 메시지를 받아서 처리할 로거(logger)를 설정합니다. 이 로거는
ServletContext.log() 호출을 통해 기록될 어플리케이션 로그 메시지도 처리합니다. - Manager - 이 웹어플리케이션의 HTTP 세션을 생성/파괴/유지 시키는데 사용될 세션관리자를 설정합니다. 일반적으로 디폴트로 설정되어 있는 세션관리자를 그냥 사용하는 것으로 충분합니다.
- Realm - 이 웹어플리케이션만을 위한 사용자/역할 데이터베이스를 사용할 수 있는 영역(realm)을 설정합니다. 지정하지 않으면 이 웹어플리케이션은 이 Context가 정의된 Host나 Engine 에 정의된 Realm을 사용할 것입니다.
- Resources - 이 웹어플리케이션에 관련된 정적 자원에 접근하는데 사용할 자원관리자를 설정합니다. 일반적으로 디폴트로 설정되어 있는 자원관리자를 그냥 사용하는 것으로 충분합니다.
|
| 특별기능(Special Features) |
| 컨텍스트의 자동설정(Automatic Context Configuration) | 만약 표준 Context 구현체를 사용하고 있다면, Catalina가 기동될 때 또는 이 웹어플리케이션이 재적재될 때 다음의 설정단계 들이 자동으로 수행됩니다. 이 기능은 특별한 설정이 필요치 않습니다. - 만일 Loader 엘리먼트를 선언하지 않았다면 표준 웹어플리케이션 클래스로더로 설정됩니다.
- 만일 Manager 엘리먼트를 선언하지 않았다면 표준 세션관리자로 설정됩니다.
- 만일 Resources 엘리먼트를 선언하지 않았다면 표준 자원관리자로 설정됩니다.
conf/web.xml에 나열된 웹어플리케이션 프로퍼티들이 이 웹어플리케이션의 디폴트 값으로 처리됩니다. 이 파일은 디폴트 매핑(*.jsp 확장자를 해당 JSP 서블릿으로 매핑하는 등의), 그리고 모든 웹어플리케이션에 적용될 다른 표준 기능들을 정하는 데 사용됩니다.- 이 웹어플리케이션에 대한
/WEB-INF/web.xml 파일에 나열된 웹어플리케이션 프로퍼티들이 처리됩니다(이 파일이 있는 경우). - 만일 당신의 웹어플리케이션에서 사용자 인증을 요구하는 보안조건을 지정했다면, 당신이 선택한 로그인 방법을 적절히 구현한 인증자(Authenticator)가 설정됩니다.
|
| 자원 파라미터(Resource Parameters) | 이 엘리먼트는 웹어플리케이션에서 해당 자원의 이름에 대해 JNDI 탐색을 수행할 때, 객체를 반환하는데 사용할 자원관리자(또는 객체팩토리)를 설정하는 역할을 합니다. $CATALINA_HOME/conf/server.xml의 <Context>나<DefaultContext> 엘리먼트 내의 <Resource> 엘리먼트로 지정된 모든 자원 이름, 그리고/또는 웹어플리케이션 배치 디스크립터에서 <resource-ref> 나 <resource-env-ref> 엘리먼트에서 선언된 모든 자원 이름에 대해서는반드시 자원 파라미터(resource parameters)를 정의해야 그 자원에 성공적으로 액세스할 수 있습니다. 자원 파라미터는 이름으로 정의되며, 정확하게 어떤 파라미터 이름들의 집합을 지원하는가는 당신이 사용하고 있는 자원관리자(또는 객체팩토리)에 따라 달라집니다. 즉 해당 팩토리 클래스의 JavaBeans 프로퍼티 중 설정가능한(settable) 프로퍼티의 이름과 일치해야 합니다. JNDI 구현체는 지정한 팩토리 클래스의 인스턴스에 대해 JavaBeans의 모든 해당 속성 설정메소드를 호출함으로써 모든 설정을 마친 다음에야, 이 팩토리 인스턴스를 JNDI lookup() 호출을 통해 사용가능하도록 할 것입니다. 예로 JDBC 데이터 소스에 대한 자원 파라미터 설정은 아래와 같이 됩니다:  |  |  |  | <Context ...>
...
<ResourceParams name="jdbc/EmployeeDB">
<parameter>
<name>driverClassName</name>
<value>org.hsql.jdbcDriver</value>
</parameter>
<parameter>
<name>url</name>
</value>jdbc:HypersonicSQL:database</value>
</parameter>
<parameter>
<name>user</name>
<value>dbusername</value>
</parameter>
<parameter>
<name>password</name>
<value>dbpassword</value>
</parameter>
</ResourceParams>
...
</Context>
|  |  |  |  |
만약 특정 자원 타입에 대해 팩토리 클래스의 Java 클래스명을 지정할 필요가 있다면, <ResourceParams> 엘리먼트 내의 <parameter> 항목에 factory라는 이름을 사용하면 됩니다. <ResourceParams> 엘리먼트가 가질 수 있는 속성은 다음과 같습니다:
| 속성 | 설명 |
|---|
name | 설정할 자원의 이름이며, java:comp/env 컨텍스트에 대한 상대적인 이름이 됩니다. 이 이름은$CATALINA_HOME/conf/server.xml 내에 <Resource> 엘리먼트로 정의된 자원, 그리고/또는 웹어플리케이션 배치 디스크립터 내에 <resource-ref> 또는 <resource-env-ref>로 참조되는 자원의 이름과 반드시일치해야 합니다. |
|
| 자원링크(Resource Links) | 이 엘리먼트는 어떤 전역 JNDI 자원으로의 링크를 생성하는데 사용합니다. 그 연결명에 대하여 JNDI 탐색을 실행하면 링크된 전역자원이 반환됩니다. 예를 들어 다음과 같이 자원링크를 생성할 수 있습니다:  |  |  |  | <Context ...>
...
<ResourceLink name="linkToGlobalResource"
global="simpleVal!ue"
type="java.lang.Integer"
...
</Context>
|  |  |  |  |
<ResourceLink> 엘리먼트가 가질 수 있는 속성은 다음과 같습니다:
| 속성 | 설명 |
|---|
global | 전역 JNDI 컨텍스트내의 링크된 전역자원의 이름. | name | 생성할 자원링크의 이름이며, java:comp/env에 대한 상대적인 이름입니다. | type | 이 자원링크에 대해 탐색을 실행할 때 웹어플리케이션이 기대하는 완전한 Java 클래스명. |
|
|
출처: http://choris.springnote.com/pages/1016402