내용 목차
본 장에서는 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가지 주요 작업으로 각 작업에 대한 상세한 설명은 세부 절을 참고한다.
assembly : “3.3. EJB 모듈 조립”
deployment : “3.4. EJB 모듈 Deploy”
control(undeploy, redeploy, stop-application, start-application) : “3.5.1. EJB 모듈 제어”
monitoring : “3.5.2. EJB 모듈 모니터링”
EJB 모듈의 관리 순서는 다음과 같다.
다음은 표준 EJB 모듈 JAR 파일의 구조에 대한 설명이다.
구분 | 설명 |
---|---|
ejb-jar.xml | 실제적인 표준 EJB DD 파일이다. Annotation으로 설정 정보를 표현한 경우에는 존재하지 않을 수 있다. 단, EJB 2.x 스타일의 경우에는 반드시 필요하다. |
jeus-ejb-dd.xml | JEUS에서 EJB를 deploy할 때 필요한 DD 파일이다. (선택 사항) |
EJB 클래스들을 포함하고 있다. EJB 소스 코드에 정의되어 있는 것과 같이 Java 패키지 구조를 반영하는 구조로 되어 있어야 한다. 예를 들어 하나의 EJB가 "mypackage"라는 패키지에 속해 있다고 선언되어 있으면 EJB의 클래스는 반드시 EJB JAR의 "mypackage"라는 디렉터리 아래에 위치해야 한다.
다음과 같은 EJB 컴포넌트를 포함한다.
구분 | 설명 |
---|---|
인터페이스 | 클라이언트가 접근하기 위한 EJB 2.x 스타일의 인터페이스, 3.0 이상의 인터페이스들이다. |
엔터프라이즈 Bean 클래스 | 인터페이스에 맞춰서 실제 업무 로직을 구현한 Bean 클래스들을 의미한다. |
MANIFEST.MF Class-Path Entry에 명시한 라이브러리에 해당한다.
[그림 3.1]과 같이 EJB 모듈을 조립(Assembling)할 때는 다음의 과정을 수행한다.
EJB 클래스 컴파일
개발자가 구현한 EJB 소스 파일들을 컴파일한다.
DD 작성
ejb-jar.xml DD 작성
jeus-ejb-dd.xml DD 작성
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 소스 파일들로부터 EJB 모듈을 조립하는 첫 번째 과정은 개발자가 구현한 EJB 소스 파일들을 컴파일하는 것이다. 이는 JDK의 javac 컴파일러를 이용한다. 클래스 패스는 기본적으로 JEUS_HOME/lib/system/javaee.jar를 사용하며, jeus-ejb-dd.xml에 대응되는 Annotation을 사용했다면 JEUS_HOME/lib/system/jeusapi.jar를 추가하고, 또 다른 helper 클래스가 있다면 모두 추가한다.
다음은 "counter" Bean에서 사용될 EJB Java 파일들을 UNIX 환경에서 컴파일하는 명령 실행 예이다.
$ javac –classpath JEUS_HOME/lib/system/javaee.jar *.java
위 명령을 실행하면 클래스 파일들이 생성된다.
EJB 모듈을 deploy할 때 표준 EJB DD와 JEUS EJB DD로 나누어진다. 각 DD의 사용법은 해당 절의 설명을 참고한다.
ejb-jar.xml로 명명되고, EJB 모듈의 "META-INF/" 디렉터리에 위치한다. 개발자가 EJB 컴포넌트를 작성할 때는 설정 정보의 일부 또는 전부를 Annotation으로 작성할 수도 있다. 만약 Annotation 정보를 무시하고 DD의 설정만을 적용하고 싶은 경우에는 ejb-jar.xml에 <metadata-complete>를 true로 설정한다. Annotation과 DD를 혼용해서 사용한 경우는 DD가 Annotation에 우선한다.
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)를 나타낸 것이다.
[예 3.1] EJB 표준 DD : <<ejb-jar.xml>>
<?xml version="1.0"?> <ejb-jar version="3.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"> <enterprise-beans> <session> <ejb-name>counter</ejb-name> <business-remote>ejb.basic.statefulSession.Counter</business-remote> <ejb-class>ejb.basic.statefulSession.CounterEJB</ejb-class> <session-type>Stateful</session-type> <transaction-type>Bean</transaction-type> </session> </enterprise-beans> <assembly-descriptor/> </ejb-jar>
EJB 3.0 이상부터는 ejb-jar.xml의 모든 내용은 Annotation으로 표현 가능하므로 선택적으로 사용한다.
jeus-ejb-dd.xml로 명명되고, EJB 모듈의 "META-INF/" 디렉터리에 위치한다.
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>1.2</specification-version> <implementation-version>1.2</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 JAR 파일을 패키징할 때에는 jar 유틸리티를 사용하고, 다음의 사항을 가정한다.
ejb/basic/statefulSession 디렉터리에 "counter" EJB 클래스 파일들이 존재한다.
클래스에 Annotation으로 설정하여 ejb-jar.xml과 jeus-ejb-dd.xml은 존재하지 않는다.
EJB JAR 파일의 패키징 과정은 다음과 같다.
다음과 같이 EJB 클래스들을 하나의 JAR 파일로 묶는다.
$ jar cf countermod.jar ejb/basic/statefulSession
이것으로 countermod.jar라는 Java EE EJB 모듈을 완성한다.
클라이언트에서 이 EJB를 사용하기 위해서는 인터페이스 파일이 필요하다. 클라이언트에서 사용하기 위해 배포할 counterbeanclient.jar는 다음과 같이 생성한다.
$ jar cf counterbeanclient.jar ejb/basic/statefulSession/Counter.class
counterbeanclient.jar는 원격 클라이언트에서 사용하기 위한 배포용 라이브러리이다.
본 절에서는 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한다.
EJB 2.x 모듈의 경우 appcompiler 툴을 사용함으로써 Stub과 Skeleton 파일들을 미리 생성하여 Deploy 속도를 빠르게 할 수 있다. appcompiler를 사용할 경우에는 콘솔 툴의 deploy 명령을 할 때 –fast 옵션을 사용한다. 이 옵션이 사용되지 않을 경우에는 appcompiler는 효과가 없다. appcompiler 툴에 대한 자세한 정보는 “JEUS Reference Book”의 “4.3. appcompiler”를 참조한다.
MS가 기동(Booting)될 때 deploy되는 것을 Boot-time Deploy라고 하는데, DAS를 통해 한 번 deploy된 애플리케이션은 MS를 기동할 때마다 Boot-time Deploy가된다. 애플리케이션의 Deploy 설정에 대한 자세한 내용은 “JEUS Applications & Deployment 안내서”의 “제4장 애플리케이션 작성 및 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을 사용할 수 있다.
WebAdmin 사용
WebAdmin을 사용하여 deploy하는 과정은 다음과 같다.
WebAdmin의 [Applications] 메뉴를 선택하면 애플리케이션 목록 조회화면으로 이동한다. 애플리케이션 목록 조회화면에서 deploy하려는 애플리케이션의 [deploy] 버튼을 클릭한다.
[LOCK & EDIT] 버튼을 클릭해서 설정변경 모드로 전환한다.
Deploy 화면에서 애플리케이션의 deploy 속성을 설정하고 [확인] 버튼을 클릭한다. WebAdmin에서의 애플리케이션 Deploy 설정에 대한 자세한 내용은 “JEUS Applications & Deployment 안내서”의 “제4장 애플리케이션 작성 및 Deploy”의 deploy 항목을 참고한다.
deploy된 애플리케이션은 'Command' 컬럼에 다음과 같이 [stop], [undeploy], [redeploy], [add-target], [remove-target]의 버튼이 생기면서 제어가 가능해진다. 각 버튼의 기능과 제어에 대한 자세한 내용은 “3.5.1. EJB 모듈 제어”를 참고한다.
콘솔 툴 사용
콘솔 툴을 사용하여 deploy하는 과정은 다음과 같다.
콘솔 툴을 실행한다. 콘솔 툴에 대한 자세한 설명은 “JEUS Reference Book”의 “4.2.2. Local 명령어”를 참고한다.
$ jeusadmin -host localhost:9736
사용자 이름과 패스워드를 입력한다.
User name: administrator Password: Attempting to connect to localhost:9736. The connection has been established to Domain Administration Server adminServer in the domain domain1. JEUS7 Administration Tool To view help, use the 'help' command. [DAS]domain1.adminServer>
deploy 명령어를 실행해서 "countermod" EJB 모듈을 deploy한다.
[DAS]domain1.adminServer> deploy countermod -servers server1
deploy를 확인하기 위해 다음과 같이 application-info 명령을 실행하면 "countermod" 모듈이 포함된 모든 deploy된 애플리케이션들이 출력된다.
[DAS]domain1.adminServer> application-info
EJB 모듈이 deploy된 후에 클래스 파일들과 설정 파일들은 다음과 같은 구조로 JEUS 설치 디렉터리에 배포된다.
JEUS_HOME/domains/<domain name>/servers/<server name>/.workspace/deployed/ 디렉터리는 <server name>에 해당하는 MS에 deploy된 애플리케이션들이 존재하는 디렉터리이다. 여기에는 deploy된 EJB 모듈의 EJB 구현 클래스들뿐만 아니라 helper 클래스들이 위치한다.
Deploy 방식은 다음과 같이 나누어지며, 방식에 따라 deploy되는 파일이 위치하는 디렉터리가 달라진다.
Exploded EAR Deploy 방식과 Exploded Standalone Deploy 방식은 webhome 디렉터리로 복사되지 않고 원래의 위치를 참조한다. JEUS에서는 Archive 파일이 존재하는 standalone Deployment를 COMPONENT Type, 풀어놓은 것을 EXPLODED COMPONENT Type이라고 부른다.
이후의 설명에서는 Standalone 모듈에 대해서만 설명한다. EAR Deploy 방식이나 Deploy 전반에 대한 상세한 설명은 "JEUS Applications & Deployment 안내서"의 Deploy 관련 부분을 참고한다.
Deploy된 EJB 모듈에 대해 WebAdmin과 콘솔 툴을 사용해서 실행 상태를 제어하거나 모니터링할 수 있다. ([그림 3.1] 참고)
본 절에서는 사용 예제를 통해 EJB 모듈을 제어하는 방법에 대해 설명한다.
다음은 WebAdmin을 사용하여 undeploy하는 과정에 대한 설명이다.
WebAdmin의 [Applications] 메뉴를 클릭하면 다음과 같이 Deployed Application 화면에 애플리케이션 목록이 조회된다. 목록에서 deploy된 애플리케이션의 'Command' 컬럼에는 다음과 같은 컨트롤 버튼이 존재한다. 각 버튼은 콘솔 툴의 옵션과 각각 대응된다.
애플리케이션을 undeploy하려면 조회된 애플리케이션 목록에서 원하는 애플리케이션의 'Command' 컬럼에 위치한 [undeploy] 버튼을 클릭한다. Undeploy 화면에서 각 항목을 설정하고 [확인] 버튼을 클릭하면 undeploy가 수행된다.
다음은 주요 항목에 대한 설명이다.
항목 | 설명 |
---|---|
Timeout | 요청 중인 서비스가 완료될 때까지 기다리는 시간을 설정한다. |
Graceful | Graceful Redeploy가 진행된 경우 old 애플리케이션과 new 애플리케이션 중 어느 것을 undeploy할지 결정한다. |
정상적으로 undeploy가 되면 다음과 같이 결과 메시지가 나타나고 해당 애플리케이션의 'State'와 'Command' 컬럼이 변경된 것을 확인할 수 있다.
Deploy된 EJB 모듈을 stop-application, start-application, redeploy-application, undeploy 명령을 통해 EJB 모듈 내의 실행 상태를 제어할 수 있다. 모든 명령어는 EJB 모듈의 ID를 파라미터로 받는다. 콘솔 툴에 대한 상세한 정보는 “JEUS Reference Book”의 “4.2. jeusadmin”을 참조한다.
redeploy-application은 지정한 EJB 모듈을 다시 로딩하는 명령어로 현재 활성화되어 있는 EJB 모듈을 EJB 실행 환경에서 undeploy했다가 다시 디스크로부터 읽어 deploy하는 것을 의미한다.
undeploy가 실행되고 다시 로딩이 수행될 때 undeploy된 EJB 모듈의 모든 트랜잭션 상태는 잃어버린다. 이는 undeploy되거나 redeploy되는 모듈과 연관있는 모든 EJB 트랜잭션이 rollback된다는 것을 의미한다.
redeploy-application <application-id>
stop-application 명령어는 선택된 EJB 모듈을 일시적으로 중지시켜 클라이언트의 요청으로부터 한시적으로 EJB 모듈이 접근이 불가능한 상태가 된다. start-application 명령어로 다시 EJB 모듈을 접근 가능한 상태로 되돌린다.
stop-application <application-id>
stop-application 명령어로 중지되었던 EJB 모듈을 다시 활성화한다.
start-application <application-id>
undeploy 명령어는 선택된 모듈을 EJB 엔진의 실행 메모리에서 제거해서 EJB 엔진의 운영 메모리에서 EJB 모듈을 내려 EJB 클라이언트가 EJB에 접근 불가능한 상태가 된다. 그러나 파일을 물리적으로 삭제하지는 않는다.
undeploy <application-id>
다음은 콘솔 툴을 사용하여 EJB 모듈을 undeploy하는 과정에 대한 예이다.
콘솔 툴을 실행한다.
$ jeusadmin -host localhost:9736
사용자 이름과 패스워드를 입력한다.
User name: administrator Password: Attempting to connect to localhost:9736. The connection has been established to Domain Administration Server adminServer in the domain domain1. JEUS7 Administration Tool To view help, use the 'help' command. [DAS]domain1.adminServer>
다음과 같이 undeploy 명령을 실행하고 성공하면 "countermod" EJB 모듈이 undeploy된다.
[DAS]domain1.adminServer> undeploy countermod
undeploy된 것을 확인하기 위해 다음과 같이 application-info 명령을 실행한다. "countermod" 모듈을 제외한 deploy된 모든 모듈들이 조회된다.
[DAS]domain1.adminServer> application-info
콘솔 툴을 사용하여 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 | | | | |
+---------------+-----------+-------------------+--------------+---------------+
================================================================================
EJB 모듈의 모니터링은 WebAdmin을 사용할 수도 있지만 콘솔 툴을 사용할 경우에 더 자세한 정보를 조회할 수 있다. WebAdmin을 사용할 경우 [Monitoring] 메뉴의 [JNDI] 또는 [EJBTimer] 메뉴를 통해 EJB 모듈의 일부 정보를 모니터링할 수 있다. 모니터링하는 자세한 방법은 각각 “JEUS Server 안내서”의 “4.2.2. 바인딩된 객체 확인”과 “10.2. Timer 모니터링”을 참고한다.