제4장 EJB의 공통 특성

내용 목차

4.1. 개요
4.2. EJB 설정
4.2.1. 기본 환경설정
4.2.2. Thread Ticket 설정
4.2.3. External Reference 설정과 매핑
4.2.4. HTTP Invoke 환경설정
4.2.5. EJB 보안 설정
4.3. EJB 모니터링
4.4. EJB 튜닝
4.4.1. Thread Ticket Pool 설정 튜닝

본 장에서는 JEUS에서의 EJB 공통 특성에 대해 설명한다.

EJB 표준에 언급된 내용은 설명하지 않고, JEUS에서 EJB를 사용하기 위해 필요한 추가적인 정보들만 제공한다. 또한 EJB deploy에 대해 언급하지 않으므로 “제3장 EJB 모듈”의 내용을 먼저 참고한다.

본 절에서는 EJB의 종류와 각 종류별 DD 설정에 대해서 설명한다.

EJB 종류

JEUS는 EJB 스펙에 따라 다음의 EJB들을 지원한다.

본 장에서는 모든 Bean들에 적용되는 공통적인 특징과 설정에 대해서 설명한다. 각 EJB에 대한 추가적인 상세 정보는 위에 나열된 해당 장을 참고한다.

참고

Entity Bean은 EJB 3.0부터는 JPA로 대체되었으므로 이에 대해서는 "JEUS JPA 안내서"를 참고한다. 따라서 Entity Bean의 사용을 권장하지 않지만 하위 호환성을 위해 계속 지원하고 있다.

EJB 종류별 DD 설정

JEUS EJB DD(Deployment Descriptors)는 jeus-ejb-dd.xml로 명명된 XML 파일이며, EJB JAR 파일의 META-INF 하위에 존재한다. JEUS EJB DD에 대한 간단한 내용은 “제3장 EJB 모듈”을 참고한다.

다음은 JEUS EJB DD로 설정 가능한 기능들과 컴포넌트들의 간략한 정보를 나타낸다("@" 표시는 Annotation으로도 설정 가능한 개체이다). 표의 왼쪽에 나열된 항목들은 실제 설정 가능한 JEUS EJB DD의 XML 태그들이다. 표의 나머지 6개 열은 EJB 종류에 따른 설정 사항들을 나타낸다.

위의 표는 다음과 같이 나누어 진다.

모든 EJB 설정들은 JEUS EJB DD 파일인 jeus-ejb-dd.xml 파일 내에 설정된다. 상위 XML 태그는 Bean의 종류에 관계없이 <jeus-bean>을 사용한다.

다음 절에서는 위의 5종류의 EJB XML 부모 태그들에 적용될 수 있는 설정들을 설명한다. <beanlist> 밖에 있는 다른 태그들은 “제3장 EJB 모듈”에서 이미 설명하였다. 특정 XML 부모 태그(Bean 종류)에 대한 설명은 이 문서의 후반부에 나오는 해당 장들을 참고한다.

참고

클러스터링 환경설정은 “제6장 EJB 클러스터링”을 참고한다.

다음은 주로 사용되는 JEUS 전용 설정들이며 jeus-ejb-dd.xml에 선언되어 있다. 이 파일에 대해서는 “제3장 EJB 모듈”을 참고한다.

다음은 위의 설정들이 Stateful Session Bean class와 DD에 적용된 예로 대응되는 Annotation과 DD의 element는 굵게 표시했다.



다음은 EJB Thread Ticket Pool(이하 TTP)의 개념을 나타낸 그림이다.

기본적인 동작은 클라이언트로부터 요청을 받으면 새로운 RMI 스레드를 클라이언트 요청에 부여하는 것이다. 이때 부여된 RMI 스레드의 수가 설정된 최댓값보다 많은 경우에는 해당 요청에 스레드를 부여하지 않고 대기한다.


위 그림에서 볼 수 있듯이 TTP는 Thread Ticket(이하 TT)을 가지고 있다. 한 개의 TT는 하나의 클라이언트 스레드가 EJB 엔진에 접근할 수 있도록 허가한다. 클라이언트의 요청이 도착하면, 하나의 TT가 TTP에서 얻어지고 클라이언트에게 부여된다. 이는 각 클라이언트 스레드는 실제 EJB Instance에게 요청을 전달할 한 개의 EJB Object에게 할당된다는 것을 의미한다. 그러므로 EJB Object는 EJB 엔진 내에 존재하는 하나의 Object라고 볼 수 있고 EJB 클라이언트와 실제 EJB Instance와의 연결을 관리한다.

TTP에 있는 TT의 숫자보다 많은 클라이언트의 요청이 오는 경우 새로운 요청은 TT가 Free되어 Pool로 반환될 때까지 기다려야 한다. 클라이언트의 요청이 TT를 기다린지 10분이 초과할 경우 시간 초과로 RemoteException을 던진다.

