제1장 소개

내용 목차

1.1. 구성 요소
1.2. 노드
1.2.1. 가상 노드
1.2.2. 노드 클러스터링(Node Clustering)
1.3. JEUS Manager
1.3.1. 공통 서비스
1.3.2. JEUS Manager의 Life Cycle
1.3.3. Base Port
1.4. 엔진 컨테이너
1.4.1. 엔진(Engine)
1.4.2. 주요 서비스
1.4.3. 엔진 컨테이너의 Life Cycle
1.4.4. Invocation Manager
1.4.5. 디폴트 엔진 컨테이너
1.4.6. JEUS Manager 감시 및 Self-Down 기능
1.5. Class Loader의 구조
1.5.1. Isolated Class Loader
1.5.2. Shared Class Loader

본 장에서는 JEUS의 구성 요소 및 그 구성 요소가 제공하는 서비스에 대해서 설명한다.

1.1. 구성 요소

다음은 JEUS의 주요 구성 요소에 대한 설명이다. JEUS는 노드, JEUS Manager, 엔진 컨테이너로 구성된다.

[그림 1.1] JEUS의 구성 요소

JEUS의 구성 요소

  • 노드(Node)

    노드는 논리적인 개념으로 JEUS의 물리적인 구성 요소들, JEUS Manager와 여러 개의 엔진 컨테이너를 포괄하는 서버 인스턴스를 가리킨다.

  • JEUS Manager

    JEUS Manager는 노드에서 하나 밖에 없는 물리적인 구성 요소이고 기동할 때 시작점이 된다. 이것의 역할은 노드에 속한 여러 엔진 컨테이너를 관리하고 이들이 공통적으로 필요로 하는 서비스를 제공한다. 또한 엔진 컨테이너에서 공통적으로 필요로 하는 서비스를 제공한다.

    다음은 JEUS Manager의 주요 서비스이다.

    • JNDI 서비스

    • 보안(Security) 서비스

    • Logging 서비스

    • 외부 클라이언트가 필요로 하는 서비스

  • 엔진 컨테이너(Engine Container)

    엔진 컨테이너는 노드에서 하나 이상 존재할 수 있는 물리적인 구성 요소이며, 사용자가 디플로이하는 애플리케이션을 관리하고 이러한 애플리케이션이 필요로 하는 서비스를 제공한다.

    다음은 엔진 컨테이너의 주요 서비스이다.

    • HTTP 세션 클러스터링 서비스

    • 트랜잭션 서비스

    • 데이터베이스 또는 엔터프라이즈 정보 시스템(EIS : Enterprise Information System) 연결 서비스

    • 스케줄러 서비스 등의 다양한 서비스

각 구성 요소에 대한 자세한 설명은 각 상세 절의 내용을 참고한다.

1.2. 노드

노드는 논리적인 개념으로 JEUS의 물리적인 구성 요소들, JEUS Manager와 여러 개의 엔진 컨테이너를 포괄하는 서버 인스턴스를 가리킨다. 노드는 본래 일반적으로 사용되는 개념이지만 JEUS에서는 JEUS Manager와 여러 엔진 컨테이너의 집합체라고 할 수 있다. 대체로 노드를 서버 장비 별로 하나씩 실행시키는 것이 일반적이지만 JEUS의 가상 노드 기능에 의해서 하나의 머신에서 여러 개의 노드를 실행시킬 수도 있다. 클러스터링 환경에서는 노드가 기본 구성 단위이다.

1.2.1. 가상 노드

JEUS의 노드 이름은 기본적으로 JEUS Manager가 구동되는 머신의 네트워크 이름(hostname)이다. 하지만 한 머신에 여러 개의 노드를 띄우고 싶은 경우에 가상 노드 기능을 사용하여 각 노드에 가상의 이름을 부여할 수 있다. 이 기능을 이용하면 한 머신에 여러 노드를 설정해 놓고 클러스터도 구성할 수 있다. 물론 여러 머신에 분산하는 경우만큼 큰 효과를 기대할 수는 없지만 개발 환경에서 가상적으로 클러스터를 구성하는 데 유용하다. 이 경우에 각각의 JEUS Manager에 서로 다른 Base Port를 할당해야 한다.

가상 노드 설정에 관해 좀 더 자세한 내용은 “2.2.2. 가상 노드 설정”을 참고한다.

1.2.2. 노드 클러스터링(Node Clustering)

JEUS에서는 노드 간에 Failover, 부하 분산을 위해서 서로 다른 노드들과 연결하여 클러스터를 구성할 수 있도록 하고 있다. 이러한 기능을 노드 클러스터링이라고 한다.

