EJB 3.1과 EJB 2.1의 차이점

EJB 2.1에 비해 EJB 3.1은 EJB(Enterprise Java™ Bean) 애플리케이션 작성 프로세스를 단순화합니다.

J2EE 1.4 아키텍처의 복잡도 및 EJB 2.x

J2EE 1.4 아키텍처

비즈니스 계층 J2EE 1.4 아키텍처에서 세션 Bean은 비즈니스 로직 컴포넌트를 랩핑하기 위해 사용되며, 해당 컴포넌트에 트랜잭션, 분산, 원격 및 보안 서비스를 제공합니다. 일반적으로 클라이언트와 서비스 제공자 사이의 네트워크 트래픽을 줄이기 위해 Facade 패턴을 구현합니다. 로컬 클라이언트(즉, 동일한 JVM 내에 있는 클라이언트) 또는 원격 클라이언트에서 세션 Bean에 액세스할 수 있습니다.

메시지 구동 Bean은 비동기 메시지 핸들링 서비스를 사용할 수 있도록 외부 JMS 제공자(예: MQSeries)를 통합하는 데 사용됩니다.

세션 Bean 및 메시지 구동 Bean는 함께 비즈니스 로직 계층을 구성합니다. 이를 계층이라 하는 이유는 이 엔터프라이즈 아키텍처의 디자인에 채택된 다른 기초 패러다임이 계층화이기 때문인데, 이로 인해 의무와 스킬의 분리, 클러스터링 및 컴포넌트 재사용과 같은 코어 기능을 사용할 수 있습니다.

지속성 계층 - 기타 기초 계층은 소위 지속성 계층이라 하며, 이는 애플리케이션 데이터를 관계형 데이터베이스에 지속시킬 수 있는 컴포넌트 및 서비스의 세트입니다. 다음 방법으로 지속성 계층을 구현할 수 있습니다.
  • 엔티티 Bean(컨테이너 관리 및 Bean 관리 Bean)
  • JDBC™ DAO(Data Access Object)
  • ORM(Object-Relational Mapping) 프레임워크

EJB 2.x 스펙의 문제점

  • EJB 2.x 스펙에서, 컴포넌트 인터페이스는 EJB 프레임워크 패키지의 인터페이스를 반드시 확장하고, 비즈니스 로직 구현 클래스는 EJB 프레임워크 패키지의 인터페이스를 반드시 구현해야 합니다. 이 요구사항 때문에 개발자가 작성한 코드와 EJB 프레임워크 패키지의 인터페이스 클래스 사이에 긴밀한 결합이 발생합니다. 또한, 여기에는 EJB의 기본 디자인 목표 및 필요하지 않은 예외 처리와 직접 관련이 없는 일부 불필요한 콜백 메소드(ejbCreate, ejbPassivate, ejbActivate)의 구현이 필요합니다.
  • EJB 배치 디스크립터는 매우 상세하고, 복합적이며, 오류가 발생하기 쉽습니다.
  • 애플리케이션에서 EJB 컴포넌트를 올바르게 실행하는 데 필요한 모든 서비스를 제공하기 위해 J2EE 컨테이너가 필요하므로 EJB는 테스트하기 어렵습니다.
  • 자원(예: 데이터 소스 또는 EJB 홈 참조)에 액세스할 때마다 JNDI에 의존하는 것은 J2EE 개발에서 반복적이고 지루한 오퍼레이션입니다.
  • CMP(Container-Managed Persistence) 모델은 개발 및 관리하기에 복잡합니다.

EJB 3.1에서 단순화된 모델

Java EE 및 EJB 3.1의 전체 아키텍처는 EJB 3.1 모델의 단순화를 반영합니다.

EJB 3.1 아키텍처

EJB 3.1 스펙의 기본 개념은 배치 디스크립터에 포함되었던 정보를 캡처하기 위해 Java 어노테이션을 사용하는 POJO(Plain Old Java Object) 프로그램 모델에 중점을 둡니다. 이제, 배치 디스크립터는 모든 경우에서 선택적입니다. 또한, 자유롭게 기본값을 사용하면 지원되는 코드를 쓰고, 유지보수할 필요성이 줄어듭니다. 이로 인해 EJB 3.1 컴포넌트의 작성 및 사용 시 프로그래밍 절차가 매우 단순화됩니다. 이렇게 단순화된 모델의 기본 기능에는 다음이 포함됩니다.
  • 이제, EJB는 일반 비즈니스 인터페이스(POJI)를 노출하는 POJO(Plain Old Java object)이며, 홈 인터페이스에 대한 요구사항이 없습니다.
  • Java 코드 또는 XML 배치 디스크립터를 생성하는 데 사용되는 확장 가능하고 메타데이터 구동의, 속성 지향 프레임워크인 메타데이터 어노테이션의 사용.
  • 특정 인터페이스 및 배치 디스크립터의 제거(어노테이션이 배치 디스크립터 정보를 대체할 수 있음).
  • 비즈니스 메소드의 호출 시 또는 라이프사이클 이벤트 시 사용자 메소드를 호출하는 인터셉터 기능.
  • 가능하면 기본값의 사용("예외별 구성" 접근).
  • 확인된 예외 사용법에 대한 요구사항 감소.
  • EJB 2.x 엔티티 Bean을 대신하는 완전히 새로운 지속성 모델(JPA 표준 기반).
