메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

Enterprise Flex RIA 해부(14) : 서비스와 위임

한빛미디어

|

2008-10-22

|

by HANBIT

9,145

제공 : 한빛 네트워크
저자 : Tony Hillerson
역자 : 이현수
원문 : Anatomy of an Enterprise Flex RIA Part 14: Services and Delegates

지난 기사에서 우리는 Cairngorm에 대해 살펴보았고, 프로그램에서 Cairngorm의 역할에 대해서 알아보았다. Enterprise Flex RIA 분석 시리즈 중, 이번 기사에서는 Cairngorm의 업무위임과 어떻게 Flex에서 서비스 지향 아키텍처를 구현 하는지 알아볼 것이다.

서비스와 위임

ServiceLocator 와 Bookie에 대한 위임클래스들은 서비스를 호출하기 위한 Flex 측의 종단점이다. [그림 18]은 ServiceLocator와 위임클래스들의 소스상 위치를 나타낸다


[그림 18] ServiceLocator와 Bookie에 대한 위임클래스의 위치

Bookie 에 대한 ServiceLocator 정의는 매우 간단하고 선언적이다 :


    
         
     
     
     
     
     

각각의 태그들은 LCDS(LiveCycle Data Services) 설정파일에 정의된 목적지를 지정하고 있다 : 어셈블러에 맵핑된 DataService들에 대한 data-management-config.xml, lcds.examples.bookie.service.BookSearchExample를 지정하고 있는 원격객체에 대한 remoteing-config.xml. 다음으로 위임클래스들로부터 서비스에 대한 참조를 어떻게 얻을 수 있는지 알아볼 것이다.

Bookie에는 프로그램의 각 부분에 필요한 서비스 호출에 상응하는 BookieDelegate와 AdminDelegate 두 개의 위임클래스가 있다. 위임 클래스는 단순하다. 그리고 주로 서비스 계층의 변경에 대한 완충 역할을 한다

Data service들과 원격객체를 사용하는 BookieDelegate를 살펴보자 :
 
package lcds.examples.bookie.business {
 ...
     public class BookieDelegate {
  ...
           private var responder:IResponder;
           private var bookSearchService:RemoteObject;
           private var subjectService:DataService;
           private var personService:DataService;
           private var reservationService:DataService;
           private var services:ServiceLocator =
                      ServiceLocator.getInstance();
  
           public function BookieDelegate(responder:IResponder=null) {bookSearchService =
                     services.getRemoteObject("bookSearchService");
                 subjectService =
                     services.getDataService("subjectDataService");
                 personService =
                     services.getDataService("personDataService");
                 reservationService =
                     services.getDataService("reservationDataService");
                 this.responder = responder;
            }
  ...
첫 번째로 생성자는 아래와 같은 응답 인터페이스를 인자로 받는다.
 
public interface IResponder {
     function result(data:Object):void;
     function fault(info:Object):void;
}
위임클래스를 호출하는 각각의 command는, 어떠한 서비스 호출 시 콜백으로 호출되어지는 인터페이스를 구현한다(서비스 호출이 정상적으로 처리될 경우 호출되는 result 메서드와 서비스 호출의 행방이 묘연해질 경우 호출되는 fault 메서드)

각각의 command는 자신의 위임 클래스의 인스턴스화에 대한 책임이 있고, 위임 클래스는 응답 인터페이스에 대한 참조를 유지하게 된다. 또한 위임클래스는 생성자 내에서 모든 서비스에 대한 참조를 설정한다.
 
...
public function findPersonByCardNumber(cardNumber:String):void {
     var call:AsyncToken = bookSearchService.findPersonByCardNumber(cardNumber);
     call.addResponder(responder);
}
다음으로, 위임클래스를 호출하는 findPersonByCardNumber 예제를 살펴본다. 이 메서드는 원격객체 bookSearchService 상에 String 타입의 cardNumber를 인자로 받는 동일한 이름의 메서드를 호출하고, 호출에 대한 핸들러 역할을 하고 등록된 응답 인터페이스 호출을 위한 AsyncToken을 반환한다. Token의 addResponder를 통해 응답인터페이스를 등록한다. 호출에 대한 결과에 따라 응답인터페이스의 result 메서드나 fault 메서드가 호출된다.

Flex가 원격객체상에서 findPersonByCardNumber 메서드를 호출하는 메서드가 있다는 것을 어떻게 알게될까? 엄밀히 말하면 Flex가 알고 있는 것이 아니고, 그렇기 때문에 코드상에서 철자가 틀린 경우 런타임 예외가 발생할 것이다. 실제로 원격객체의 메서드를 호출하면 원격객체의 목적지 설정을 통해 지정된 객체의 원격객체 메서드와 동일한 이름의 메서드가 호출 된다. 이것은 원격객체가 오브젝트 상에 존재하지 않는 메서드 호출을 처리할 수 있는 flash.utils.Proxy의 서브클래스이기 때문에 가능하다. 마치 마법처럼 보이지만 훌륭하게 작동되며 웹서비스나 XML을 직접 처리하는 것 보다 훨씬 나아 보인다. 이제 DataService 호출에 대해 살펴보자 :
 
...
public function getAllSubjects(collection:ListCollectionView):void {subjectService.fill
                                                                    (collection);
}
...
위임클래스에 위치한 이 메서드는 매우 단순하다. 그렇지 않은가? 이것이 LCDS(LiveCycle Data Services) 이다. 우리가 할 일은 컬렉션으로 데이터를 넘기고 data service 객체에 있는 fill 메서드를 호출하는 것 뿐이다. 나머지 과정은 자동으로 진행된다. 이제 컬렉션은 관리되어지고 Dataservice의 기본 기능인 auto-sync 기능을 활성화 해두었기 때문에 컬렉션 상의 변경(아이템의 추가 또는 삭제)이 일어날 때 마다 어셈블러가 감싸고 있는 세션빈을 통해 어셈블러로 통보되고 데이터베이스에 저장될 것이다.

각각의 예를 위해 코드 샘플 상의 원격객체 서비스들은 DataService들과 혼재되어있다는 것을 기억해야 한다. 대부분의 “객체 저장”과 같은 유즈케이스에는 DataService이 적당하다는 것을 볼 수 있다. 그리고 POJO와의 통신과 연관된 유즈케이스에는 RemoteObject가 적당하다.

원격객체인 BookSearchService의 메서드를 호출하는 BookieDelegate의 위임 메서드들을 정리해보면 다음과 같다 :
  • findPersonByCardNumber
  • findBooksByAuthor
  • findBooksByTitle
  • findBooksBySubject
BookieDelegate와 AdminDelegate에 있는 다른 메서드들도 다양한 DataService들을 사용한다. BookSearchService엔 DataService에서 제공 되는 것과 동일한 역할을 하는 메서드들을 남겨놓았다. 원격객체와 DataService 간의 변경 실험도 마음껏 해볼 수 있다.

다음 기사에선 마이크로-아키텍쳐(Cairngorm)의 핵심인 Cairngorm command 가 프로그램에 어떻게 자리하게 되는지 볼 것이다. 여기를 클릭하면 전체 시리즈(영문)를 볼 수 있다.
TAG :
댓글 입력
자료실

최근 본 책0