다음은 4개의 노드를 연결한 클러스터를 보여준다.

[그림 1.2] 4개를 연결한 JEUS 클러스터링

4개를 연결한 JEUS 클러스터링


각 노드는 고유의 IP 주소를 가지고 있는 전용 머신에서 운영되거나 JEUS의 가상 노드 기능을 이용하면 2개 이상의 노드를 하나의 머신에 설치해서 클러스터를 구성할 수 있다. 클러스터링된 노드들은 JEUS Manager 간에 P2P(Peer-to-Peer)로 연결을 맺고 주기적으로 서로의 상태를 점검한다. 만약 노드 하나가 다운되었을 경우 이에 대한 대책으로 관리자에게 경고 메일을 보내고 백업 노드를 띄운다거나, 다운된 노드로 가는 요청을 다른 노드로 가도록 Failover 처리를 한다.

또한 각각의 노드에 있는 리소스와 애플리케이션을 같은 클러스터에 있는 다른 노드에서 액세스가 가능하다. 노드 클러스터링에 관한 보다 자세한 내용은 “제4장 JEUS 클러스터링”을 참고한다.

1.3. JEUS Manager

JEUS Manager는 노드에서 하나 밖에 없는 물리적인 구성 요소이고 기동할 때 시작점이 된다. 이것의 역할은 노드에 속한 여러 엔진 컨테이너를 관리하고 이들이 공통적으로 필요로 하는 서비스를 제공한다.

기동 과정에서는 먼저 JEUS Manager가 실행된 다음 자동으로 엔진 컨테이너들이 시작되거나 또는 관리 툴에 의해서 이들을 시작시킬 수 있다. 실제 운영 중에 엔진 컨테이너가 종료되었을 경우에는 종료된 엔진 컨테이너를 다시 실행시켜준다. 또한 엔진 컨테이너에서 공통적으로 필요로 하는 서비스를 제공한다.

다음은 JEUS Manager의 주요 서비스이다.

  • JNDI 서비스

  • 보안(Security) 서비스

  • Logging 서비스

  • 외부 클라이언트가 필요로 하는 서비스

    예를 들어 원격 Java 클라이언트가 Java EE의 JMX API를 통해서 엔진 컨테이너들의 모니터링 관련 정보를 얻고 싶은 경우 Management 서비스를 이용하면 된다. 이외에도 외부 클라이언트의 요청을 엔진 컨테이너로 중개하는 역할을 하기도 한다.

클러스터링 환경에서는 클러스터링에 참여한 노드들의 JEUS Manager 간에 서로 상태 체크를 하기 때문에 Failover 기능에서 중요한 역할을 한다. 노드에 대한 제어는 일반적으로 JEUS Manager를 통해서 이루어지며, 콘솔 툴이나 WebAdmin을 통해서 JEUS Manager에 명령을 내릴 수 있다.

참고

콘솔 툴에 대한 자세한 사항은 "JEUS Reference Book"을 참고하고, WebAdmin에 대한 사항은 "JEUS WebAdmin 안내서"를 참고한다.

1.3.1. 공통 서비스

