내용 목차
본 장에서는 EJB 모듈의 구조와 관리 방법에 대해서 설명한다.
EJB 모듈은 EJB 엔진에 디플로이할 수 있는 기본 단위이다. 또한 EJB 컴포넌트들을 그룹화하고 이들의 설정 정보를 Deployment Descriptors(DD)로 표현할 수 있도록 한 것이다. EJB를 디플로이할 경우에는 단 하나의 EJB 컴포넌트를 디플로이하더라도 반드시 EJB 모듈로 패키징해야 한다.
EJB 2.1 이하의 컴포넌트인 경우에는 EJB 모듈에 반드시 DD(ejb-jar.xml)가 있어야 하지만 3.0 이상의 컴포넌트부터는 Annotation을 지원하게 되면서 DD는 선택 사항으로 변경되었다.
다음은 JEUS 내부적으로 EJB 모듈을 관리하기 위한 4가지 주요 작업으로 각 작업에 대한 상세한 설명은 세부 절을 참고한다.
assembly : “3.3. EJB 모듈 조립(Assembling)”
deployment : “3.4. EJB 모듈 Deploy”
control (undeploy, redeploy, suspend, resume) : “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를 디플로이할 때 필요한 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 모듈을 조립할 때는 다음의 과정을 따른다.
EJB 클래스 컴파일
개발자가 구현한 EJB 소스 파일들을 컴파일한다.
Deployment Descriptors(DD) 작성
DD의 포맷은 EJB 표준에 따른다. 대부분 Annotation으로 가능하지만 필요한 경우 Descriptors를 사용한다.
ejb-jar.xml DD 작성
jeus-ejb-dd.xml DD
JAR 파일로 EJB 클래스와 Descriptors 패키징
다음 절부터는 “counter” 예제를 통하여 위의 과정을 살펴본다. “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 파일들을 Windows 환경에서 컴파일하는 명령 실행에 대한 예이다.
> javac –classpath c:\jeus\lib\system\javaee.jar *.java
위 명령의 실행하면 클래스 파일들이 생성된다.
EJB 모듈을 디플로이할 때 사용되는 DD는 다음과 같이 2가지로 나누어진다.
표준 EJB DD
“ejb-jar.xml”로 명명되고, EJB 모듈의 "META-INF\디렉터리"에 위치한다. 개발자가 EJB 컴포넌트를 작성할 때는 설정 정보의 일부 또는 전부를 Annotation으로 작성할 수도 있다. 만약 Annotation 정보를 무시하고 DD의 설정만을 적용하고 싶은 경우에는 ejb-jar.xml에 <metadata-complete>를 true로 설정한다.
Annotation과 DD를 혼용해서 사용한 경우는 DD가 Annotation에 우선한다.
JEUS EJB DD
“jeus-ejb-dd.xml”로 명명되고, EJB 모듈의 "META-INF\" 디렉터리에 위치한다. 이 파일의 내용에 대한 정보는 “3.3. EJB 모듈 조립(Assembling)”을 참고한다.
Descriptors의 포맷은 EJB 표준에 따른다. 대부분 Annotation으로 가능하지만 필요한 경우 Descriptors를 사용한다.
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을 표준 DD인 ejb-jar.xml로 나타내면 다음과 같다. 다음 예제는 “counter” Bean의 간단한 EJB 표준 DD를 나타낸 것이다.
[예 3.1] EJB 표준 DD : <<ejb-jar.xml>>
<?xml version="1.0"?> <ejb-jar version="3.0" 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_0.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으로 표현 가능하므로 ejb-jar.xml은 선택적으로 사용한다.
JEUS EJB DD가 필요한 이유는 EJB 엔진에 디플로이하기 위한 기본 설정 및 External Reference들을 JEUS 서비스에 매핑시키기 위해서이다. 그 외에도 인스턴스 Pooling과 Entity Bean, 데이터베이스 테이블과의 매핑 설정도 jeus-ejb-dd.xml에서 한다.
이러한 설정들은 EJB 모듈을 JEUS에 맞추어 디플로이하기 위해서 필요한 작업들이지만 일부는 Annotation으로 설정 가능하고, jeus-ejb-dd.xml이 존재하지 않아도 기본값으로 설정되기 때문에 따로 환경설정을 해야 하는 경우에만 이 작업을 수행한다.
JEUS EJB DD는 표준 EJB DD에 부가적인 설정으로 볼 수 있다. 표준 EJB DD와 마찬가지로 JEUS EJB DD도 EJB 모듈에 적용된다.
다음은 JEUS EJB DD의 전반적인 구성이다.
[예 3.2] JEUS EJB Descriptors : <<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.6. 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.6. EJB 보안 설정”을 참고한다. |
<beanlist> | 모듈에 포함되는 EJB들을 선언한다. 이 하위 태그의 이름과 내용은 Bean의 종류(SessionBean, 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)의 정보를 설정한다. |
본 절에서는 JAR 파일로 EJB 클래스와 DD 패키징에 대해 설명한다.
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 counterbeanclient.jar
이것으로 ‘countermod.jar'라는 Java EE EJB 모듈을 완성한다.
클라이언트에서 이 EJB를 사용하기 위해서는 인터페이스 파일이 필요하다. 클라이언트에서 사용하도록 배포할 counterbeanclient.jar는 다음과 같이 생성한다.
> jar cf counterbeanclient.jar ejb\basic\statefulSession\Counter.class
counterbeanclient.jar는 원격 클라이언트에서 사용하기 위한 배포용 라이브러리이다.
본 절에서는 EJB 모듈의 디플로이에 대한 전반적인 내용을 설명한다.
[그림 3.1]에서 설명했듯이 JEUS에서는 다음과 같은 방법으로 EJB 모듈을 디플로이한다.
EJB 모듈을 EJB 엔진에 디플로이할 때는 jeusadmin, WebAdmin 등의 툴을 이용한다. 일반적으로는 디플로이할 때 EJB 클래스를 컴파일하게 되지만 appcompiler를 이용해서 미리 EJB 클래스를 컴파일해서 디플로이할 때의 속도를 향상시킬 수 있다.
또한 Auto Deploy 기능을 이용해서 손쉽게 EJB 모듈을 디플로이할 수도 있다. Deploy에 관한 좀 더 자세한 내용은 "JEUS Applications & Deployment 안내서"를 참고한다.
EJB 2.x 모듈의 경우 appcompiler 툴을 사용함으로써 Stub과 skeleton 파일들을 미리 생성하여 디플로이하는 속도를 빠르게 할 수 있다. appcompiler를 사용할 경우에는 jeus-ejb-dd.xml이나 jeus-application-dd.xml의 <fast-deploy>를 true로 설정하거나 jeusadmin 툴의 deploy 명령어에서 [–f] 옵션을 사용한다. 이 옵션이 사용되지 않을 경우에는 appcompiler는 효과가 없다.
appcompiler 툴에 대한 자세한 정보는 “JEUS Reference Book”의 “4.4. appcompiler”를 참조한다.
Runtime Deploy는 실행되고 있는 EJB 엔진에 EJB 모듈을 디플로이하는 것을 의미한다. 콘솔 툴(jeusadmin)의 deploy 명령어를 이용하여 실행되고 있는 EJB 엔진에 모듈을 설치할 수 있다.
본 절에서는 “countermod” EJB 모듈의 디플로이 과정을 설명한다. 모듈을 디플로이하기 위해 다음의 사항을 가정한다.
JEUS의 노드 이름이 'johan'이고, 'johan_ejb_engine1'이 JEUS 서버에 이미 기동(Booting)되어 있다.
countermod 모듈이 JEUS_HOME\apphome 하위의 countermod.jar나 countermod 디렉터리 형태로 존재한다.
다음은 디플로이 과정에 대한 설명이다.
jeusadmin을 실행한다.
c:\> jeusadmin johan
로그인명과 패스워드를 입력한다.
Login name>johan Password> JEUS 6.0 (Fix#8) administration tool johan>
“countermod” EJB 모듈을 디플로이한다.
johan> deploy countermod
디플로이를 확인하기 위하여 다음 명령어를 실행한다.
johan> applist
'countermod' 모듈이 포함된 모든 디플로이된 애플리케이션들이 출력된다.
deploy 명령어와 –per(“permanent”) 파라미터를 사용하면 디플로이된 EJB모듈은 JEUSMain.xml의 <application> 태그로 추가된다.
jeusadmin에 대한 설명은 “JEUS Reference Book”의 “4.2.3. 공통 명령어”를 참고한다.
엔진이 기동(Booting)할 때마다 EJB 엔진에 디플로이하는 것을 Boot-time Deploy라고 한다. Boot-time Deploy를 설정하려면 JEUSMain.xml 파일 내에 <application> 태그를 이용해 EJB 애플리케이션을 추가해야 한다.
[예 3.3] Boot-time Deploy 사용 : <<JEUSMain.xml>>
<jeus-system> . . . <application> <name>countermod</name> <path>countermod.jar</path> <deployment-target> <target> <engine-container-name>johan_container1</engine-container-name> </target> </deployment-target> <deployment-type>COMPONENT</deployment-type> <ejb-component/> </application> . . . </jeus-system>
여러 개의 <application> 태그들이 하나의 JEUSMain.xml 파일에 추가될 수
있다. JEUSMain.xml 파일에 애플리케이션을 추가한 후 countermod 모듈이 디플로이되도록 EJB 엔진을
재시작한다.
애플리케이션 태그 설정에 대한 것은 “JEUS Applications & Deployment 안내서”의 “제2장 Deploy”를 참고한다.
EJB 모듈이 디플로이된 후에 클래스 파일들과 설정 파일들은 다음 그림의 구조로 JEUS 설치 디렉터리에 배포된다.
JEUS_HOME\webhome\<node name>_<container name> 디렉터리는 <containner name>에 해당하는 컨테이너에 디플로이된 애플리케이션들이 존재하는 디렉터리이다. 여기에는 디플로이된 EJB 모듈의 EJB 구현 클래스들뿐만 아니라 helper 클래스들이 위치한다.
디플로이된 파일이 위치하는 디렉터리에 따라서 다음과 같이 나누어진다.
Exploded EAR Deploy 방식과 Exploded Standalone Deploy 방식은 webhome 디렉터리로 복사되지 않고 원래의 위치를 참조하게 된다. JEUS에서는 Archive 파일이 존재하는 Standalone Deployment를 COMPONENT Type, 풀어놓은 것을 EXPLODED COMPONENT Type이라고 한다.
이후의 설명에서는 Standalone 모듈에 대해서만 설명한다. EAR Deploy 방식이나 디플로이 전반에 대한 상세한 설명은 "JEUS Applications & Deployment 안내서"의 Deploy 관련 부분을 참고한다.
디플로이된 EJB 모듈은 다음과 같은 4가지 방법으로 조작이 가능하다.
디플로이된 EJB 모듈을 suspend, resume, redeploy 명령어들을 적용하여 EJB 모듈 내의 EJB의 실행 상태를 컨트롤할 수 있다. [그림 3.1]을 참고한다.
디플로이된 EJB모듈을 컨트롤하는 방법에는 크게 2가지가 있다. 하나는 콘솔 툴(jeusadmin)을 이용하는 것이고 다른 하나는 WebAdmin을 이용하는 것이다. 여기서는 콘솔 툴을 사용하는 것만 설명한다.
콘솔 툴(jeusadmin)에는 다음과 같은 컨트롤 명령어들이 존재한다. 모든 명령어들은 EJB 모듈 이름을 파라미터로 받는다.
EJB 모듈을 다시 로딩
지정한 EJB 모듈을 다시 로딩한다. 이것은 현재 활성화되어 있는 EJB 모듈을 EJB 실행 환경에서 undeploy했다가 다시 디스크로부터 읽어 deploy하는 것을 의미한다.
redeploy <module name>
일시적으로 선택된 EJB 모듈을 중지
stop <module name>
stop되었던 EJB 모듈을 다시 활성화
start <module name>
선택된 모듈을 Undeploy
EJB 엔진의 실행 메모리에서 제거한다.
undeploy <module name>
다음은 다음은 콘솔 툴(jeusadmin)을 사용하여 EJB 모듈을 undeploy하는 방법을 설명하는 예이다.
jeusadmin을 실행한다.
c:\> jeusadmin johan
사용자 이름과 패스워드를 입력한다.
Login name>johan Password> JEUS 6.0 (Fix#8) administration tool johan>
다음과 같이 실행하고 명령어가 실행에 성공하면 'countermod' 모듈이 undeploy된다.
johan> undeploy countermod
Undeploy된 것을 확인하기 위하여 다음과 같은 명령을 실행한다.
johan> applist
명령어를 실행하면 'countermod' 모듈을 제외한 모든 디플로이된 모듈들이 나열된다.
jeusadmin에 대한 상세한 정보는 “JEUS Reference Book”의 “4.2. jeusadmin”을 참조한다.
콘솔 툴(jeusadmin)을 이용해서 EJB 모듈을 모니터링할 때 다음의 2가지의 명령어를 이용한다.
EJB의 목록 조회
<module name>에 포함된 EJB의 목록을 조회한다.
beanlist <module name>
모듈 정보 조회
모듈에 대한 정보를 조회한다.
moduleinfo <module name>
해당 명령어에 대한 자세한 사항은 “JEUS Reference Book”의 “4.2.4. EJB 엔진 관련 명령어”를 참고한다.