제3장 EJB 모듈

내용 목차

3.1. 개요
3.2. EJB 모듈 관리
3.3. EJB 모듈 조립
3.3.1. EJB 클래스 컴파일
3.3.2. Deployment Descriptors(DD) 작성
3.3.3. EJB JAR 파일 패키징
3.4. EJB 모듈 Deploy
3.4.1. Deploy
3.4.2. Deploy된 EJB 모듈의 디렉터리 구조
3.5. EJB 모듈 제어 및 모니터링
3.5.1. EJB 모듈 제어
3.5.2. EJB 모듈 모니터링

본 장에서는 EJB 모듈의 구조와 관리 방법에 대해서 설명한다.

EJB 모듈은 EJB 엔진에 deploy할 수 있는 기본 단위이다. 또한 EJB 컴포넌트들을 그룹화하고 이들의 설정 정보를 DD로 표현할 수 있도록 한 것이다. EJB를 deploy할 경우에는 단 하나의 EJB 컴포넌트를 deploy하더라도 반드시 EJB 모듈로 패키징해야 한다.

참고

EJB 2.1 이하의 컴포넌트인 경우에는 EJB 모듈에 반드시 DD(ejb-jar.xml)가 있어야 하지만 3.0 이상의 컴포넌트부터는 Annotation을 지원하게 되면서 DD는 선택 사항으로 변경되었다.

다음은 JEUS 내부적으로 EJB 모듈을 관리하기 위한 4가지 주요 작업으로 각 작업에 대한 상세한 설명은 세부 절을 참고한다.

EJB 모듈의 관리 순서는 다음과 같다.


EJB 모듈 JAR 파일 구조

다음은 표준 EJB 모듈 JAR 파일의 구조에 대한 설명이다.


META-INF
파일설명
ejb-jar.xml실제적인 표준 EJB DD 파일이다. Annotation으로 설정 정보를 표현한 경우에는 존재하지 않을 수 있다. 단, EJB 2.x 스타일의 경우에는 반드시 필요하다.
jeus-ejb-dd.xmlJEUS에서 EJB를 deploy할 때 필요한 DD 파일이다. (선택 사항)
<package name>\

EJB 클래스들을 포함하고 있다. EJB 소스 코드에 정의되어 있는 것과 같이 Java 패키지 구조를 반영하는 구조로 되어 있어야 한다. 예를 들어 하나의 EJB가 "mypackage"라는 패키지에 속해 있다고 선언되어 있으면 EJB의 클래스는 반드시 EJB JAR의 "mypackage"라는 디렉터리 아래에 위치해야 한다.

다음과 같은 EJB 컴포넌트를 포함한다.

EJB 컴포넌트설명
인터페이스클라이언트가 접근하기 위한 EJB 2.x 스타일의 인터페이스, 3.0 이상의 인터페이스들이다.
엔터프라이즈 Bean 클래스인터페이스에 맞춰서 실제 업무 로직을 구현한 Bean 클래스들을 의미한다.

Helper library

MANIFEST.MF Class-Path Entry에 명시한 라이브러리에 해당한다.

[그림 3.1]과 같이 EJB 모듈을 조립(Assembling)할 때는 다음의 과정을 수행한다.

  1. EJB 클래스 컴파일

    개발자가 구현한 EJB 소스 파일들을 컴파일한다.

  2. DD 작성

    • ejb-jar.xml DD 작성

    • jeus-ejb-dd.xml DD 작성

  3. EJB JAR 파일 패키징

    JAR 파일로 EJB 클래스와 DD를 패키징한다.

다음 절부터는 "counter" 예제를 통해 EJB 모듈 조립 과정을 설명한다. "counter"는 JEUS_HOME/samples/ejb/basic/statefulSession/ 디렉터리에 위치한 Stateful Session Bean으로, 다음과 같은 2개의 Java 소스 파일이 갖는다.

  • Counter.java(business interface)

  • CounterEJB.java(bean implementation)

참고

Stateful Session Bean이나 다른 종류의 Bean에 대한 자세한 정보는 “제7장 Session Bean”, “제9장 Message Driven Bean(MDB)”을 참고한다.

EJB 모듈을 deploy할 때 사용되는 DD는 다음과 같이 2가지로 나누어진다.

표준 EJB DD(ejb-jar.xml) 작성