다음은 JEUS Manager에서 제공하는 엔진 컨테이너에서 공통적으로 필요로 하는 서비스에 대한 설명이다.

  • JNDI 서비스

    JNDI 서비스는 Java EE에서 정의한 JNDI 표준의 매커니즘을 제공하는 것으로서 JEUS에 등록된 다양한 객체들을 정해진 이름으로 찾아서 사용할 수 있는 방법을 제공한다. JEUS Manager에서는 이 서비스를 제공하는 개체를 JNDI Naming 서버라고 한다. 클러스터링 환경에서는 각각의 JEUS Manager에서 동작하는 JNDI Naming 서버끼리 서로 정보를 교환하면서 마치 하나의 JNDI Naming 서버가 있는 것처럼 동작한다. JNDI 서비스에 관한 자세한 내용은 “제6장 JNDI Naming Server”를 참고한다.

  • 보안(Security) 서비스

    보안 서비스는 애플리케이션 및 내부 컴포넌트의 보안 요청에 대한 응답 및 각종 인증 작업을 수행한다. 보안 서비스에 관련된 자세한 내용은 "JEUS Security 안내서"를 참고한다.

  • Logging 서비스

    JEUS Manager 및 엔진 컨테이너에서 발생하는 이벤트와 에러를 파일로 기록한다. JEUS에서는 java.util.logging API를 지원하므로 로그 레벨, 로그 핸들러 등을 설정할 수 있다. Logging 서비스에 관한 자세한 내용은 “제11장 Logging”을 참고한다.

  • Management 서비스

    Management 서비스는 Java Management Extensions(JMX)를 통해 서비스, 컴포넌트, 애플리케이션에 대한 관리 및 모니터링을 위한 기반 서비스이다. JMX에 기술된 JMX Remote API 커넥터(RMI 커넥터/JMXMP 커넥터), HTML 어댑터, SNMP 어댑터와 같은 관리 객체를 JEUS Manager에 설정하고, 이를 통해 JEUS의 관리 및 모니터링 정보에 접속하는 방법을 제공한다.

    Management 서비스의 설정 및 각 관리 객체에 대한 자세한 내용은 "JEUS JMX 안내서"를 참고한다.

  • HTTP 세션 클러스터링 서비스

    HTTP 세션 클러스터링 서비스는 서블릿 엔진들 사이에 HTTP 세션이 유지될 수 있도록 하는 서비스이다. JEUS는 설정에 따라서 중앙식과 분산식 방식의 HTTP 세션 클러스터링을 지원한다. JEUS Manager에서는 중앙식 HTTP 세션 클러스터링 서비스를 제공한다. 중앙식 HTTP 세션 클러스터링 서비스를 제공하는 JEUS Manager에 연결된 서블릿 엔진들은 HTTP 세션을 공유할 수 있다. 이 경우 서블릿 엔진에 대한 장애에도 HTTP 세션은 유지된다.

    JEUS Manager에서 제공되는 중앙식 HTTP 세션 클러스터링 서비스는 사용 및 관리의 장점이 있지만, 연결된 모든 서블릿 엔진의 HTTP 세션의 백업 정보를 가지고 있기 때문에 JEUS Manager가 실행되는 JVM에 많은 메모리 공간이 필요할 수 있다. 경우에 따라서 OutOfMemoryError가 발생할 수도 있다. 서버를 운영하는 경우에 HTTP 세션에 대한 메모리 부담으로 OutOfMemoryError가 자주 발생한다면 분산식 HTTP 세션 클러스터링 서비스를 사용하길 권장한다.

    JEUS에서 제공하는 HTTP 세션 클러스터링 서비스에 관한 자세한 설명은 “제10장 세션 서버”를 참고한다.

  • 스케줄러 서비스

    스케줄러는 사용자가 미리 지정한 시간에 특정 작업들을 실행시킨다. 스케줄러는 JEUSManager 레벨뿐만 아니라 엔진 컨테이너 단위에서도 실행이 가능하다. 보다 자세한 정보는 "JEUS Scheduler 안내서"를 참고한다.

  • Class FTP 서비스

    EJB 2.x의 경우 원격 클라이언트에서 EJB를 호출하기 위해서는 기본적으로 RMI Stub 클래스를 필요로 하게 된다. 이때 원격 클라이언트에 RMI Stub 클래스를 미리 패키징하지 않더라도 Class FTP 서비스를 통해서 필요한 클래스들을 전송받아서 사용할 수 있다.

    Class FTP 서비스를 사용하지 않는다면 RMI Stub 클래스들을 원격 클라이언트의 클래스 패스(classpath)에 있어야 한다. 이에 대한 예제는 JEUS EJB 안내서”의 “제11장 EJB 클라이언트”를 참고한다.

    참고

    실제로 클래스 파일을 전송하는 프로토콜은 FTP 프로토콜이 아니라 HTTP 프로토콜을 사용한다.

  • WebAdmin 서비스

    WebAdmin은 JEUS를 관리하기 위한 웹 기반의 관리 콘솔이다. 사용자들은 WebAdmin을 통해서 좀 더 편리하게 애플리케이션 디플로이, 서버 설정 변경 등을 할 수 있다. 자세한 내용은 "JEUS WebAdmin 안내서"를 참고한다.

  • 외부 리소스(External Resources)

    JEUS Manager는 애플리케이션에 여러 가지 종류의 외부 리소스에 대한 연결을 제공한다.

    외부 리소스설명
    Data Source데이터베이스와의 연결(JDBC 표준에서 정의한 데이터소스)
    Mail Source메일 서버와의 연결
    URL SourceURL 소스와의 연결
    External SourceTP Monitor(Tmax), IBM MQ 등의 엔터프라이즈 정보 시스템(EIS)과의 연결(JCA 리소스 어댑터를 디플로이하는 방식과는 구분된다)
    JAXR SourceXML 레지스트리 소스

    외부 리소스에 대한 연결 정보는 사용자가 직접 추가할 수 있으며 JNDI Naming 서버에 등록되어 애플리케이션에서 JNDI lookup Operation을 통해 이용할 수 있다. 외부 리소스는 노드나 JEUS Manager에 속한다고 볼 수 없지만, JNDI Naming 서버에 등록되어 애플리케이션이나 JEUS의 각종 서비스들이 이용하게 되므로 일종의 JEUS Manager 서비스로 분류한 것이다.

    클러스터링 환경일 경우에는 JNDI Naming 서버를 통해서 모든 노드가 같은 리소스 정보를 공유해서 사용하게 된다. 리소스 설정에 관련된 내용은 “제7장 External Resource”를 참고한다.

