11.     The Business Delegate pattern
Session FaçadeMessage Façade를 사용할 때,클라이언트는EJB레이어와 강하게 결합되어 있어서 개발 과정이나 런타임,또는 프로젝트 관리에 영향을 미치는 클라이언트와 서버 사이의 의존성을 양산한다.
좋은EJB디자인에서는 유스케이스를 세션 빈이나 메시지 드리븐 빈들로 나누어야 한다.이 레이어와 상호 작용하는 일반적인 방법은 클라이언트 코드에서 직접 호출하는 것이다..,프레젠테이션 레이어는 직접 세션 빈의EJB HomeEJB Object와 상호 작용한다.그리고 메시지 드리븐 빈들과 이야기할 때는JMS메시지를 보낸다.
아이러니하게도EJB애플리케이션을 프로그래밍할 때EJB API에서 직접 프로그래밍하는 것이 항상 최상의 방법은 아니다.클라이언트 레이어와EJB레이이어가 강하게 결합되므로 여러가지 문제가 발생한다.그러므로 이를 캡슐화 하는Business Delegate패턴을 사용한다.
 
구조

사용자 삽입 이미지

Business Delegate pattern class diagram
 

사용자 삽입 이미지

Business Delegate pattern sequence diagram
 
역할
·         LookupService :
Business Delegate
가 비즈니스 서비스의 위치를 찾을 때 사용한다.이 것은 비즈니스 서비스lookup을 캡슐화 하고 있다.
 
 
의도
Business DelegateSession FaçadeMessage Façade EJB레이어의 메소드 호출로부터 찾고 위임하고 복구 하는데 필요한 코드를 캡슐화 하여EJB API의 복잡성을 감출수 있는 일반 자바 클래스 이다.
 
결론
·         Business Delegate는 클라이언트와 서버 사이에서 중간자적 역할을 하는 평이한 자바 클래스 이다.클라이언트는Business Delegate에서 메소드를 로컬 호출한 다음, Session façade에게 직접 위임하거나, JMS메시지를 만들어Message Façade로 보낸다.
·         Business DelegateSession Facade에서 세션빈들과 일 대 일로 매핑되며,여러 메시지 드리븐 빈들에게 메시지를 보낼수 있도록 만들수 있다.
·         Business Delegate는 다음의 기능도 포함한다.
n        EJB메소드 호출을 위임한다.
n        특정한EJB시스템 예외를 숨긴다.
n        로컬에서 데이터를 캐시한다.
n        실패한 트랜잭션을 다시 시도한다.
n        비즈니스 로직을 로컬에서 실행하거나 클라이언트를 위해 데이터를 만든다.
상태유지 세션빈에서의Business Delegate
 
상태유지 세션빈에서는Business Delegate에서 재사용할 수 있도록 로컬에서 캐시할 수 있다.서블릿 애플리케이션에서, Business delegateServletSession에서 캐시된다.상태 유지Business DelegateHTTPSession에 저장하는 것을 지원하려면 다음을 주의해야 한다.
·         Business Delegate는 직렬화 가능해야 한다.
·         직렬화를 지원하려면EJB Object을 사용할수 없고EJB핸들을 사용해야 한다.(EJB Object는 직렬화을 보장하지 못한다.)
상태유지 세션 빈에서의 사용으로 얻을 수 있는 또하나의 이점은 클래스와 메소드가 동시에 발생되어 같은 세션 빈에서 연이어 일어나는 호출로부터 클라이언트를 보호할 수 있다는 것이다.
 
예제소스
publicclassResourceDelegate{
      // Session Facade리모트레퍼런스
      privateResourceSessionsession;
 
      //Session Facade's Home object클래스
      privatestaticfinalClasshomeClazz=
            corepatterns.apps.psa.ejb.ResourceSessionHome.class;
 
      // Default Constructor. Looks up home and connects
      // to session by creating a new one
      publicResourceDelegate()throwsResourceException{
            try{
                   ResourceSessionHomehome=
                          (ResourceSessionHome)ServiceLocator.getInstance().getHome(
                                "Resource",
                                homeClazz);
                   session=home.create();
            }catch(ServiceLocatorExceptionex){
                   // Translate Service Locator exception into
                   // application exception
                   thrownewResourceException(...);
            }catch(CreateExceptionex){
                   // Translate the Session create exception into
                   // application exception
                   thrownewResourceException(...);
            }catch(RemoteExceptionex){
                   // Translate the Remote exception into
                   // application exception
                   thrownewResourceException(...);
            }
      }
 
      // Constructor that accepts an ID (Handle id) and
      // reconnects to the prior session bean instead
      // of creating a new one
      publicBusinessDelegate(Stringid)
      throwsResourceException{
            super();
            reconnect(id);
      }
 
      // Returns a String ID the client can use at a
      // later time to reconnect to the session bean
      publicStringgetID(){
            try{
                   returnServiceLocator.getId(session);
            }catch(Exceptione){
                   // Throw an application exception
            }
      }
 
      // method to reconnect using String ID
      publicvoidreconnect(Stringid)
      throwsResourceException{
            try{
                   session=
                   (ResourceSession)ServiceLocator.getService(id);
            }catch(RemoteExceptionex){
                   // Translate the Remote exception into
                   // application exception
                   thrownewResourceException(...);
            }
      }
 
      // The following are the business methods
      // proxied to the Session Facade. If any service
      // exception is encountered, these methods convert
      // them into application exceptions such as
      // ResourceException, SkillSetException, and so
      // forth.
 
      publicResourceTOsetCurrentResource(StringresourceId)
      throwsResourceException{
            try{
                   returnsession.setCurrentResource(resourceId);
            }catch(RemoteExceptionex){
                   // Translate the service exception into
                   // application exception
                   thrownewResourceException(...);
            }
      }
 
      publicResourceTOgetResourceDetails()
      throwsResourceException{
            try{
                   returnsession.getResourceDetails();
            }catch(RemoteExceptionex){
                   // Translate the service exception into
                   // application exception
                   thrownewResourceException(...);
            }
      }
 
      publicvoidsetResourceDetails(ResourceTOvo)
      throwsResourceException{
            try{
                   session.setResourceDetails(vo);
            }catch(RemoteExceptionex){
                   thrownewResourceException(...);
            }
      }
 
      publicvoidaddNewResource(ResourceTOvo)
      throwsResourceException{
            try{
                   session.addResource(vo);
            }catch(RemoteExceptionex){
                   thrownewResourceException(...);
            }
      }
 
      // all other proxy method to session bean
      ...}
 

Posted by 영웅기삼
,