DD의 포맷은 EJB 표준에 따른다. 대부분 Annotation으로 가능하지만 필요한 경우 DD를 사용한다.

package ejb.basic.statefulSession;
@Remote
public interface Counter
{
   public void increase();
  ...
}
package ejb.basic.statefulSession;
@Stateful
@EJB(name="counter")
@TransactionManagement( TransactionManagementType.BEAN)
public class CounterEJB implements Counter {
   private int count = 0;

   public void increase()
   {
      count++;
   }
 ...
}

다음 예제는 Annotation을 "counter" Bean의 간단한 EJB 표준 DD(ejb-jar.xml)를 나타낸 것이다.


참고

EJB 3.0 이상부터는 ejb-jar.xml의 모든 내용은 Annotation으로 표현 가능하므로 선택적으로 사용한다.

JEUS EJB DD(jeus-ejb-dd.xml) 작성

JEUS EJB DD가 필요한 이유는 EJB 엔진에 deploy하기 위한 기본 설정 및 External Reference들을 JEUS 서비스에 매핑시키기 위함이다. 그 외에도 인스턴스 Pooling과 Entity Bean, DB 테이블과의 매핑 설정도 jeus-ejb-dd.xml에서 한다.

참고

이러한 설정들은 EJB 모듈을 JEUS에 맞추어 deploy하기 위해서 필요한 작업들이지만 일부는 Annotation으로 설정 가능하고 jeus-ejb-dd.xml이 존재하지 않아도 기본값으로 설정되기 때문에 별도로 환경설정을 해야 하는 경우에만 이 작업을 수행한다.

JEUS EJB DD는 표준 EJB DD에 부가적인 설정으로 볼 수 있다. 표준 EJB DD와 마찬가지로 JEUS EJB DD도 EJB 모듈에 적용된다.

다음은 JEUS EJB DD의 전반적인 구성이다.

[예 3.2] JEUS EJB DD : <<jeus-ejb-dd.xml>>

<?xml version="1.0"?>
<jeus-ejb-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <module-info>
        <role-permission>
            <!-- See chapter “4.2.5. EJB 보안 설정” -->
            . . .
        </role-permission>
    </module-info>
    <beanlist>
        <jeusbean>
            <!-- See chapters “제4장 EJB의 공통 특성”
                 and “제7장 Session Bean” -->
            . . .
        </jeusbean>
        <jeusbean>
            <!-- See chapters “제4장 EJB의 공통 특성”
                 and “제7장 Session Bean” -->
            . . .
        </jeusbean>
            . . .
    </beanlist>
    <ejb-relation-map>
        <!-- See chapter “제8장 Entity Bean” -->
    </ejb-relation-map>
    <message-destination> 
        <jndi-info>
            <ref-name>ejb/AccountEJB</ref-name>
            <export-name>ACCEJB</export-name>
        </jndi-info>
    </message-destination>

    <library-ref>
        <library-name>jsf</library-name>
        <specification-version>
            <value>1.2</value>
        </specification-version>
        <implementation-version>
            <value>1.2</value>
        </implementation-version>
    </library-ref>

</jeus-ejb-dd>  


JEUS EJB DD의 주요 요소들은 다음과 같다.

항목설명
<module-info>EJB 모듈 전체에 적용되는 포괄적인 정보를 설정한다. Role Assignment에 관련된 정보는 “4.2.5. EJB 보안 설정”을 참고한다.
<beanlist>

모듈에 포함되는 EJB들을 선언한다. 이 하위 태그의 이름과 내용은 Bean의 종류(Session Bean. Entity Bean, MDB)에 따라 세부 설정이 달라진다.

<beanlist>와 그것의 하위 태그는 “제4장 EJB의 공통 특성”, “제7장 Session Bean”부터 “제9장 Message Driven Bean(MDB)”을 통해 자세히 설명한다.

<ejb-relation-map>CMP 2.0 Bean들을 위한 CMR 매핑을 정의한 EJB Relation Mapping 설정이다. CMP는 더 이상 사용을 권장하지 않으므로 JPA를 사용한다.
<message-destination>ejb-jar.xml의 <message-destination>에 선언된 message destination과 JNDI에 등록된 실제 Destination 객체를 매핑한다.
<library-ref>애플리케이션에서 사용할 공유 라이브러리(shared library) 정보를 설정한다.

