예제: 세션 Bean Facade 작성

이 주제에서는 세션 Bean Facade 작성 마법사를 사용하여 세션 Bean Facade를 생성하는 방법에 대해 설명합니다. 어노테이션을 사용하여 세션 Bean Facade를 변경하는 여러 예제도 제공합니다.

이 태스크 정보

세션 Facade 및 SDO의 어노테이션에서 @ws.sdo 및 @ws.sbf 태그 세트에 대한 참조 정보를 확인하십시오.

이 시나리오에는 경매 애플리케이션 데이터의 지속성을 관리하는 CMP 엔티티 Bean이 포함된 EJB 프로젝트가 있습니다. 예를 들어, CMP 엔티티 Bean은 사용자 계정의 등록, 지불 계정 처리, 입찰 및 판매 품목 관리를 처리합니다. 프로젝트에는 Registration이라는 EJB 2.1 CMP 엔티티 Bean이 있습니다.

Registration CMP 엔티티 Bean은 지정된 사용자와 관련된 모든 데이터를 지속하도록 디자인되어 있습니다. 예를 들어, Registration Bean에는 다음의 속성이 있습니다.
  • userid(1차 키)
  • email
  • passwd
  • name
  • cardtype
  • acctnum
  • expiry
  • shippingsame
  • active
  • rank
Registration CMP 엔티티 Bean에는 다음의 관계도 정의되어 있습니다.
  • [0..*] accountspayable : Accountspayable
  • [0..*] bid : Bid
  • [0..*] item : Item
  • [0..*] sale : Sale
  • [0..*] sale_1 : Sale
  • [0..*] usertorole: Usertorole
  • [0..1] fk_shipaddress : Address(외부 키)
  • [0..1] fk_billingaddress : Address(외부 키)

사용자 및 지불 계정을 관리하기 위해 Registration CMP 엔티티 Bean의 세션 Bean Facade 및 SDO를 작성하려고 합니다. 세션 Bean Facade 작성 마법사를 사용하여 Facade 및 SDO를 신속하게 작성할 수 있습니다.

알아두기: 이 예제에서는 샘플 Bean 코드가 제공되지 않으므로 다음 단계에서는 프로세스와 결과물을 간단하게 소개합니다. 사용자가 직접 CMP 엔티티 Bean을 사용하여 마법사와 어노테이션을 시험해 볼 수 있습니다.

