EJB 클라이언트

본 장에서는 EJB 클라이언트 프로그램밍 예제와 InitialContext 설정 방법에 대해 설명한다.

1. 개요

EJB 클라이언트는 EJB 엔진에서 deploy된 EJB 컴포넌트의 업무 로직을 호출하는 모든 종류의 애플리케이션을 일컫는다. 그러므로 EJB 클라이언트는 서블릿, 애플릿, 다른 EJB, Standalone Java 프로그램 등이 이에 속한다.

여기서는 Standalone Java 프로그램으로 EJB 클라이언트를 작성하고 실행할 때 기본적으로 필요한 정보를 제공한다.

클라이언트 컨테이너 애플리케이션에 대해서는 JEUS Application Client 안내서를 참고한다.

2. EJB 접근을 위한 클라이언트 프로그래밍

다음은 "HelloApp"라는 export name을 갖는 EJB를 찾고 sayHello() 메소드를 호출하는 일반적인 클라이언트 애플리케이션의 구현을 보여주는 예제이다.

EJB 접근을 위한 클라이언트 프로그래밍 : <HelloClient.java>
package hello;
import java.rmi.*;
import jakarta.ejb.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;

public class HelloClient {
    private void run()
    {
        try {
            //JEUS InitialContext 얻기
             InitialContext ctx = new InitialContext();

            //EJB 얻기
            Hello hello = (Hello)ctx.lookup(“HelloApp”);
            //Business Method 호출
            String s = hello.sayHello();
        }
        catch (Exception e)
        { // Exception handling. }
   }

   public static void main(String args[])
   {
      HelloClient hclient = new HelloClient();

      hclient.run();
   }
}

위의 예에서 InitialContext를 얻는 "InitialContext ctx = new InitialContext();" 부분이 제대로 동작하기 위해서는 InitialContext의 속성을 설정해야 한다. InitialContext의 설정에 대한 내용은 InitialContext 설정을 참고한다.

3. InitialContext 설정

Initialcontext는 JNDI namespace의 모든 명명된 객체를 찾을 때 사용하는 객체로 EJB를 사용할 때마다 필요한 중요 컴포넌트이다.

EJB에서는 이 객체를 사용하여 EJB 엔진의 실제 Bean Instance의 Reference를 찾는다. JEUS의 InitialContext Instance를 가져오기 위해서는 InitialContext를 얻기 전에 5개의 Naming Context 속성 중 적어도 1개는 지정해야 클라이언트 애플리케이션이 JEUS Naming Service Server(JNSServer)와 통신할 수 있다.

JNDI InitialContext 객체가 JVM의 "-D" 속성(권장사항)이나 EJB 클라이언트 코드의 Hashtable를 통해 설정되는 것을 살펴보고 각각의 경우 EJB 클라이언트를 어떻게 호출하는지 설명한다.

다음은 JEUS에서 지원하는 InitialContext 객체를 얻기 전에 설정해야 할 5개의 Naming Context 환경 속성이다.

  • INITIAL_CONTEXT_FACTORY(required)

    Naming Context 속성은 "jeus.jndi.JNSContextFactory"의 값을 가져야 한다. 이 값은 Naming Context를 생성할 때 사용하는 factory의 클래스 이름이다.

  • URL_PKG_PREFIXES

    jeus.jndi.jns.url로 설정되어 JEUS InitialContext의 URL scheme을 이용하여 객체들을 찾는다.

  • PROVIDER_URL

    JEUS Naming server(JNS Server) IP 주소를 설정한다. (기본값: 127.0.0.1 ("localhost"))

  • SECURITY_PRINCIPAL

    JEUS Naming Service의 인증 과정 중에 사용되는 사용자 정보를 설정하기 위해 사용한다.

    실행 스레드에 사용자 정보가 등록되어 있지 않으면 기본으로 guest로 인증된다. 만약에 나중에 지정되면 JEUS Security realm에 정의된 username을 갖는 사용자 정보가 사용된다.

  • SECURITY_CREDENTIALS