1.3.2. JEUS Manager의 Life Cycle

JEUS Manager는 다음과 같은 동작 상태를 갖는다.

[그림 1.3] JEUS Manager의 상태 전이도

JEUS Manager의 상태 전이도


상태설명
BOOTINGJEUS Manager가 시작중인 상태로 아직 관리 툴로부터 명령을 받을 수 있는 단계는 아니다.
READYJEUS Manager의 기동이 완료되어 엔진 컨테이너를 시작하거나 JNDI 서비스 등의 공통 서비스를 사용할 수 있는 상태이다.
SHUTTINGDOWNJEUS Manager가 중단되고 있는 상태로 엔진 컨테이너를 중단시키고 각종 서비스를 내리는 상태이다.
SHUTDOWNJEUS Manager가 실행되지 않은 상태이다.

JEUS Manager를 시작시키려면 실행 스크립트를 사용해야 한다. JEUS에서는 jeus라는 이름으로 제공한다. jeus 스크립트를 실행하면 SHUTDOWN 상태에서 BOOTING 상태로 가게 되고, JEUS Manager의 초기화가 완료되면 READY 상태가 된다. JEUS Manager가 READY 상태일 때 관리 툴로 엔진 컨테이너를 실행시키거나 JEUS Manager를 종료할 수 있다.

참고

jeus 스크립트의 사용 방법에 관해서는JEUS Reference Book”의 “제3장 jeus”를 참고한다.

1.3.3. Base Port

JEUS가 시스템 내부, 다른 노드 또는 원격 클라이언트와 통신하기 위해 필요로 하는 기본 TCP 소켓 포트를 Base Port라 한다. 기본적으로 9736을 사용한다. 이 Port는 JEUS Manager가 구동되면서 열리며 다른 서비스들의 Port는 이 Base Port에 기반하여 상대적으로 결정된다. 몇몇 서비스의 경우에는 서비스 특성에 따라 별도의 Port를 사용하는 경우도 있지만 대부분의 서비스들은 Base Port를 통해 이용할 수 있다.

1.4. 엔진 컨테이너

엔진 컨테이너는 실제 애플리케이션을 서비스하는 엔진들과 여러 공통 서비스들을 호스팅하는 서버 개체를 의미한다.

엔진 컨테이너는 노드에서 하나 이상 존재할 수 있는 물리적인 구성 요소이며, 사용자가 디플로이하는 애플리케이션을 관리하고 이러한 애플리케이션이 필요로 하는 서비스를 제공한다. 서블릿, EJB 컴포넌트를 관리하는 엔진(Engine)과 Java Message Service(JMS)를 제공하는 엔진이 있고, 이러한 엔진들이 필요로 하는 다음과 같은 서비스를 제공한다.

  • HTTP 세션 클러스터링 서비스

  • 트랜잭션 서비스

  • 데이터베이스(Database) 또는 엔터프라이즈 정보 시스템(Enterprise Information System) 연결 서비스

  • 스케줄러 서비스 등의 다양한 서비스

엔진 컨테이너는 사용자가 구현한 애플리케이션이 디플로이되는 기본 Target이다. 하나의 애플리케이션을 노드에 디플로이할 경우 실제로는 여러 개의 엔진 컨테이너에 각각 디플로이하게 된다. 물론 설정에 따라 특정 엔진 컨테이너에만 디플로이할 수도 있다.

참고