본 절에서는 EJB 모듈의 deploy에 대한 내용을 설명한다.

일반적으로는 deploy할 때 EJB 클래스를 컴파일하지만 appcompiler를 사용해서 EJB 클래스를 미리 컴파일하면 deploy할 때의 속도를 향상시킬 수 있다. 또한 Auto Deploy 기능을 사용해서 손쉽게 EJB 모듈을 deploy할 수도 있다. Deploy에 대한 자세한 내용은 "JEUS Applications & Deployment 안내서"를 참고한다.

[그림 3.1]에서 JEUS는 다음과 같은 방법으로 EJB 모듈을 deploy한다.

  • appcompiler 툴 이용

    appcompiler 툴을 사용하면 Stub과 Skeleton 파일들을 미리 생성하여 Deploy 속도를 빠르게 할 수 있다.

  • EJB 모듈의 Boot-time Deploy

    EJB 엔진이 시작할 때마다 EJB 모듈이 자동으로 deploy되도록 한다.

  • EJB 모듈의 Runtime Deploy

    EJB 엔진이 시작되고 난 후에 즉, EJB 엔진이 운영되고 있을 때 EJB 모듈을 deploy한다. 콘솔 툴과 WebAdmin을 사용해서 EJB 모듈을 EJB 엔진에 deploy한다.

appcompiler 툴 이용

EJB 2.x 모듈의 경우 appcompiler 툴을 사용함으로써 Stub과 Skeleton 파일들을 미리 생성하여 Deploy 속도를 빠르게 할 수 있다. appcompiler를 사용할 경우에는 콘솔 툴의 deploy 명령어를 실행할 때 –fast 옵션을 사용한다. 이 옵션이 사용되지 않을 경우에는 appcompiler는 효과가 없다. appcompiler 툴에 대한 자세한 정보는 JEUS Reference Book”의 “4.3. appcompiler”를 참조한다.

EJB 모듈의 Boot-time Deploy

MS가 기동(Booting)될 때 deploy되는 것을 Boot-time Deploy라고 하는데, DAS를 통해 한 번 deploy된 애플리케이션은 MS를 기동할 때마다 Boot-time Deploy가된다. 애플리케이션의 Deploy 설정에 대한 자세한 내용은 JEUS Applications & Deployment 안내서”의 “제4장 애플리케이션 작성 및 Deploy”를 참고한다.

하나의 도메인에 여러 개의 애플리케이션을 등록할 수 있다.

EJB 모듈의 Runtime Deploy

Runtime deploy는 실행되고 있는 EJB 엔진에 EJB 모듈을 deploy하는 것을 의미한다. 콘솔 툴의 deploy 명령어를 사용해서 실행되고 있는 EJB 엔진에 모듈을 설치할 수 있다.

"countermod" EJB 모듈의 deploy 과정을 설명한다. 모듈을 deploy하기 위해 다음의 사항을 가정한다.

  • JEUS의 adminServer이라는 DAS와 server1이라는 MS가 이미 기동(Booting)되어 있다.

  • countermod 모듈이 JEUS_HOME/apphome 하위의 countermod.jar나 countermod 디렉터리 형태로 존재한다.

EJB 모듈의 Runtime Deploy는 콘솔 툴을 사용하거나 WebAdmin을 사용할 수 있다.

EJB 모듈이 deploy된 후에 클래스 파일들과 설정 파일들은 다음과 같은 구조로 JEUS 설치 디렉터리에 배포된다.


JEUS_HOME/domains/<domain name>/servers/<server name>/.workspace/deployed/ 디렉터리는 <server name>에 해당하는 MS에 deploy된 애플리케이션들이 존재하는 디렉터리이다. 여기에는 deploy된 EJB 모듈의 EJB 구현 클래스들뿐만 아니라 helper 클래스들이 위치한다.

Deploy 방식은 다음과 같이 나누어지며, 방식에 따라 deploy되는 파일이 위치하는 디렉터리가 달라진다.

