엔터프라이즈 Bean 개발

두 가지 엔터프라이즈 Bean 개발 시나리오 중 하나에 일반적으로 제품이 사용됩니다. 첫 번째 시나리오는 Ant, Make, Maven 또는 유사한 도구를 사용하는 명령행이고 두 번째 시나리오는 IDE 기반 개발 및 빌드 환경입니다. 이 기사의 단계에서는 IDE를 사용하지 않는 개발에 대해 설명합니다.

시작하기 전에

Enterprise JavaBeans(EJB) 2.x Bean 전용: J2EE 애플리케이션을 설계하고 필요한 엔터프라이즈 Bean을 설계하십시오.
  • CMP(Container-Managed Persistence)가 있는 엔티티 Bean을 개발하기 전에 동시성 제어 주제를 읽어보십시오.
EJB 3.x Bean 전용: Java™ EE 애플리케이션 및 엔터프라이즈 Bean을 설계하십시오.
  • CMP가 있는 엔티티 Bean을 개발하기 전에 "동시성 제어" 주제를 읽어 보십시오. EJB 3.x 모듈은 엔티티 Bean을 지원하지 않습니다. EJB 2.x 레벨 모듈에는 계속 엔티티 Bean이 필요합니다.

이 태스크 정보

다음은 엔터프라이즈 Bean 개발 도구를 선택하는 두 가지 기본 방법입니다.
  • 엔터프라이즈 Bean 코드의 상당 부분을 자동으로 생성하고 엔터프라이즈 Bean 패키징 및 테스트를 위한 통합 도구를 포함하는 사용 가능한 IDE 도구 중 하나를 사용할 수 있습니다. Rational® Application Developer 제품은 권장되는 IDE입니다.

    IDE 프로젝트 빌드 경로에 install_root/dev/JavaEE/j2ee.jar을 추가하여 새 EJB 3.x API 클래스에 대한 컴파일 종속성을 해결하십시오. 코드 지원은 이 JAR 파일이 프로젝트 빌드 경로에 추가될 때 작동합니다. 서버를 정의하는 경우(J2EE Perspective 참조), 서버를 제품 설치 디렉토리로 연결하십시오. Rational Application Developer에서 Java EE 관련 프로젝트를 작성하는 경우 프로젝트가 install_root/dev/JavaEE/j2ee.jar을 프로젝트 빌드 경로에 자동으로 추가합니다.

  • IDE 없이 엔터프라이즈 Bean을 개발하기로 결정한 경우, 적어도 ASCII 텍스트 편집기가 필요합니다. 엔터프라이즈 Bean 개발을 지원하지 않는 Java 개발 도구를 사용할 수도 있습니다. 그런 다음, 이 제품 및 Java SDK(Software Development Kit)에서 제공하는 도구를 사용하여 Bean을 어셈블, 테스트 및 배치할 수 있습니다.

    어셈블리 도구와 마찬가지로, 표준 Java EE 명령행 빌드 환경에는 EJB 3.x 모듈을 사용하기 위한 몇 가지 변경 작업이 필요합니다. 이전 Java EE 애플리케이션 개발 패턴의 경우와 같이, 컴파일러 클래스 경로에 install_root/dev/JavaEE 디렉토리에 있는 j2ee.jar 파일을 포함시켜야 합니다. Ant를 사용하는 명령행 빌드 환경 예제는 install_root/samples/src/TechSamp 디렉토리에 있습니다.

다음 단계는 IDE를 사용하지 않는 개발인 두 번째 접근 방법을 주로 지원합니다.