    인증 과정 중에 사용될 사용자의 패스워드를 설정한다. 인증이 실패하면 그 전의 사용자 정보가 그 전처럼 유지된다. 성공하면 새로운 사용자 정보가 사용된다.

위에서 제시한 기본 속성들 외에 추가적인 특성들을 더 설정할 수 있다. 그 추가 속성들에 대한 내용은 JEUS Server 안내서의 JNDI Naming Server를 참고한다.

3.1. JVM 속성을 이용한 Naming 속성값 설정

위에서 설명한 속성들은 JVM interpreter의 "-D" 스위치를 사용하여 설정할 수 있다. 이 스위치들은 EJB 클라이언트 애플리케이션을 시작하기 위해 사용하는 Java 명령어에 추가해야 한다.

다음은 각 Naming 속성이 "-D" 스위치로 설정하는 예이다.

  • INITIAL_CONTEXT_FACTORY(required)

    -Djava.naming.factory.initial=jeus.jndi.JNSContextFactory
  • URL_PKG_PREFIXES

    -Djava.naming.factory.url.pkgs=jeus.jndi.jns.url
  • PROVIDER_URL

    -Djava.naming.provider.url=<host_address>
  • SECURITY_PRINCIPAL

    -Djava.naming.security.principal=<username>
  • SECURITY_CREDENTIALS

    -Djava.naming.security.credentials=<password>

다음의 예제는 클라이언트를 호출할 때 "-D" 옵션을 사용하여 EJB 클라이언트의 Naming Context를 설정하는 것이다. 'user1’이라는 사용자명과 'password1’이라는 패스워드가 192.168.10.10 주소로 등록된 JEUS Naming Server를 이용하여 EJB Stub을 찾는 EJB 클라이언트에 어떻게 사용되는지를 보여준다.

$ java -classpath
      ${JEUS_HOME}/lib/client/jclient.jar
      -Djava.naming.factory.initial=jeus.jndi.JNSContextFactory
      -Djava.naming.factory.url.pkgs=jeus.jndi.jns.url
      -Djava.naming.provider.url=192.168.10.10
      -Djava.naming.security.principal=user1
      -Djava.naming.security.credentials=password1
      HelloClient

JEUS에 deploy한 EJB가 2.x 스타일인 경우에는 별도로 클라이언트용 라이브러리를 가지고 있어야 한다. 이 라이브러리는 보통 appcompiler로 EJB를 컴파일할 때 생성할 수 있다.

클래스 FTP 서버를 사용한다면 클라이언트가 자동으로 필요한 클래스들을 다운받아서 사용한다. EJB 3.0 이상인 경우에는 이 사항을 고려할 필요가 없다.

3.2. Hashtable을 이용한 Naming 속성 설정

Naming Context 속성을 설정하는 다른 방법은 Hashtable를 사용하여 클라이언트 코드 내의 Naming Attribute Data를 직접 Hashtable에 넣는 것이다.

다음의 예제는 이를 어떻게 구현하는지 보여준다.

Context
      ctx = null; Hashtable ht = new Hashtable();
      ht.put(Context.INITIAL_CONTEXT_FACTORY,jeus.jndi.JNSContextFactory”);
      ht.put(Context.URL_PKG_PREFIXES, “jeus.jndi.jns.url”);
      ht.put(Context.PROVIDER_URL, “192.168.10.10”);
      ht.put(Context.SECURITY_PRINCIPAL, “user1”);
      ht.put(Context.SECURITY_CREDENTIALS, “password1”);
      try { ctx = new InitialContext(ht); . . .

위의 예에서 Hashtable이 InitialContext의 constructor 파라미터로 전달되는 것에 주목한다.

다음 예제는 클라이언트 클래스에 Naming 속성을 설정한 경우에 EJB 클라이언트를 실행하는 방법이다.

$ java -classpath
        ${JEUS_HOME}/lib/client/jclient.jar HelloClient

Hashtable을 이용한 방법은 값들을 hard-coding하기 때문에 권장하지는 않는다.