EJB 3.0의 호환성 및 마이그레이션

Java EE 2007/04/10 11:21 Posted by Sun

글쓴이 :  Ken Saks
Ken Saks는 Java EE 5 SDK의 EJB 3.0 컨테이너에 대한 설계 팀장입니다. 그는 1999년 이후 Sun Microsystems의 Enterprise Java 그룹의 멤버로 활동했습니다.


EJB(Enterprise JavaBeans) 3.0 사양
에서는 세션 빈의 구현 및 액세스를 위해 새롭고 매우 간단한 API가 소개되었다. 많은 개발자들은 이 새로운 API에 작성된 애플리케이션이 레거시 EJB 애플리케이션과 어떻게 상호 작용하며 반대로 레거시 애플리케이션이 이 새로운 API와 어떻게 상호작용하는지에 대해 의문을 가지고 있다.

개발자들이 이 새로운 기능을 이용하기 위해 기존의 모든 EJB 애플리케이션을 전체적으로 다시 작성해야 한다면 매우 비실용적일 것이다. 개발자들이 애플리케이션 업그레이드 계획을 가지고 있는 경우라도 단계적인 접근을 통해 업그레이드하기를 선호할 것이다. 새로운 EJB 3.0 애플리케이션 작성을 선호하는 경우에도 기존의 애플리케이션 서비스를 이용한다면 좋을 것이다. EJB 3.0 사양은 이러한 두 전략을 모두 가능하게 한다. 이 팁에서는 그 방법을 설명한다.

샘플 애플리케이션 패키지가 이 팁에 제공된다. 이 팁의 코드 예제는 해당 패키지에 포함된 샘플의 소스 코드에서 따온 것이다. 샘플은 Java EE 5 SDK를 사용한다. Java EE 5 SDK는 Java EE Downloads 페이지에서 다운로드할 수 있다.

EJB 3.0에서 EJB 2.x로의 호환성

간단한 EJB 3.0 API에 작성된 애플리케이션이 레거시 EJB 애플리케이션을 호출하는 예제를 먼저 살펴보자. 이 팁에 제공된 샘플의 소스 코드에서 MigrationBean이라는 EJB 3.0 무상태(stateless) 세션 빈을 찾을 수 있다. 이 Bean은 EJB2xBean이라는 원격 EJB 2.x 무상태 세션 빈을 호출한다. MigrationBean은 완전히 새로운 Bean일 수도 있고 EJB 3.0 API를 사용하기 위해 다시 코딩된 기존 Bean일 수도 있다. 단순성을 위해 이 예제의 두 Bean은 동일한 아카이브에 패키징되었지만 꼭 그래야 하는 것은 아니다. 다음은 EJB2xBean에 대한 EJB 2.x 홈 및 원격 인터페이스이다.


   public interface EJB2xHome extends EJBHome {

       public EJB2xRemote create()
           throws CreateException, RemoteException;
   }

   public interface EJB2xRemote extends EJBObject {

       public void foo() throws RemoteException;

   }
   