표 1. EJB 2.1과 EJB 3.1의 Bean 작성 단계 비교. EJB 2.x는 배치 디스크립터를 사용하고 EJB 3.1은 어노테이션을 사용합니다.
EJB 2.x에서 Stateless 세션 Bean 정의 단계 EJB 3.1에서 Stateless 세션 Bean 정의 단계

EJB 2.x 스펙에 따라 Stateless 세션 Bean을 작성하려면 다음 컴포넌트를 정의하십시오.

  • EJB 컴포넌트 인터페이스: EJB 클라이언트가 Bean의 기능에 대한 액세스를 얻을 때 사용됩니다. 여기에서 비즈니스 비즈니스가 정의됩니다. 컴포넌트 인터페이스를 EJB 오브젝트라고 합니다. 컴포넌트 인터페이스에는 다음 두 가지 유형이 있습니다.
    • 원격 컴포넌트 인터페이스(EJBObject): 원격 클라이언트가 RMI-IIOP 프로토콜을 통해 EJB에 액세스할 때 사용됩니다.
    • 로컬 컴포넌트 인터페이스(EJBLocalObject): 로컬 클라이언트(즉, 동일한 JVM에서 실행되는 클라이언트)가 EJB에 액세스할 때 사용됩니다.
  • EJB 홈 인터페이스: EJB 클라이언트가 Bean에 대한 액세스를 얻을 때 사용됩니다. 작성, 찾기 또는 제거하는 Bean 라이프사이클 메소드를 포함합니다. 홈 인터페이스를 EJB 홈이라고 합니다. EJBHome 오브젝트는 홈 인터페이스를 구현하는 오브젝트이며, EJBObject에서처럼 배치 중에 컨테이너 도구로부터 생성되며, 컨테이너 특정 코드를 포함합니다. 시작 시 EJB 컨테이너는 배치된 엔터프라이즈 Bean의 EJBHome 오브젝트를 인스턴스화하고 홈을 이름 지정 서비스에 등록합니다. EJB 클라이언트는 JNDI(Java Naming and Directory Interface)를 사용하여 EJBHome 오브젝트에 액세스합니다. 홈 인터페이스에는 다음 두 가지 유형이 있습니다.
    • 원격 홈 인터페이스(EJBHome): 원격 클라이언트가 RMI-IIOP 프로토콜을 통해 EJB에 액세스할 때 사용됩니다.
    • 로컬 홈 인터페이스(EJBLocalHome): 로컬 클라이언트(즉, 동일한 JVM에서 실행되는 클라이언트)가 EJB에 액세스할 때 사용됩니다.
  • EJB Bean 클래스: 모든 실제 Bean 비즈니스 로직을 포함합니다. 비즈니스 로직 구현을 제공하는 클래스입니다. 이 Bean 클래스의 메소드는 컴포넌트 및 홈 인터페이스의 메소드와 연관됩니다.

EJB 3.1 스펙에 따라 Stateless 세션 Bean을 선언하려면 단순히 POJO를 정의하십시오.

  • @Stateless
    public class MySessionBean implements MyBusinessInterface {
    // business methods according to MyBusinessInterface
    .....
    }
  • 동일한 Bean을 원격 인터페이스에 노출하려면 @Remote 어노테이션을 사용하십시오.
    @Remote(MyRemoteBusinessInterface.class)
    @Stateless
    public class MyBean implements MyRemoteBusinessInterface {
    // ejb methods
    .....
    }

EJB 2.1 클래스 및 배치 디스크립터 파일과 동등한 EJB 3.1 클래스의 비교

표 1의 예제는 기능적으로 동등합니다.

표 2. EJB 2.1과 EJB 3.1의 비교. EJB 2.1은 배치 디스크립터를 사용하고 EJB 3.1은 어노테이션을 사용합니다.
EJB 2.1 EJB 3.1

Java 클래스

public class AccountBean
implements javax.ejb.SessionBean {
 
     SessionContext ctx;
     DataSource accountDB;
 
     public void setSessionContext(SessionContext ctx) {
        this.ctx = ctx;
     }
 
     public void ejbCreate() {
          accountDB = (DataSource)ctx.lookup(
                          "jdbc/accountDB");
 
     }
     public void ejbActivate() { }
     public void ejbPassivate() { }
     public void ejbRemove() { }

     public void setAccountDeposit(int empId,
                                      double deposit) {
       ...
       Connection conn = accountDB.getConnection();
       ...
     }
  ...
}

Java 클래스

@Stateless
public class AccountBean implements Account
{
     @Resource private DataSource accountDB;
 
     public void setAccountDeposit(int customerId,
                                      double deposit) {
       ...
       Connection conn = accountDB.getConnection();
       ...
     }
  ...
}

배치 디스크립터

<session>
  <ejb-name>AccountBean</ejb-name>
  <local-home>AccountHome</local-home>
  <local>Account</local>
  <ejb-class>com.example.AccountBean</ejb-class>
  <session-type>Stateless</session-type>
  <transaction-type>Container</transaction-type>
  <resource-ref>
    <res-ref-name>jdbc/accountDB</res-ref-name>
    <res-ref-type>javax.sql.DataSource</res-ref-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</session>
...
<assembly-descriptor>...</assembly-descriptor>
 
주제 유형을 표시하는 아이콘 개념 주제
Information Center의 이용 약관 | 피드백

시간소인 아이콘 마지막 업데이트 날짜: 2014-05-22

파일 이름: cejb3vejb21.html