Deploy 방식설명
EAR Deploy 방식EAR 파일이 deploy되는 경우에는 해당 EAR 파일 이름으로 생성된 디렉터리 아래에 EAR에 포함된 모듈이 각각 놓인다.
Standalone Deploy 방식JAR 파일이 deploy된 경우에는 해당 JAR 파일 이름으로 생성된 디렉터리에 "<jar 파일 이름>_jar___" 디렉터리 아래에 놓인다.
Exploded EAR Deploy 방식EAR 파일을 Archive 형태가 아닌 풀어놓은 상태에서 deploy하는 방식이다.
Exploded Standalone Deploy 방식JAR 파일을 Archive 형태가 아닌 풀어놓은 상태에서 deploy하는 방식이다.

Exploded EAR Deploy 방식과 Exploded Standalone Deploy 방식은 webhome 디렉터리로 복사되지 않고 원래의 위치를 참조한다. JEUS에서는 Archive 파일이 존재하는 standalone Deployment를 COMPONENT Type, 풀어놓은 것을 EXPLODED COMPONENT Type이라고 부른다.

Deploy된 EJB 모듈에 대해 WebAdmin과 콘솔 툴을 사용해서 실행 상태를 제어하거나 모니터링할 수 있다. ([그림 3.1] 참고)

Deploy된 EJB 모듈을 stop-application, start-application, redeploy-application, undeploy 명령어를 사용해서 EJB 모듈 내의 실행 상태를 제어할 수 있다.

WebAdmin 사용

다음은 WebAdmin을 사용하여 undeploy하는 과정에 대한 설명이다.

콘솔 툴 사용

Deploy된 EJB 모듈을 stop-application, start-application, redeploy-application, undeploy 명령을 통해 EJB 모듈 내의 실행 상태를 제어할 수 있다. 모든 명령어는 EJB 모듈의 ID를 파라미터로 받는다. 콘솔 툴에 대한 상세한 정보는 JEUS Reference Book”의 “4.2. jeusadmin”을 참조한다.

콘솔 툴을 사용하여 EJB 모듈을 모니터링할 수 있다. 콘솔 툴에서 application-info 명령어를 실행하면 다음과 같이 deploy되고 활성화된 EJB 모듈로부터 상태와 운영 정보를 조회할 수 있다. application-info 명령어에 대한 자세한 내용은 JEUS Reference Book”의 “4.2.7. EJB 엔진 관련 명령어”를 참고한다.

  • 모듈 정보 조회

    해당 모듈에 대한 정보를 조회한다.

    [DAS]domain1.adminServer>application-info -server server1 -id countermod -detail
    General information about the EJB module [countermod].
    ==============================================================
    +-------------+----------------------------------------------+
    | Module Name |              Unique Module Name              |
    +-------------+----------------------------------------------+
    | countermod  | countermod                                   |
    +-------------+----------------------------------------------+
    ==============================================================
    
    Beans
    ================================================================================
    
    +-----------+-------------------------+-------------------+--------------------+
    | Bean Name |           Type          | Local Export Name | Remote Export Name |
    +-----------+-------------------------+-------------------+--------------------+
    | Count     | StatelessSessionBean    |                   | Count              |
    +-----------+-------------------------+-------------------+--------------------+
    
    ================================================================================
    
  • Bean 조회

    해당 모듈("application-id")에 포함된 EJB의 목록을 조회한다.

    [DAS]domain1.adminServer>application-info -server server1 -id countermod -bean Count
    Module name : countermod
    Bean name : Count
    ================================================================================
    
    +---------------+-----------+-------------------+--------------+---------------+
    |      Name     |  (Count)  | WaterMark(High:Low| Bound(Upper:L| Time(Max:Min:T|
    |               |           |       :Cur)       |    ower)     |     otal)     |
    +---------------+-----------+-------------------+--------------+---------------+
    | create        | times(0)  |                   |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | comitted      | transactio|                   |              |               |
    |               |n(0)       |                   |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | total-remote-t|           |thread(100:100:100)|              |               |
    |hread          |           |                   |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | timed-rb      | transactio|                   |              |               |
    |               |n(0)       |                   |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | remove        | times(0)  |                   |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | active-bean   |           | bean(0:0:0)       |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | request       | request(0)|                   |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | total-bean    |           | bean(0:0:0)       |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | rolledback    | transactio|                   |              |               |
    |               |n(0)       |                   |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | active-thread |           | thread(0:0:0)     |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    | MethodReadyCou|           | bean(0:0:0)       |              |               |
    |nt             |           |                   |              |               |
    +---------------+-----------+-------------------+--------------+---------------+
    
    ================================================================================