JEUS Manager와 엔진 컨테이너를 물리적인 구성 요소라고 하는 이유는 각각 다른 JVM으로 실행되기 때문이다. 이것은 일반적으로 하나의 JVM으로 서버 인스턴스를 구성하는 타 벤더의 제품들과 구분되는 특징이다. 그러나 JEUS Manager와 엔진 컨테이너가 서로 다른 JVM이라고 하더라도 JEUS Manager가 다운되었을 경우에는 노드가 다운된 것과 다름없기 때문에 그에 속한 모든 엔진 컨테이너를 종료시킨다. 좀 더 자세한 내용은 “1.4.6. JEUS Manager 감시 및 Self-Down 기능”을 참고한다.

1.4.1. 엔진(Engine)

엔진은 Java EE에서 정의한 EJB 컨테이너, 웹 컨테이너와 매핑되는 개념으로 사용자가 디플로이한 컴포넌트를 관리하는 역할을 한다. 엔진은 엔진 컨테이너에 포함되는 요소이며, JEUS Manager 및 엔진 컨테이너가 제공하는 서비스들을 이용하여 컴포넌트를 실행시킨다.

JEUS의 엔진은 다음과 같이 4가지 종류가 있다.

엔진설명
EJB 엔진EJB 컴포넌트를 관리하고 실행하는 EJB 컨테이너 역할을 한다. 이에 대한 자세한 사항은 "JEUS EJB 안내서"를 참고한다.
서블릿 엔진(또는 웹 엔진)웹 컨테이너라고 할 수 있으며, 웹 클라이언트 또는 웹 서버로부터 요청을 받아서 사용자가 디플로이한 서블릿(또는 JSP, JSF)을 통해 동적인 웹 콘텐츠를 생성한다. 이에 대한 자세한 사항은 "JEUS Web Container 안내서"를 참고한다.
JMS 엔진Java Message Service(JMS)를 제공한다. 이에 대한 자세한 사항은 "JEUS MQ 안내서"를 참고한다.
웹 서버 엔진

JEUS에서 제공하는 내장 웹 서버를 시작 또는 정지시키기 위해 사용하는 Agent 역할을 한다.

참고로 내장 웹 서버는 WebtoB Standard Version에서 일부 기능이 제외되어 있는 버전이다. 이에 대한 자세한 사항은 "JEUS Web Container 안내서"를 참고한다.

참고

엔진은 종류별로 최대 하나씩 엔진 컨테이너에 설정할 수 있다. 엔진은 JEUS Manager나 엔진 컨테이너처럼 독립된 JVM으로 동작하는 물리적인 요소가 아니라 엔진 컨테이너에 속한 것이다. 그렇다고 하나의 특정한 스레드로 볼 수 없으며, 기능적인 측면에서 나눈 개념이다.

1.4.2. 주요 서비스

다음은 엔진 컨테이너의 주요 서비스에 대한 설명이다.

  • HTTP 세션 클러스터링 서비스

    HTTP 세션 클러스터링 서비스는 서블릿에서 사용하는 HTTP 세션 객체를 여러 컨테이너에서 공유해서 사용할 수 있도록 하는 서비스이다. 설정에 따라서 중앙식과 분산식 Http 세션 클러스터링을 제공한다. 엔진 컨테이너에서는 분산식 HTTP 세션 클러스터링 서비스를 선택적으로 제공할 수 있다.

    분산식 HTTP 세션 클러스터링 서비스를 선택하면 엔진 컨테이너들은 자신이 사용한 HTTP 세션를 가지고 있고, 해당 컨테이너에 없는 HTTP 세션의 요청에 대해서는 다른 컨테이너에서 가져와서 사용한다. 그리고 각 컨테이너는 다른 컨테이너에 HTTP 세션 정보에 대한 백업본을 가지고 있기 때문에 컨테이너의 장애 시에도 해당 컨테이너의 HTTP 세션은 유지된다.

    분산식 HTTP 세션 클러스터링 서비스에 관한 자세한 설명은 “제10장 세션 서버”를 참고한다.

  • 트랜잭션 서비스

    트랜잭션 매니저를 통해서 디플로이된 애플리케이션이 트랜잭션을 사용할 수 있다. 트랜잭션 매니저에 관한 설명은 “제9장 트랜잭션 매니저”를 참고한다.

  • 데이터베이스 연결 서비스

    애플리케이션이 JDBC Connection Pool을 통해서 데이터베이스에 접근할 수 있다. 이에 관한 자세한 내용은 “제8장 DB Connection Pool과 JDBC”를 참고한다.

  • 엔터프라이즈 정보 시스템(EIS) 연결 서비스

    애플리케이션이 디플로이된 JCA 리소스 어댑터나 외부 리소스 등록 정보를 통해서 EIS에 접근할 수 있다. JCA 리소스 어댑터에 관한 자세한 내용은 "JEUS JCA 안내서"를 참고한다.

  • 스케줄러 서비스

    스케줄러는 사용자가 미리 지정한 시간에 특정 작업들을 실행시켜준다. 스케줄러는 엔진 컨테이너뿐만 아니라 JEUS Manager 레벨에서도 실행이 가능하다. 보다 자세한 정보는 "JEUS Scheduler 안내서"를 참고한다.

  • Management 서비스

    Management 서비스는 JEUS Manager 뿐만 아니라 엔진 컨테이너에서도 독자적으로 제공한다. Management 서비스의 설정 및 각 관리 객체에 대한 자세한 내용은 "JEUS JMX 안내서"를 참고한다.

  • Logging 서비스

    기본적으로 Logging은 JEUS Manager가 담당하지만 엔진 컨테이너 독자적으로도 자신의 이벤트와 에러를 파일로 기록할 수 있다. java.util.logging API를 지원하므로 로그 레벨, 로그 핸들러 등을 설정할 수 있다. Logging 서비스에 관한 자세한 내용은 “제11장 Logging”을 참고한다.