프로시저

  1. 마법사를 열려면 엔터프라이즈 탐색기에서 Registration CMP 엔티티 Bean을 마우스 오른쪽 단추로 클릭하고 팝업 메뉴에서 세션 Bean Facade 작성을 선택하십시오. 세션 Bean Facade 작성 마법사가 열립니다.
  2. 세션 Bean Facade의 이름을 RegistrationFacade로 지정하고 Registration CMP 엔티티 Bean을 선택하십시오.세션 Bean Facade 작성 마법사, 1 페이지
  3. 마법사의 다음 페이지에서 SDO의 이름을 지정하고 읽기 전용이 아닌지 확인하십시오.
  4. SDO(Service Data Object)에 포함시킬 CMP 속성 및 CMR(Container-Managed Relationship) 필드를 선택하십시오.
    • 이 예제에서는 Registration Bean에 정의된 모든 속성을 포함시킵니다. userid 1차 키 필드를 포함한 필수 속성은 기본적으로 선택되어 있습니다. 마법사는 외부 키 관계(fk_shipaddress : Address)도 선택합니다.
    • 그런 다음 [0..*] accountspayable: Accountspayable CMR 관계 옆의 선택란을 선택하십시오.

      세션 Bean Facade 작성 마법사, 2 페이지

      참고:
      • 필수 필드는 기본적으로 선택되어 있으며 SDO가 읽기 전용이 아닌 경우 포함시켜야 합니다.
      • 오른쪽 테이블에서 현재 선택된 CMR 엔티티는 왼쪽 테이블에서 파란색 텍스트로 강조표시되어 있습니다.
  5. 완료를 클릭하거나 다음을 클릭하여 세션 Bean Facade를 추가할 시각적 다이어그램을 지정하십시오.
    • 마법사는 EJB 프로젝트에서 RegistrationFacadeBean 세션 Bean을 생성합니다.

      프로젝트 탐색기의 세션 Bean

      표준 엔터프라이즈 Bean 메소드(ejbCreate, ejbActivate, ejbPassivate, ejbRemove, getSessionContext 및 setSessionContext) 외에 새 RegistrationFacade 세션 Bean에는 Registration SDO에 대한 다음의 메소드가 포함됩니다.
      • applyRegistrationRootChanges
      • createRegistration
      • deleteRegistration
      • getAllRegistrationObjects
      • getRegistrationByKey
      • getRegistrationRoot
      • updateRegistration

      RegistrationFacade 세션 Bean에는 EJB 클라이언트 JAR 프로젝트에서 생성되는 원격 및 로컬 클라이언트 보기가 모두 포함됩니다.

    • SDO Java™ 클래스 및 유틸리티 Java 클래스가 EJB 클라이언트 JAR 프로젝트에 생성됩니다.

      프로젝트 탐색기의 세션 Bean

      • RegistrationRoot.java 파일은 루트 SDO 인터페이스입니다. 이 파일에는 비포함 관계 및 Registration 엔티티 자체에 대한 create() 메소드가 있습니다.
      • Address.java, Accountspayable.java 및 Registration.java는 사용자가 포함시킨 각 포함 CMR 관계의 SDO입니다. 각 SDO에는 포함된 속성의 Getter 및 Setter 메소드가 있습니다.
      • SdoClientFactory.java 클래스는 createNewEmptyRegistrationRoot() 메소드가 있는 팩토리입니다.
    • Registration CMP 엔티티 Bean이 Facade의 루트 엔티티 Bean으로 선택된 경우 어노테이션이 RegistrationBean.java 파일에 추가되었습니다. Workbench에서 이 어노테이션을 사용하여 적합한 세션 Bean 클래스 및 SDO 클래스를 생성합니다. 이 시나리오에서 설명한 바와 같이 마법사를 완료하면 다음 어노테이션이 추가됩니다.
      • RegistrationBean.java 파일의 처음에서 @ws.sbf.session-facade 태그를 사용하여 Facade의 이름 및 연관된 SDO value-object의 이름을 정의합니다. @ws.sdo.value-object 태그는 SDO를 정의합니다.
        /**
         * @ws.sbf.session-facade
         * 	name="RegistrationFacade"
         * 	value-objects="Registration"
         * @ws.sdo.value-object
         * 	name="Registration"
         * 	read-only="false"
         * Bean implementation class for Enterprise Bean: Registration
         */
        public abstract class RegistrationBean implements javax.ejb.EntityBean {
      • 마법사에서 세션 Bean Facade의 일부분으로 선택된 Registration 엔티티 Bean의 각 CMP 속성마다 RegistrationBean.java 파일에는 다음의 어노테이션이 추가됩니다.
        /**
        	 * @ws.sdo.value-object
        	 * 	match="Registration"
        	 * Get accessor for persistent attribute: email
        	 */
        	public abstract java.lang.String getEmail();
      • 마법사에서 세션 Bean Facade의 일부분으로 선택된 RegistrationBean.java 파일에 정의되어 있는 각 CMR(Container-Managed Relationship)마다 RegistrationBean.java 파일에는 다음의 어노테이션이 추가됩니다.
        /**
        	 * @ws.sdo.value-object
        	 * 	match="Registration"
        	 * 	target-value-object="Address"
        	 * 	contained="false"
        	 * This method was generated for supporting the relationship role named fk_shipaddress.
        	 * It will be deleted/edited when the relationship is deleted/edited.
        	 */
        	public abstract sample.AddressLocal getFk_shipaddress();
    • 마법사에서 AccountsPayable 엔티티 Bean에 대한 관계가 Facade에 추가되었으므로 다음의 어노테이션이 AccountsPayable Bean에 추가되었습니다.
      /**
       * @ws.sdo.value-object
       * 	name="Accountspayable"
       * 	read-only="false"
       * Bean implementation class for Enterprise Bean: Accountspayable
       */
  6. RegistrationBean.java의 어노테이션을 편집하여 세션 Bean Facade의 이름을 수정하십시오. name 매개변수의 값을 RegistrationFacade1로 변경하고 변경사항을 저장하십시오.
    /**
     * @ws.sbf.session-facade
     * 	name="RegistrationFacade1"
     * 	value-objects="Registration"
     * @ws.sdo.value-object
     * 	name="Registration"
     * 	read-only="false"
     * Bean implementation class for Enterprise Bean: Registration
     */
    변경사항을 저장한 후 Workbench는 변경된 어노테이션에 따라 새 RegistrationFacade1 세션 Bean을 다시 빌드합니다.

    프로젝트 탐색기의 세션 Bean

  7. 어노테이션을 사용하여 세션 Bean Facade에 조회를 추가하십시오.
    1. RegistrationBean.java 파일에서 새 @ws.sbf.query 어노테이션을 삽입하십시오. 어노테이션을 입력할 때 Ctrl-Space를 입력하여 컨텐츠 지원 기능을 사용할 수 있습니다. 다음의 이미지는 올바른 항목을 제안하는 편집기를 나타냅니다.
      세션 Bean Facade 어노테이션에 대한 컨텐츠 지원
    2. 조회의 이름을 FindRegistrationByEmail로 지정하십시오.
    3. 컨텐츠 지원 기능을 사용하여 조회 값으로 [select {$Registration} as r where r.email = 1]을 입력하십시오.
    4. @ws.sbf.session-facade 태그에 queries 매개변수를 추가하여 세션 Facade에 새 조회를 추가하십시오.
      /**
       * @ws.sbf.session-facade
       * 	name="RegistrationFacade1"
       * 	value-objects="Registration"
       *  queries="FindRegistrationByEmail"
       * @ws.sdo.value-object
       * 	name="Registration"
       * 	read-only="false"
       * @ws.sbf.query
       *   name="FindRegistrationByEmail"
       *   query="[select {$Registration} as r where r.email = 1]"
       * Bean implementation class for Enterprise Bean: Registration
       */
      변경사항을 저장한 후 Workbench는 새 조회를 사용하여 변경된 어노테이션에 따라 RegistrationFacade1 세션 Bean을 다시 빌드합니다. 이제 RegistrationFacade1에는 다음과 같은 두 개의 새 메소드가 있습니다.
      • applyFindRegistrationByEmailChanges(FindRegistrationByEmail)
      • getFindRegistrationByEmail(Serializable[])
        참고: 이 배열의 인수는 조회 인수에 정의된 색인에 따라 색인화됩니다.
  8. Registration 엔티티 Bean의 email 및 userid 속성이 있는 세션 Bean Facade에 새 RegistrationLite SDO를 추가하십시오.
    1. Registration 엔티티 Bean에서 RegistrationLite 이름을 사용하여 새 @ws.sdo.value-object 태그를 정의하십시오. @ws.sbf.session-facade 태그의 value-objects 매개변수에서 RegistrationLite value-object도 추가해야 합니다(공백으로 구분함).
      /**
       * @ws.sbf.session-facade
       * 	name="RegistrationFacade1"
       * 	value-objects="Registration RegistrationLite"
       *  queries="FindRegistrationByEmail"
       * @ws.sdo.value-object
       * 	name="Registration"
       * 	read-only="false"
       * @ws.sdo.value-object
       *  name="RegistrationLite"
       *  read-only="false"
       * @ws.sbf.query
       *   name="FindRegistrationByEmail"
       *   query="[select {$Registration} as r where r.email = 1]"
       * Bean implementation class for Enterprise Bean: Registration
       */
    2. userid 및 email 속성의 어노테이션을 업데이트하여 새 RegistrationLite 오브젝트에 포함시키십시오.
      /**
      	 * @ws.sdo.value-object
      	 * 	match="Registration"
      	 * @ws.sdo.value-object
      	 *   match="RegistrationLite"
      	 * Get accessor for persistent attribute: userid
      	 */
      	public abstract java.lang.Integer getUserid();
      /**
      	 * @ws.sdo.value-object
      	 * 	match="Registration"
      	 * @ws.sdo.value-object
      	 *   match="RegistrationLite"
      	 * Get accessor for persistent attribute: email
      	 */
      	public abstract java.lang.String getEmail();
      RegistrationLite SDO가 읽기 전용으로 정의되지 않았으며 userid 및 email 속성만 SDO에 포함되었으므로 필수 필드가 SDO의 일부분이 아니라는 유효성 검증 경고가 편집기에 표시됩니다. 키 및 필수 속성이 SDO의 일부분이 아닌 경우 "create"가 실패하므로 경고가 표시됩니다.
    이제 RegistrationFacade1Bean에는 다음의 메소드가 있습니다.
    • applyRegistrationLiteRootChanges(RegistrationLiteRoot)
    • createRegistrationLite(RegistrationLite)
    • deleteRegistrationLite(RegistrationLite)
    • getAllRegistrationLiteObjects()
    • getRegistrationLiteByKey(RegistrationKey)
    • getRegistrationLiteRoot()
    • updateRegistrationLite(RegistrationLite)
  9. Status 엔티티 Bean의 다른 SDO를 동일한 RegistrationFacade1 세션 Bean Facade에 추가하십시오.
    1. StatusBean.java 파일에서 Bean 구현에 다음의 어노테이션을 추가하십시오.
      /**
       * @ws.sbf.session-facade
       * match="RegistrationFacade1"
       * value-objects="Status"
       * @ws.sdo.value-object
       *   name="Status"
       *   read-only="true"
       * Bean implementation class for Enterprise Bean: Status
       */
    2. RegistrationBean.java 파일에서 세션 Bean Facade에 대해 정의된 목록에 Status value-object를 추가하십시오.
      * value-objects="Registration RegistrationLite Status"
    Status SDO를 읽기 전용으로 정의했으므로 다음의 메소드가 RegistrationFacade1Bean 클래스에 추가됩니다(update, create 또는 delete 메소드는 추가되지 않음).
    • getAllStatusObjects()
    • getStatusByKey(StatusKey)
    • getStatusRoot()

피드백