2011년 5월 23일 월요일

The Business Delegate pattern

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

구조

Business Delegate pattern class diagram

Business Delegate pattern sequence diagram


역할
· LookupService :
Business Delegate가 비즈니스 서비스의 위치를 찾을 때 사용한다. 이 것은 비즈니스 서비스 lookup을 캡슐화 하고 있다.

의도
Business Delegate는 Session Façade와 Message Façade EJB 레이어의 메소드 호출로부터 찾고 위임하고 복구 하는데 필요한 코드를 캡슐화 하여 EJB API의 복잡성을 감출수 있는 일반 자바 클래스 이다.

결론
  • Business Delegate는 클라이언트와 서버 사이에서 중간자적 역할을 하는 평이한 자바 클래스 이다. 클라이언트는 Business Delegate에서 메소드를 로컬 호출한 다음, Session façade에게 직접 위임하거나, JMS 메시지를 만들어 Message Façade로 보낸다.
  • Business Delegate는 Session Facade에서 세션빈들과 일 대 일로 매핑되며, 여러 메시지 드리븐 빈들에게 메시지를 보낼수 있도록 만들수 있다.
  • Business Delegate는 다음의 기능도 포함한다.
  • EJB 메소드 호출을 위임한다.
  • 특정한 EJB 시스템 예외를 숨긴다.
  • 로컬에서 데이터를 캐시한다.
  • 실패한 트랜잭션을 다시 시도한다.
  • 비즈니스 로직을 로컬에서 실행하거나 클라이언트를 위해 데이터를 만든다.
    상태유지 세션빈에서의 Business Delegate
    상태유지 세션빈에서는 Business Delegate에서 재사용할 수 있도록 로컬에서 캐시할 수 있다. 서블릿 애플리케이션에서, Business delegate는 ServletSession에서 캐시된다. 상태 유지 Business Delegate를 HTTPSession에 저장하는 것을 지원하려면 다음을 주의해야 한다.
    · Business Delegate는 직렬화 가능해야 한다.
    · 직렬화를 지원하려면 EJB Object을 사용할수 없고 EJB 핸들을 사용해야 한다.(EJB Object는 직렬화을 보장하지 못한다.)
    상태유지 세션 빈에서의 사용으로 얻을 수 있는 또하나의 이점은 클래스와 메소드가 동시에 발생되어 같은 세션 빈에서 연이어 일어나는 호출로부터 클라이언트를 보호할 수 있다는 것이다.


    예제소스
    public class ResourceDelegate {
    // Session Facade 리모트 레퍼런스
    private ResourceSession session;
    //Session Facade's Home object 클래스
    private static final Class homeClazz =
    corepatterns.apps.psa.ejb.ResourceSessionHome.class;
    // Default Constructor. Looks up home and connects
    // to session by creating a new one
    public ResourceDelegate() throws ResourceException {
    try {
    ResourceSessionHome home =
    (ResourceSessionHome) ServiceLocator.getInstance().getHome(
    "Resource",
    homeClazz);
    session = home.create();
    } catch (ServiceLocatorException ex) {
    // Translate Service Locator exception into
    // application exception
    throw new ResourceException(...);
    } catch (CreateException ex) {
    // Translate the Session create exception into
    // application exception
    throw new ResourceException(...);
    } catch (RemoteException ex) {
    // Translate the Remote exception into
    // application exception
    throw new ResourceException(...);
    }
    }
    // Constructor that accepts an ID (Handle id) and
    // reconnects to the prior session bean instead
    // of creating a new one
    public BusinessDelegate(String id)
    throws ResourceException {
    super();
    reconnect(id);
    }
    // Returns a String ID the client can use at a
    // later time to reconnect to the session bean
    public String getID() {
    try {
    return ServiceLocator.getId(session);
    } catch (Exception e) {
    // Throw an application exception
    }
    }
    // method to reconnect using String ID
    public void reconnect(String id)
    throws ResourceException {
    try {
    session =
    (ResourceSession) ServiceLocator.getService(id);
    } catch (RemoteException ex) {
    // Translate the Remote exception into
    // application exception
    throw new ResourceException(...);
    }
    }
    // 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.
    public ResourceTO setCurrentResource(String resourceId)
    throws ResourceException {
    try {
    return session.setCurrentResource(resourceId);
    } catch (RemoteException ex) {
    // Translate the service exception into
    // application exception
    throw new ResourceException(...);
    }
    }
    public ResourceTO getResourceDetails()
    throws ResourceException {
    try {
    return session.getResourceDetails();
    } catch (RemoteException ex) {
    // Translate the service exception into
    // application exception
    throw new ResourceException(...);
    }
    }
    public void setResourceDetails(ResourceTO vo)
    throws ResourceException {
    try {
    session.setResourceDetails(vo);
    } catch (RemoteException ex) {
    throw new ResourceException(...);
    }
    }
    public void addNewResource(ResourceTO vo)
    throws ResourceException {
    try {
    session.addResource(vo);
    } catch (RemoteException ex) {
    throw new ResourceException(...);
    }
    }
    // all other proxy method to session bean
    ...}

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...