1.4.3. 엔진 컨테이너의 Life Cycle

엔진 컨테이너는 다음과 같은 동작 상태를 갖는다. 단, 엔진 컨테이너의 상태는 JEUS Manager에 의해서 결정된다.

[그림 1.4] 엔진 컨테이너의 상태 전이도

엔진 컨테이너의 상태 전이도


상태설명
BOOTINGJEUS Manager에 의해서 시작 중인 상태이다(서비스가 올라가거나 애플리케이션이 디플로이 중인 상태이다).
READY서비스 초기화 및 애플리케이션 디플로이가 완료되어 외부의 요청을 처리할 수 있는 상태이다.
SHUTTINGDOWNJEUS Manager에 의해서 중단되고 있는 상태로 외부의 요청을 차단하고 각종 서비스를 내리는 상태이다.
SHUTDOWN엔진 컨테이너가 실행되지 않은 상태이다.

JEUS Manager가 READY 상태일 때 관리 툴을 통해서 엔진 컨테이너를 시작시키거나 다운시킬 수 있다. 만약 엔진 컨테이너가 STARTING 상태에서 설정 오류나 시스템 오류로 인해 시작이 실패했을 경우에는 SHUTDOWN 상태가 된다. 이때 관리 툴에 의해서 다시 STARTING 상태로 될 수 있다. JEUS에서는 관리 툴로 콘솔 툴(jeusadmin), WebAdmin을 제공한다.

참고

콘솔 툴과 관련된 내용은 JEUS Reference Book”의 “4.2.3. 공통 명령어”를, WebAdmin에 관한 자세한 사항은 "JEUS WebAdmin 안내서"를 참고한다.

1.4.4. Invocation Manager

Invocation Manager는 엔진 컨테이너에서 컴포넌트(서블릿/JSP, Stateless Session Bean, MDB)를 호출하는 경우에 사용하는 리소스에 대해 Logging을 남기거나 반환하는 작업을 한다. 이 구성요소를 위해 3가지 모드 중 하나를 선택할 수 있다.

모드설명
NoAction아무런 동작을 하지 않는다.
Warning컴포넌트 호출시 반환되지 않은 리소스에 대한 로그를 남긴다.(기본값)
AutoClose컴포넌트 호출시 반환되지 않은 리소스에 대한 로그를 남기고 이를 닫아준다.

1.4.5. 디폴트 엔진 컨테이너

엔진 컨테이너는 JEUS Manager가 실행되는 JVM과는 다른 JVM에서 실행된다. 이것은 애플리케이션의 오류로 인해 엔진 컨테이너에 문제가 발생하더라도 JEUS Manager에는 영향을 주지 않기 위한 구조이다. 그러나 명시적으로 엔진 컨테이너의 이름을 'default'로 정함으로써, JEUS Manager가 실행되는 JVM에서 엔진 컨테이너를 실행 시킬 수 있다. Default 엔진 컨테이너는 주로 개발 환경에서 여러 엔진 컨테이너를 운영할 필요가 없을 때 사용된다.

1.4.6. JEUS Manager 감시 및 Self-Down 기능

보통 모든 엔진 컨테이너는 JEUS Manager가 실행되는 JVM과는 다른 JVM에서 실행된다. 이것은 엔진 컨테이너나 혹은 그것에 포함된 엔진들에 문제가 발생할 경우 JEUS Manager에는 영향을 주지 않기 위한 구조이다. 그러나 이와 반대로 JEUS Manager에 문제가 생길 경우 엔진 컨테이너에서 운영되는 애플리케이션들이 JEUS Manager의 서비스를 이용할 수가 없기 때문에 정상적으로 진행되지 않을 수 있다.