EJB 처리가 끝나거나(Stateless Session Bean) Connection 타임아웃이 발생하여 클라이언트가 연결을 잃을 경우에 TTP로 TT가 반환된다. 그리고 TTP는 원격 호출이 가능한 EJB 컴포넌트마다 하나씩 가지고 있다. 이 외에도 Connection Pool과 Bean Pool이 있다. MDB에서는 TTP가 아닌 Bean Pool을 설정한다.

EJB의 TT은 Bean의 최상위 XML 태그의 <thread-max>에서 설정한다. 이 값은 각 EJB를 수행하는 스레드의 최대 허용 개수, 즉 최대 TT의 수를 의미한다. 기본은 100이다. 대기하고 있는 클라이언트의 요청 수가 이 값보다 클 경우에는 새로운 요청들은 먼저 진행 중인 작업이 끝나고, Pool로 TT가 반환될 때까지 대기한다. 대기한지 10분이 지날 경우 시간 초과로 RemoteException을 던진다.

다음은 BMP Bean에 위의 설정을 적용한 예이다.


Bean이 사용하는 External Reference는 Annotation을 통해 설정하거나 또는 ejb-jar.xml에서 사용한 reference 이름과 매핑된 jeus-ejb-dd.xml의 JNDI export name을 사용하여 설정할 수 있다. 선언된 모든 External Reference들은 JNDI export name과 매핑되어야 한다.

Annotation이나 ejb-jar.xml에 선언된 External Reference는 각 Reference에 해당하는 jeus-ejb-dd.xml의 태그에 실제 시스템 JNDI export name으로 매핑되어야 한다.

다음은 ejb-jar.xml과 JEUS EJB DD 파일의 참조 태그에 대한 설명이다.

모든 <env> 태그는 다음의 하위 태그를 설정해야 한다.

태그설명
<name>env의 이름으로 ejb-jar.xml에 정의된 <env-entry-name> 태그의 값과 같은 값을 사용한다.
<type>값의 자료형에 해당하는 완전한 Java 클래스 이름으로 기본 자료형은 wrapper 클래스를 사용한다.
<value>env의 실제 값을 선언한다.

다른 태그들(<ejb-ref>, <res-ref>, <res-env-ref>)은 여러 개의 <jndi-info> 태그를 가진다. 이 태그들은 또 JNDI export name에 reference를 매핑하기 위해서 다음과 같은 하위 태그를 설정해야 한다.

태그설명
<ref-name>EJB 소스 코드와 ejb-jar.xml에서 정의된 참조 이름으로 ejb-jar.xml에서 <ejb-ref>와 동격의 태그는 <ejb-ref>이다. <resource-ref>와 동격은 <res-ref>이고, <resource-env-ref>와 동격은 <res-env-ref>이다.
<export-name>JNDI에 export될 때 사용되는 이름이다.

참고

<ref-name>과 <export-name> 태그는 반드시 ejb-jar.xml에 설정된 이름과 같은 값이어야 한다.

다음은 External Reference를 JNDI로 매핑하는 방법으로, Annotation과 XML의 예이다.




EJB 모듈 중 특정 EJB에 HTTP invocation을 설정하고 사용하기 위해서는 jeus-ejb-dd.xml의 <jeus-bean> 하위에 <invoke-http>를 설정해야 한다. EJB 엔진에서 HTTP invocation이 필요하면 domain.xml의 ejb-engine에 <invoke-http>를 추가한다(“제2장 EJB 엔진”에서 언급). 이 설정은 모든 모듈에 적용되는데, 각 모듈의 DD 파일에 <invoke-http>가 있다면 파일의 설정을 사용한다.

다음은 jeus-ejb-dd.xml의 HTTP invoke 환경설정 예제이다.


<invoke-http> 설정에는 2개의 하위 태그가 존재한다.

태그설명
<url>

반드시 HTTP-RMI Stub으로부터 호출되는 RMI 핸들러 서블릿(jeus.rmi.http.ServletHandler)의 URI를 입력한다. 이 URI에서는 프로토콜, IP, 포트를 제외한 서블릿 요청 경로만을 입력한다.

프로토콜은 "HTTP"로 IP는 RMI 런타임과 동일한 주소로 간주된다. 즉, HTTP-RMI 요청을 받은 웹 서버와 웹 엔진이 RMI 런타임과 같은 머신에 있어야 된다. 그러면 RMI 런타임의 주소는 RMI Stub에게 알려지게 된다. 웹 서버의 포트는 반드시 다음 <http-port>에 설정해야 한다.

<http-port>HTTP-RMI 요청을 받을 포트 번호를 설정한다. 웹 서버 및 웹 엔진에는 반드시 RMI 핸들러 서블릿이 deploy되어 실행되고 있어야 한다.

본 절에서는 JEUS에서 EJB를 위한 보안 설정 방법에 대해 설명한다. 여기에서 사용된 보안은 인증과 권한 부여를 의미한다.

