HelloSLSB EJB에 접근하는 Java Application Client의 예
다음에 소개되는 Java Application Client프로그램은 앞에서 작성한 Stateless Session Bean에 접근하는 내용이므로 서버측 내용을 확인하려면 여기를 참조하세요.
아래의 코드를 컴파일하려면 weblogic.jar 라이브러리가 필요하므로 Eclipse의 Build Path에 weblogic.jar를 등록한 후에 이 코드를 컴파일해야 한다. 그리고 서버측의 EJB객체에 접근해야 하므로 EJB 프로젝트 도중에 자동으로 Eclipse 가 생성해주는 xxxxxClient 프로젝트를 jar포맷으로 export하여 weblogic.jar파일과 함께 사용가능한 경로에 두고 프로젝트(Build Path)에서 참조해야 아래의 코드를 컴파일할 수가 있다.
이 프로그램은 Java EE 서버에서 실행되는 것이 아니고 EJB 프로세스와 다른 프로세스로 실행되므로 Business Interface에는 @Remote를 설정해야만 서버에 접근이 가능하다.
package com.itbank.ejb.test;
import javax.ejb.Local;
import javax.ejb.Remote;
@Local
@Remote
public interface HelloSLSBLocal {
String sayHello();
}
서로다른 JVM에서 EJB와 클라이언트 모듈(Web, Application)이 실행되는 상황에서는 Local접근이 아니라 Remote접근에 해당하므로 빈 클래스에서도 외부접근이 가능하도록 다음과 같이 mappedName을 지정해 주어야 한다. mappedName이 지정되면 관리서버는 그 이름으로 빈객체의 JNDI이름을 지정하여 외부접근시 참조하도록 한다.
package com.itbank.ejb.test;
import javax.ejb.Stateless;
@Stateless(mappedName="HelloSLSB")
public class HelloSLSB implements HelloSLSBLocal {
@Override
public String hello() {
return "Hello Stateless Session Bean";
}
}
EJB에 접근하는 Java Application Client
import java.util.*;
import javax.naming.*;
import com.itbank.ejb.test.*;
public class EJBAppClient {
public static void main(String[] args) throws Exception {
Context ctx = getInitialContext01();
//Context ctx = getInitialContext02();
HelloSLSBLocal helloBean = (HelloSLSBLocal)ctx.lookup("HelloSLSB#com/itbank/ejb/test/HelloSLSBLocal");
String message = helloBean.sayHello();
System.out.println(message);
}
private static Context getInitialContext01() {
String url = "t3://IP Address:7001";
String user = null;
String password = null;
Properties properties = null;
try {
properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, url);
if (user != null) {
properties.put(Context.SECURITY_PRINCIPAL, user);
properties.put(Context.SECURITY_CREDENTIALS, password == null ? "" : password);
}
return new InitialContext(properties);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
private static Context getInitialContext02(){
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL, "t3://IP Address:7001/");
Context ctx = null;
try{
return new InitialContext(env);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}
위에서 빈 객체을 찾을 때 HelloSLSB#com/itbank/ejb/test/HelloSLSBLocal 를 사용하였는데,
관리서버에 접속하여 다음과 같이 배포된 빈의 JNDI 이름을 찾을 수가 있다. 빈 클래스에서 mappedName에 지정한 이름이 JNDI이름의 가장 처음에 오는 것을 확인할 수 있다. #다음에 이어지는 문자열은 빈클래스의 패키지경로에 해당한다.
참고로 Local상태로 빈 클래스를 작성하면 위와 같은 JNDI이름이 설정되지 않는다.