따라서 엔진 컨테이너가 JEUS Manager의 상태를 주기적으로 감시하고, 만약 JEUS Manager에 이상이 생길 경우 자체적으로 다운(Self-Down)하는 기능을 제공한다.

참고

Default 엔진 컨테이너의 경우 JEUS Manager 감시 및 Self-Down 기능이 필요 없으므로 사용하지 않는다.

JEUS Manager 감시의 상태 전이

엔진 컨테이너가 JEUS Manager의 상태를 잘못 판단하거나 순간적인 부하로 인해 잠시동안 비정상 상황이 되는 경우에 엔진 컨테이너가 Self-Down해 버리면 문제가 있을 수 있다.

따라서 JEUS Manager 감시는 다음과 같은 4단계로 나눠서 상태를 최대한 올바르게 판단할 수 있도록 한다.

[그림 1.5] Manager 감시의 상태전이

Manager 감시의 상태전이

상태설명
NO_STATUSJEUS Manager를 감시하기 전의 초기 상태이다.
ALIVEJEUS Manager가 올바로 동작하고 있는 상태이다.
INDOUBT

JEUS Manager의 동작이 의심스러운 상태이다.

(예: JEUS Manager가 일시적으로 오동작하고 있거나 실제 JEUS Manager에 이상이 생겼을 경우)

FAIL

JEUS Manager 감시의 상태가 지속적으로 특정 횟수 이상으로 INDOUBT상태이기 때문에 비로소 JEUS Manager에 이상이 생겼다고 판별한 상태이다(JEUS Manager의 상태가 FAIL일 경우 엔진 컨테이너는 Self-Down 동작을 수행한다).

JEUS Manager 감시 방법

JEUS Manager 감시의 경우 다음의 2가지 종류 중 하나를 선택하여 사용할 수 있으며, JEUS Manager 감시(Self-Down 기능)를 사용하지 않을 수도 있다.

구분설명
BeaconJEUS Manager에서 내부적으로 사용하는 Beacon 서비스를 이용하는 방법으로 JEUS 고유의 통신 방법을 이용한다.
JMXJMX를 이용하여 JEUS Manager에 존재하는 MBean 객체를 Query하여 상태를 확인한다.
NoneJEUS Manager 감시 및 Self-Down 기능을 사용하지 않는다.

참고

1. JEUS Manager 감시를 사용할 경우 사용하는 감시 로직의 종류에 상관없이 결국 JEUS Manager 프로세스의 PID의 유일성(Unique)을 이용하여 Manager의 상태를 판별한다.

2. 아무 설정을 하지 않았을 경우 Beacon을 사용하며 자세한 설정은 "JEUS Manager 감시의 설정"을 참조한다.

JEUS Manager 감시의 설정

다음과 같은 엔진 컨테이너 옵션으로 JEUS Manager 감시(Self-Down기능)를 세부적으로 조정할 수 있다. JEUS Manager 감시의 상태전이의 경우 위의 "JEUS Manager 감시 방법"을 참조한다.

  • -Djeus.container.monitor.type

    • JEUS Manager 감시의 종류를 선택한다.

    • String 형식으로 지정하며 "beacon", "jmx", "none"을 선택할 수 있다. (기본값: "beacon")

    • 다음은 설정 예제이다.

      -Djeus.container.monitor.type="none"
  • -Djeus.container.monitor.period

    • JEUS Manager를 감시할 때의 Heart Beating 주기를 설정한다. (기본값: 30초, 단위: ms)

    • 다음은 설정 예제이다.

      -Djeus.container.monitor.period=30000
  • -Djeus.container.monitor.retry

    • JEUS Manager 모니터링할 때 실패로 인한 재시도 횟수로 한 번이라도 실패할 경우 INDOUBT 상태가 된다. (기본값: 5번, 단위: int)

    • 다음은 설정 예제이다.

      -Djeus.container.monitor.retry=5
  • -Djeus.server.maxdowntime

    • JEUS Manager 감시 후 JEUS Manager가 FAIL 상태일 경우 엔진 컨테이너를 자동 down할 때 지정된 시간만큼 down을 기다린다. 만약 설정 값이 0일 경우 timeout 기능을 사용하지 않으며, 엔진 컨테이너가 정상 down될 때까지 무한히 기다린다. (기본값: 0, 단위: ms)

    • 다음은 설정 예제이다.

      -Djeus.server.maxdowntime=300000
  • -Djeus.server.beaconConnectTO

    • JEUS Manager 감시 종류 중 "beacon"을 사용할 때 Connection Timeout을 지정한다. (기본값: 30초, 단위: ms)

    • 다음은 설정 예제이다.

      -Djeus.server.beaconConnectTO=30000
  • -Djeus.server.beaconReplyReadTO

    • JEUS Manager 감시 종류 중 "beacon"을 사용할 때 JEUS Manager로부터의 응답(Reply) Timeout을 지정한다. (기본값: 10초, 단위: ms)

    • 다음은 설정 예제이다.

      -Djeus.server.beaconReplyReadTO=10000