프로시저

  1. 필요한 경우, 기존 코드를 필수 EJB 스펙 버전으로 마이그레이션시키십시오.

    EJB 스펙 버전 1.1, 2.0 및 2.1에 작성된 애플리케이션은 EJB 3.x 컨테이너에서 변경하지 않고 실행할 수 있습니다. "지원되는 스펙으로 엔터프라이즈 Bean 코드 마이그레이션" 주제를 참조하십시오.

  2. 엔터프라이즈 Bean의 컴포넌트를 작성하여 컴파일하십시오.
    • 최소한 EJB 3.x 스펙으로 개발된 세션 Bean에는 Bean 클래스가 필요합니다.
    • 최소한 EJB 1.1 세션 Bean에 Bean 클래스, 홈 인터페이스 및 원격 인터페이스가 필요합니다. EJB 1.1 엔티티 Bean에는 Bean 클래스, 1차 키 클래스, 원격 홈이나 로컬 홈 인터페이스 및 원격 또는 로컬 인터페이스가 필요합니다.
    • 최소한 EJB 2.x 세션 Bean에는 Bean 클래스, 홈 또는 로컬 홈 인터페이스 및 원격이나 로컬 인터페이스가 필요합니다. EJB 2.x 엔티티 Bean에는 Bean 클래스, 1차 키 클래스, 원격 홈이나 로컬 홈 인터페이스 및 원격 또는 로컬 인터페이스가 필요합니다. 인터페이스 유형은 함께 사용되므로 로컬 인터페이스를 구현하는 경우 로컬 홈 인터페이스도 정의해야 합니다.
      주의: 1차 키 클래스는 unknown이 될 수 있습니다. 자세한 정보는 "알 수 없는 1차 키 클래스" 주제를 참조하십시오.
    • 메시지 구동 Bean에는 Bean 클래스만 필요합니다.
  3. 각 엔티티 Bean의 지속 조작을 처리하십시오.

    EJB 3.x 모듈의 경우, JPA(Java Persistence API) 스펙을 사용하여 POJO(Plain Old Java Object) 지속 엔티티를 개발할 수 있습니다. 자세한 정보는 JPA(Java Persistence API) 주제를 참조하십시오. 이전 EJB 스펙에서 엔티티 Bean을 개발하려면 다음 단계를 따르십시오.

    • 엔티티 Bean 지속 데이터에 맞는 데이터베이스 스키마를 작성하십시오.
      • 속성이 CMP인 엔티티 Bean의 경우, Bean 지속 데이터는 지원하는 데이터베이스 중 하나에 저장해야 합니다. 어셈블리 도구는 CMP 엔티티 Bean의 데이터베이스 테이블을 작성하기 위한 SQL 코드를 자동으로 생성합니다. CMP Bean에 복합 데이터베이스 맵핑이 필요한 경우 Rational Application Developer를 사용하여 데이터베이스 테이블 코드를 생성하는 것이 좋습니다. 어셈블리 도구 사용에 대한 자세한 정보는 어셈블리 도구 Information Center를 참조하십시오.
      • BMP(bean-managed persistence)를 갖는 엔티티 Bean의 경우, 데이터베이스 도구를 사용하여 데이터베이스 및 데이터베이스 테이블을 작성하거나 기존 데이터베이스 및 데이터베이스 테이블을 사용할 수 있습니다.

      데이터베이스 및 데이터베이스 테이블 작성에 대한 자세한 정보는 데이터베이스 문서를 참조하십시오.

    • (EJB 2.x용 CMP 엔티티 Bean 에만 해당)

      EJB QL(EJB Query Language)로 파인더 조회를 정의하십시오.

      EJB QL을 사용하여 다음과 같이 CMP 필드와 컨테이너 관리 관계 측면에서 파인더를 정의할 수 있습니다.
      • 공용 파인더는 Bean 홈 인터페이스에서 볼 수 있습니다. 이 파인더는 Bean 클래스에서 정의되고 원격 인터페이스와 콜렉션 유형만 리턴합니다.
      • 개인용 파인더는 SELECT문으로 표현되고 Bean 클래스 내부에서만 사용됩니다. 이 파인더는 로컬 및 원격 인터페이스, 종속 값, 기타 CMP 필드 유형 및 콜렉션 유형을 리턴할 수 있습니다.
    • (EJB 1.1용 CMP 엔티티 Bean 전용: IBM® 확장) findByPrimaryKey 메소드가 아닌 특수 finder 메소드가 들어 있는 CMP 엔티티 Bean마다 파인더 헬퍼 인터페이스를 작성하십시오.
      CMP를 포함한 엔티티 Bean의 홈 인터페이스에 들어 있는 각 finder 메소드에 대해 findByPrimaryKey 메소드가 아닌 다음과 같은 논리가 필요합니다.
      • 이 로직은 NameBeanFinderHelper 공용 인터페이스에 정의해야 합니다. 여기서 Name은 엔터프라이즈 Bean의 이름(예: AccountBeanFinderHelper)입니다.
      • findMethodNameWhereClause라는 String 상수에 논리가 포함되어야 합니다. 여기서 findMethodName은 finder 메소드의 이름입니다. String 상수는 해당 메소드가 호출될 때 왼쪽에서 오른쪽으로 finder 메소드 인수 값으로 바꾸는 0개 이상의 물음표(?)를 포함합니다.