다음은 MigrationBean 클래스의 첫 번째 부분이다.

   @Stateless
   public class MigrationBean implements MigrationRemote {

       // Inject a reference to the Home interface
       // of the EJB 2.x bean.
       @EJB private EJB2xHome ejb2xHome;

       private EJB2xRemote ejb2x;  

MigrationBeanEJB2xHome에 대한 참조를 넣기 위해 @EJB 주석을 사용한다. @EJB 주석은 EJB 3.0 사양의 일부로 소개되었지만 EJB 3.0 비즈니스 인터페이스 뷰를 비롯하여 이전 스타일의 EJB 2.x 홈 뷰와 함께 사용되도록 설계되었다. EJB 컨테이너가 MigrationBean을 인스턴스화할 때마다 EJB2xHome에 대한 참조가 ejb2xHome 데이터 멤버에 삽입된다.

@EJB 주석을 2.x 홈 인터페이스에서 사용하면 PortableRemoteObject.narrow()를 사용할 필요가 없는 중요한 이점이 있다. PortableRemoteObject.narrow() 메소드를 사용하면 홈 인터페이스를 조회할 때 Object가 반환한 올바른 유형으로 변환할 수 있다. EJB 3.0에서, 삽입된 홈 참조는 특별한 유형 변환 없이 사용될 수 있다.

MigrationBean 클래스는 홈 참조를 사용하는 @PostConstruct 메소드를 정의하여 EJB2xRemote 참조를 생성한다. 그런 다음 다른 데이터 멤버에 결과를 저장한다.

    @PostConstruct
    private void initialization() {
        try {
            ejb2x = ejb2xHome.create();
        } catch(Exception e) {
            throw new EJBException(e);
        }
    }
   
클래스의 마지막 부분에서 MigrationBean은 고유 비즈니스 메소드 내에서 EJB2x 비즈니스 메소드를 호출한다.

    public void bar() {

      try {
          // Call operation on legacy EJB.
          ejb2x.foo();
      } catch(Exception e) {
          throw new EJBException(e);

      }
    }   

보안 및 트랜잭션 전달 등의 모든 표준 EJB 서비스가 두 Bean 사이에 예상대로 작동한다.

@EJB 주석을 사용하여 EJB 2.x Bean에 액세스하는 것은 EJB 구성요소로 제한되지 않는다. 동일한 접근 방법을 사용하여 서블릿 또는 애플리케이션 클라이언트 등의 Java EE 5 애플리케이션에서 다른 유형의 구성요소로부터 레거시 Bean에 액세스할 수 있다. 또한 이 예제에서는 원격 EJB 2.x Bean을 사용했지만 로컬 EJB 2.x Bean에 액세스할 때도 이 접근 방법을 사용할 수 있다.

EJB 2.x에서 EJB 3.0으로의 호환성

첫 번째 예제에서는 새로운 EJB 3.0 API를 사용하여 작성된 EJB 구성요소가 어떻게 레거시 EJB 구성요소의 클라이언트가 될 수 있는지 살펴보았다. 이제 그 반대의 경우를 살펴보자. 여기서는 EJB 2.x 클라이언트 API를 사용하여 코딩된 레거시 구성요소가 EJB 3.0 단순 API를 사용하여 구현된 세션 빈을 어떻게 액세스할 수 있는지 살펴보자. 이 개념에서는 기존 EJB 클라이언트 노드에 대한 변경 없이 새로운 EJB를 사용한다.

이 두 번째 예제에서는 AdaptedBean이라는 무상태 세션 빈이 단순 EJB 3.0 API를 사용하여 구현된다. 이 Bean은 2.x 원격 홈 인터페이스를 독립형 Java 클라이언트에 노출한다. 다음은 AdaptedBean에 대한 홈 및 원격 인터페이스이다.

   public interface AdaptedHome extends EJBHome {

       public AdaptedRemote create(String id)
           throws CreateException, RemoteException;
   }

   public interface AdaptedRemote extends EJBObject {

       public String getId() throws RemoteException;
   }
   
다음은 AdaptedBean 클래스이다.

   @Stateful
   @RemoteHome(AdaptedHome.class)
   public class AdaptedBean {

       private String myId = "unknown";

       @Init
       public void create(String id) {
           myId = id;
       }

       public String getId() {
           return myId;
       }

   }  

이 Bean 클래스는 POJO와 유사한 EJB 3.0의 단순화를 통해 구현된다. 하지만 이 클래스는 @RemoteHome 주석을 사용하여 EJB 2.x 스타일의 원격 홈 인터페이스를 노출한다. 이 주석은 이 Bean에 AdaptedHome이라는 홈 인터페이스와 AdaptedRemote라는 원격 인터페이스가 있다는 사실을 EJB 컨테이너에 알려 준다. AdaptedRemote 인터페이스를 지정하는 별도의 주석은 필요하지 않다. 컨테이너가 AdaptedHomecreate() 메서드에 대한 서명으로부터 이를 도출할 수 있기 때문이다. Bean이 로컬 홈 인터페이스를 노출한 경우 @LocalHome 주석이 대신 사용된다.

클래스에서 또 다른 중요 주석은 @Init이다. EJB 2.x 뷰는 항상 create 메소드를 정의하므로 Bean 클래스에 대한 메소드를 정의하여 생성 작업을 처리해야 한다. @Init 주석은 해당 메소드가 어떤 메소드인지 EJB 컨테이너에 알려 준다. 이 메소드는 어떤 이름이라도 가질 수 있지만 해당 메소드 매개변수는 해당 홈 인터페이스의 create 메소드와 일치해야 한다.

다음은 AdaptedBean을 액세스하기 위한 독립형 클라이언트 코드이다.

   try {

        InitialContext ic = new InitialContext();
        Object o = ic.lookup(AdaptedHome.class.getName());

        AdaptedHome adaptedHome = (AdaptedHome)
            PortableRemoteObject.narrow(o, AdaptedHome.class);

        AdaptedRemote adapted = adaptedHome.create("duke");

        System.out.println("Adapted id = " + adapted.getId());

   } catch(Exception e) { ... }
   

이 클라이언트 코드는 독립형 EJB 2.x 클라이언트 프로그래밍 모델을 사용한다. 대상 Bean이 EJB 3.0으로 구현되었다는 사실을 이 코드가 알아야 할 필요는 없다.

샘플 코드 실행하기

샘플 패키지가 이 팁에 제공된다. 샘플을 설치하고 실행하려면 다음 단계를 수행한다.

  1. Java EE 5 SDK가 없으면 Java EE Downloads 페이지에서 Java EE 5 SDK를 다운로드한다. Java Platform Standard Edition (Java SE) 5 SDK가 설치되어 있는지도 확인한다.

  2. 팁에 대한 샘플 패키지를 다운로드하고 해당 컨텐츠의 압축을 푼다. 이제 압축이 풀린 디렉토리가 <sample_install_dir>/ttfeb2007ejbmigration과 같이 나타난다. 여기서 <sample_install_dir>는 샘플 패키지를 설치한 디렉토리이다. 예를 들어, Windows 시스템의 C:\ 경로에 해당 컨텐츠의 압축을 풀었다면 새로 생성된 디렉토리는 C:\ttfeb2007ejbmigration이 되어야 한다. 이 디렉토리 아래에는 MigrationAdapted의 두 하위 디렉토리가 나타난다.

  3. EJB 3.0에서 EJB 2.x로의 호환성 예제를 빌드하고 실행하려면 Migration 디렉토리로 변경한다. EJB 2.x에서 EJB 3.0으로의 호환성 예제를 빌드하고 실행하려면 Adapted 디렉토리로 변경한다. 그런 다음 선택한 디렉토리에 있는 build.xml 파일에서 javaee.home 위치 속성을 Java EE 5 애플리케이션 서버가 설치된 디렉토리로 설정한다.

  4. 다음 명령을 입력하여 애플리케이션 서버를 시작한다.

       <appserv_install>/bin/asadmin start-domain domain1
         
    여기서 <appsrv_install>은 Java EE 5가 설치된 경로이다.

       application server.    

  5. 다음 명령을 입력한다.

        ant all

    그러면 샘플 애플리케이션이 빌드되고 배포 및 실행된다.

    EJB 3.0에서 EJB 2.x로의 호환성 예제에 대한 출력 결과는 다음과 같다.

            runappclient:
              [exec] Successfully called EJB 3.0 bean

    EJB 2.x에서 EJB 3.0으로의 호환성 예제에 대한 출력 결과는 다음과 같다.

            runjavaclient:
              [java] Adapted id = duke

    그런 다음 이 애플리케이션은 자동으로 배포 해제되고 해당 빌드 자원은 지워진다.



요약

EJB 3.0 사양에서는 세션 빈 API가 매우 단순화됩니다. 하지만 이러한 단순화는 이 사양 이전 버전을 사용하여 빌드된 EJB 애플리케이션에 많은 투자가 되어 있다는 사실을 감안한 것입니다. 이러한 이유로 EJB 3.0의 목표는 새로운 애플리케이션과 기존 애플리케이션 사이의 원활한 상호 운용성을 보장하는 것입니다. EJB 3.0을 사용하는 개발자라면 레거시 애플리케이션을 새로운 API로 마이그레이션할 것인지, 아니면 새로운 구성요소로부터 해당 레거시 애플리케이션을 이용할 것인지에 대해 유연하게 판단할 수 있습니다.


"Java EE" 카테고리의 다른 글

2007/04/10 11:21 2007/04/10 11:21

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/361

댓글을 달아 주세요

  1. 고진구  수정/삭제  댓글쓰기

    자바는 알면 알수록 재미가 있어지네요. 좋은 자료 잘 활용하겠습니다.

    2007/09/13 22:42
  2. 김문경  수정/삭제  댓글쓰기

    샘플 코드 실행하기 확실히 알았읍니다^^

    2007/09/17 21:58
  3. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 03:47
  4. 진정미  수정/삭제  댓글쓰기

    좋은 정보 많이 얻고 갑니다.

    2007/09/19 23:07
[로그인][오픈아이디란?]

◀ Prev 1  ... 279 280 281 282 283 284 285 286 287  ... 626  Next ▶