1.5. Class Loader의 구조

JEUS에서 지원하는 Isolated Class Loader와 Shared Class Loader에 대해서 설명한다.

1.5.1. Isolated Class Loader

JEUS는 애플리케이션 간에 클래스가 중복되어 발생하는 문제를 방지하기 위해 애플리케이션마다 서로 다른 클래스 로더를 사용한다. 이를 Isolated Class Loader(이하 Isolated)라고 하는데, Java EE 표준은 이 방식을 기본으로 사용할 것을 권장하고 있으며 JEUS도 그 권고를 따르고 있다.

참고

JEUS v5.0 이하 버전에서는 Shared 클래스 로더(이하 Shared) 방식을 기본적으로 사용하기 때문에 하위 호환성을 위해 그 방식을 계속 제공한다. 하지만 Shared 방식을 사용하는 것을 권장하지 않기 때문에 아무런 설정을 하지 않았다면 기본적으로 Isolated 방식을 사용하게 된다.

다음은 Isolated Class Loader 계층 구조이다.

[그림 1.6] Isolated Class Loader 계층 구조

Isolated Class Loader 계층 구조


이 구조에서는 각 애플리케이션의 웹 모듈의 클래스 로더가 그 애플리케이션의 EJB 클래스 로더의 하위에 존재한다. 그리고 한 애플리케이션의 클래스 로더는 다른 애플리케이션의 클래스 로더에 클래스를 요청하지 않는다. Java EE 표준은 애플리케이션이 다른 애플리케이션의 인터페이스를 필요로 하는 경우 그 인터페이스들을 같이 패키징하도록 규정하고 있으므로 다른 애플리케이션의 클로스 로더를 참조할 수 없다.

클래스를 공유해서 사용하지 않기 때문에 한 애플리케이션을 다시 디플로이할 때 다른 애플리케이션도 같이 다시 디플로이할 필요가 없어진다. 이 클래스 로더 구조를 제대로 사용하기 위해서는 결국 연관된 애플리케이션끼리 EAR로 묶어서 하나의 애플리케이션으로 만드는 작업이 필요하다.

1.5.2. Shared Class Loader

웹 클래스 로더가 EJB 클래스 로더로 클래스를 요청할 수 있다. EJB 모듈 클래스 로더 중 하나가 다른 EJB 모듈 클래스 로더로 필요한 클래스를 요청할 수도 있다. 이처럼 서로 다른 애플리케이션 간에 클래스 로더를 공유하는 것을 Shared Class Loader라고 한다.

다음은 Shared Class Loader 계층 구조이다.

[그림 1.7] Shared Class Loader 계층 구조

Shared Class Loader 계층 구조


다음은 각 애플리케이션의 클래스 로더에 대한 설명이다.

구분설명
JEUS root class loader시스템 라이브러리와 JDBC 드라이버, 애플리케이션 공유 라이브러리 등을 로딩할 때 사용한다.
Web class loader웹 애플리케이션에서 사용하는 클래스를 로드할 때 사용된다.
Web context class loader웹 컨텍스트에 해당되는 서블릿 클래스를 로딩한다.
EJB class loaderEJB 엔진에서 필요로 하는 클래스를 로딩한다.
EJB module class loader특정 EJB 모듈의 클래스와 라이브러리를 로딩한다.

참고

JEUS v5.0 이하 버전에서는 애플리케이션이 다른 애플리케이션의 EJB를 요청할 때 해당 EJB의 인터페이스와 클래스가 없어도 클래스 로더를 공유함으로써 필요한 클래스를 찾을 수 있다. 하지만 하나의 애플리케이션을 다시 디플로이할 경우나 Undeploy할 경우에는 다른 관련 애플리케이션들을 모두 다시 디플로이해야 하는 문제가 발생한다.