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