예제: 읽기 전용 엔티티 Bean 사용

이 사용법 시나리오 및 예제에서는 읽기 전용 엔티티 Bean을 사용하는 Enterprise JavaBeans(EJB)를 작성하는 방법을 보여줍니다.

사용법 시나리오

고객은 오후 10:00 로컬 시간(24시간 형식으로 22:00)보다 이전에 매일 업데이트되는 카탈로그 가격 및 출하 비율 정보의 데이터베이스를 보유합니다. 고객은 읽기 전용으로 이 데이터에 액세스하는 EJB 애플리케이션을 작성하고자 합니다. 즉, 이 애플리케이션은 가격 데이터베이스를 업데이트하지 않습니다. 업데이트는 일부 기타 애플리케이션을 통해 수행됩니다.

예제

고객의 엔티티 Bean 로컬 인터페이스는 다음과 같습니다.

	public interface ItemCatalogData extends EJBLocalObject {
	 
	  	  public int getItemPrice();
	 
	  	  public int getShippingCost(int destinationCode);
	 
}

출하를 포함한 전체 가격을 파악하기 위해 이 EntityBean을 호출하는 Stateless 세션 Bean 메소드(TxRequired라고 가정함)의 코드는 다음과 같습니다.

.....
		// Some transactional steps occur prior to this point, such as removing the item from 
  // inventory, etc.
  // Now obtain the price of this item and start to calculate the total cost to the purchaser
 
  ItemCatalogData theItemData = 
	    	    (ItemCatalogData) ItemCatalogDataHome.findByPrimaryKey(theCatalogNumber);
 
		int totalcost = theItemData.getItemPrice();
	 
		// ...     some other processing, etc. in the interim
	// ...
	// ...
	 
		// Add the shipping costs
		totalcost = totalcost + theItemData.getShippingCost(theDestinationPostalCode);
애플리케이션 어셈블리 시간에 고객은 다음과 같이 이 Bean에 대한 EJB 캐싱 매개변수를 설정합니다.
  • ActivateAt = ONCE
  • LoadAt = DAILY
  • ReloadInterval = 2200
    제거된 기능 제거된 기능: WAR 파일 확장(WEB-INF/ibm-web-ext.xmi) 및 애플리케이션 확장(META-INF/ibm-application-ext.xmi)을 포함하여 IBM 배치 디스크립터 확장의 reloadInterval 및 reloadingEnabled 속성은 더 이상 사용되지 않습니다.depfeat

매일 밤 22:00 이후에 getItemPrice() 메소드에 대한 첫 번째 호출에서 EJB 컨테이너는 데이터베이스에서 가격 정보를 다시 로드합니다. getItemPrice() 및 getShippingCost()에 대한 호출 사이에 시계가 22:00시를 치면, getShippingCost() 메소드는 22:00에 발생했을 수 있는 데이터베이스에 대한 변경사항 이전에 보유한 값을 계속 리턴합니다. 이 트랜잭션의 첫 번째 메소드 호출이 22:00시 이전에 발생했기 때문입니다. 따라서 사용된 항목 가격 및 출하 비용은 서로가 동기화된 상태를 유지합니다.

다음에 수행할 작업

하나 이상의 EJB 모듈에서 Bean을 어셈블하십시오. EJB 3.x Bean을 사용하는 경우, EJB 모듈 어셈블 또는 EJB 3.x 모듈 어셈블 주제를 참조하십시오.


주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_dvdp
파일 이름:tejb_dvdp.html