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

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

Enterprise Flex RIA 해부(16) : 모델

한빛미디어

|

2008-10-27

|

by HANBIT

10,770

제공 : 한빛 네트워크
저자 : Tony Hillerson
역자 : 이대엽
원문 : Anatomy of an Enterprise Flex RIA Part 16: The Models

이 애플리케이션에는 BookieModel과 AdminModel로 두 가지 모델이 있다. 모델은 데이터를 보관하는 역할만 한다. 그러나 모델은 보다 복잡해져 모델에 보관된 데이터에 작용하는 API로서 일련의 메서드를 노출할 수도 있다. [그림 20]은 Bookie의 두 모델을 보여준다.

Cairngorm 애플리케이션에서의 모델의 역할은 뷰의 내용을 결정하는 데이터를 보관하는 것이다. 애플리케이션의 컨트롤러는 FrontController를 통해 접근하는 명령이며, 서비스에 접근하는 것과 같이 데이터를 모델에 사용할 수 있는 형태로 만들기 위한 일을 수행한 다음 모델의 데이터를 변경한다. 일반적으로 뷰는 모델의 데이터에 "바인딩"되어 Flex의 뛰어난 바인딩 메커니즘을 통해 자동적으로 갱신된다. 다음 반복주기에서 다시 한번 뷰의 작동방식을 살펴볼 것이다.


[그림 20] Bookie의 두 모델

일반적으로 모델은 단순하다. BookieModel을 살펴보자:
package lcds.examples.bookie.model
{
 ...
     [Bindable]
     public class BookieModel implements ModelLocator {
이 모델은 ModelLocator를 구현하는데, ModelLocator 인터페이스는 단순히 구현해야 할 메서드가 지정되어 있지 않음을 뜻하는 마커 인터페이스(marker interface)이며 해당 클래스가 어떤 타입인지를 표시하는 역할만 한다. 주의할 점은 클래스도 여느 ActionScript DTO와 같이 [Bindable] 메타 데이터 태그로 어노테이션이 지정되어 있다는 것이다. 이것은 모델의 공개 프로퍼티는 모두 Flex의 바인딩 프레임워크에서 사용할 수 있음을 의미한다.
...
private static var instance:BookieModel;

//상태
public static const SIGNED_OUT:String    = "SIGNED_OUT";
public static const SIGNED_IN:String     = "SIGNED_IN";
public static const BOOKS_CHOSEN:String  = "BOOKS_CHOSEN";

public var currentState:String = SIGNED_OUT;

public var books:ArrayCollection = new ArrayCollection();
public var authors:ArrayCollection = new ArrayCollection();
public var subjects:ArrayCollection = new ArrayCollection();
public var booksToReserve:ArrayCollection = new ArrayCollection();
public var user:Person;
public var loginFailedMessage:String = "";
...
"상태"라는 주석 아래에는 index.mxml라는 Application 뷰의 상태를 제어하는데 사용할 세 개의 고유 문자열 상수가 나열되어 있다. 언제라도 currentState는 이 세 가지 상수 값 중 하나로 설정할 수 있으며 나중에 애플리케이션에서 상태를 정의하는데 이 상수를 어떻게 사용하는지 살펴볼 것이다.

다음으로는 뷰를 제어할 public 프로퍼티를 살펴보자. 우리는 로그인한 사용자에 대한 참조와 모든 책의 목록과 저자, 주제, 책을 모델에 보관할 것이다. loginFailedMessage는 뷰에 바인딩되어 로그인 과정이 실패할 경우의 명령이 설정되는 곳이다.

첫 번째 private 변수는 BookieModel의 정적 인스턴스이며, 이곳에서 싱글톤 패턴(singleton pattern)을 사용할 것이라 알려준다. 모델은 싱글톤으로 만들 필요가 있으므로 애플리케이션에서 해당 객체의 인스턴스는 하나만 존재하도록 보장해야 한다. 이것이 중요한 이유는 모델이 클라이언트의 상태를 나타내므로, 명확히 단일 버전으로 상태가 존재하지 않는다면 제대로 상태를 나타낼 수 없기 때문이다. 아래는 싱글톤 패턴을 구현하는데 필요한 나머지 메서드를 보여준다.
...
         public static function getInstance():BookieModel {
               if (instance == null) instance = 
                    new BookieModel(new ModelInitializer());
               return instance;
          }
  
         public function BookieModel(initializer:ModelInitializer) {
          }
...
    }
}
class ModelInitializer {}
먼저 단일 인스턴스를 반환하는 정적 접근자 메서드를 볼 수 있는데, 이 메서드는 단일 인스턴스가 이미 존재하지 않을 경우 인스턴스를 생성한다. 현재 자바를 비롯하여 생성자를 private으로 만들 수 있는 언어에서는 앞서 설명한 대로 코드를 작성하여 어떤 클래스의 인스턴스를 그 클래스에서만 인스턴스화할 수 있도록 싱글톤 패턴을 적용할 수 있다. 클래스 안의 패키지 블록 바로 아래에서는 ModelInitializer라는 이름의 또 다른 클래스를 정의하고 있는데, 이 클래스는 같은 파일 안에 있지만 패키지 바깥에 위치한 까닭에 모델 클래스에서만 볼 수 있다. 이 같은 방식으로 우리는 다시 한번 모델 클래스만이 자기 자신을 인스턴스화할 수 있게 보장할 수 있다.
...
public function initialize():void {
     books = new ArrayCollection();
     authors = new ArrayCollection();
     subjects = new ArrayCollection();
     booksToReserve = new ArrayCollection();
     user = null;
     loginFailedMessage = "";
}

public function getReservedTillDate(reservedOn:Date):Date {
     var millisecondsPerWeek:int = 1000 * 60 * 60 * 24 * 7;
     // 책을 2주 동안 대여함
     var reservedTill:Date = new Date(reservedOn.getTime() + (2*millisecondsPerWeek));
     return reservedTill;
}
...
다음으로 몇몇 도우미 메서드를 볼 수 있는데, 하나는 모델에서 보관하고 있던 데이터를 모두 제거하여 모델을 초기화하는 것이며, 또 다른 하나는 책을 대여할 때 대여 기간을 "~까지 대여"로 사용하도록 2주 후의 시간을 계산하는 것이다.

다음 기사에서는 Flex Unit을 이용하여 어떻게 Flex를 단위테스트 할 수 있는지 알아볼 것이다. 언제나 전체 기사는 여기에서 확인해 볼 수 있다.
TAG :
댓글 입력
자료실

최근 본 상품0