JEUS EJB의 보안 설정을 위해 다음의 항목을 설정한다.

  • EJB 모듈의 역할 할당(Role Assignment)

  • EJB Run-as Identify 설정

다음은 상황별 보안 설정하는 방법에 대한 설명이다.

역할 할당(Role Assignment) 설정

EJB 모듈의 역할 할당 설정(Role Assignment)은 표준 ejb-jar.xml 파일에 개발자가 정의한 역할과 실제 JEUS 보안 도메인의 principal와 group name을 매핑하는 것이다. 이는 jeus-ejb-dd.xml 파일의 <module-info><role-permission> 태그에서 설정한다.

다음은 역할 할당을 설정한 XML의 예이다.


다음은 설정 하위 필수 태그에 대한 설명이다.

태그설명
<role>EJB에 설정된(Annotation이나 ejb-jar.xml을 통해) 논리적인 role name을 지정한다.
<principal>

accounts.xml에서 정의된 실제 user name을 지정한다.

role name-user name 쌍이 개발자가 정의한 role과 JEUS principal 간의 매핑을 정의한다. 하나의 역할 이름에 여러 개의 사용자 이름을 설정할 수 있다.

Run-as Identify 설정

Run-as Identify 설정은 ejb-jar.xml의 <run-as>에서 개발자가 정의한 역할 이름과 JEUS 보안 도메인 설정에서 지정한 실제 principal의 매핑을 제공한다(예: accounts.xml 파일에서).

이 principal은 일반적으로 간단한 사용자 이름을 사용한다. 이는 jeus-ejb-dd.xml에서 Bean 설정 수준과 같은 <run-as-identity> 태그에서 설정한다.

다음은 Run-as Identify를 설정한 XML 예이다.


태그설명
<principal-name>ejb-jar.xml 파일의 <run-as> 태그에서 주어진 role에 매핑할 user name으로 accounts.xml에 설정되어 있어야 한다.

다음은 role-permisstion의 role과 run-as의 role이 실제 JEUS 사용자에서 매핑되는 예이다.

Java 클래스와 XML 내용의 일부분들은 3개의 설정 파일들(ejb-jar.xml, jeus-ejb-dd.xml, accounts.xml)에서 가져온 것이다. 이 파일들에서 서로 동일해야 하는 부분들은 굵은 글자로 강조하였다.




위의 예에서는 2개의 Session Bean을 선언하였다.

  • 첫 번째 Session Bean("CustomerEJB")은 "CUSTOMER" 역할에 연결되는 보안 역할을 가지고 있다.

  • 두 번째 Session Bean("EmployeeService")은 "ADMIN"이라는 <run-as> 역할을 선언하고 있다. "CUSTOMER"와 "ADMIN" 역할은 EJB deploy할 때 실제 시스템 principal들과 매핑되어야 한다.

다음의 XML DD 파일은 "CUSTOMER"와 "ADMIN" 역할이 실제 시스템 principal 이름들(각각 "customer"와 "peter")에 어떻게 매핑되는지 보여주는 예이다.


다음은 이 사용자들이 accounts.xml에 어떻게 설정되는지를 확인할 수 있는 예이다.


위의 예에서 "customer"와 "peter"라는 사용자들의 정의를 확인할 수 있다. 이 사용자들은 jeus-ejb-dd.xml 파일을 통하여 ejb-jar.xml 파일의 "CUSTOMER"와 "ADMIN" 역할과 연관되어 있다.

JEUS에서는 EJB 모듈에 포함된 개별 EJB를 제어하는 방법은 제공하지 않는다. 그러나 콘솔 툴을 사용한 Bean별 모니터링은 가능하다.

콘솔 툴에서는 application-info 명령어를 사용하여 Bean Name, Export Name 및 상태 등 개별 EJB의 정보를 조회할 수 있다. 다음의 예제에서는 countermod라는 EJB가 deploy되어 있다고 가정한다. application-info 명령어에 대한 자세한 내용은 JEUS Reference Book”의 “4.2.6.3. application-info”를 참고한다.

다음과 같이 명령어를 실행하면 EJB 모듈 내의 각 Bean Name과 Export Name을 확인할 수 있다.

[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              |
+-----------+-------------------------+-------------------+--------------------+
================================================================================

다음과 같이 명령어를 실행하면 지정한 EJB 모듈에 등록되어 있는 개별 Bean의 상태를 확인할 수 있다.

[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 종류에 공통으로 EJB 운영 성능을 향상(또는 시스템 리소스의 낭비를 방지하기 위해)하기 위해 적용할 수 있는 몇 가지 설정은 다음과 같다.

위의 기본적인 최적화 옵션뿐만 아니라 Bean의 종류에 따라 수십 개의 튜닝 팁이 존재한다. 그러므로, 각 EJB 종류에 따른 튜닝과 최적화하는 방법은 해당하는 각 장을 참고한다.