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

한빛출판네트워크

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

IT/모바일

Enterprise Flex RIA 해부(19) : 사용자 영역 - 검색 절차

한빛미디어

|

2008-11-10

|

by HANBIT

11,132

제공 : 한빛 네트워크
저자 : Tony Hillerson
역자 : 임성진
원문 : Anatomy of an Enterprise Flex RIA Part 19: User Section: The Search Process

지난 기사에서는 애플리케이션의 뷰와 레이아웃을 살펴보았으며, 지금부터는 애플리케이션에 제공하는 검색 도구를 살펴볼 것이다.

Cairngorm 애플리케이션이 어떻게 동작하는지를 알게 된다면, 사용자 영역의 나머지 부분은 꽤 간단하다. 나는 사용자 영역을 TabNavigator에 연속적인 패널로 구성하여 사용자가 직접 사용할 검색 유형을 고를 수 있게 하였다.


[그림 24] 저자로 검색

TitleSearch나 BookSearch, 또는 AuthorSearch 탭을 열면 해당 탭이 SearchPanel을 확장하고 있으며, 검색할 때마다 검색 유형에 따라 각기 다른 인자를 전달하면서 SearchPanel.findBooks를 호출한다는 것을 알게 될 것이다. SubjectSearch.mxml을 예로 살펴보자.

    
    ...
    private function showAll():void {
          new GetAllSubjectsEvent().dispatch();
     }
    
    private function subjectSearch():void {
          new FindSubjectsByNameEvent(subjectName.text).dispatch();
          clearSearches();
     }

    private function findBooksBySubject():void {
          findBooks(
               SearchEvent.SUBJECT_SEARCH_TYPE,
               subjectList.selectedItem);
     }
    
...
먼저, 루트 태그가 SearchPanel이라는 점을 눈여겨 봐야 하는데, 이는 우리가 SearchPanel을 확장하고 있음을 의미한다. 그리고 몇 가지 뷰에 사용되는 메서드도 있는데, showAll은 GetAllSubjectsEvent 이벤트를 발생시키면서 모든 주제를 찾는다. subjectSearch 메서드는 주제 검색 텍스트 상자의 텍스트를 전달하면서 FindSubjectsByNameEvent를 실행한다. 이 명령 중 하나가 주제 목록을 반환하면, 그것은 뷰의 목록과 바인딩되어 있는 모델로 들어간다. findBooksBySubject 메서드는 부모 메서드인 findBooks 메서드를 호출하는데, 이 메서드는 뷰 체인에서 발생하여 책 검색을 수행하는 이벤트에 주제를 전달한다. 위에서 설명한 findBooks 메서드와 관련된 코드도 살펴보겠지만, 우선 여기서는 SubjectSearch 코드의 나머지 부분을 먼저 살펴보기로 하자.
...
    
    
    
         
         
         
    

여기에는 앞서 언급했던 subjectList도 있는데, 이 리스트는 명령이 서비스에서 주제 컬렉션을 찾을 경우 해당 주제 컬렉션과 바인딩된다. 그리고 그 아래에는 찾을 주제명을 받아들이는 텍스트 입력 상자와 몇몇 버튼이 나열되어 있다. searchButton은 우리가 앞에서 보았던 subjectSearch 메서드를 호출할 것이며, 검색을 보다 안전하게 하기 위해 검색 텍스트 입력상자에 입력된 내용이 없을 경우 버튼을 사용할 수 없게 하였다. searchAllButton은 showAll 메서드를 호출할 것이고, findBooksButton은 "find books" 메서드를 호출한다. 또한 주제 목록에 선택된 항목이 없는 경우에도 Find 버튼을 사용할 수 없게 하였다.

이제 SearchPanel로 이어지는 체인을 살펴보자.

    
         [Event(name="bookSearch",
              type="lcds.examples.bookie.event.SearchEvent")]
    

    
         
findBooks 메서드는 검색 유형과 검색 데이터를 받아들인다. 이 두 프로퍼티는 검색 유형이 저자 검색인지 주제 검색인지, 또는 제목 검색인지 확인하는 것을 돕는다. 그런 다음 메서드는 검색 유형과 입력내용이 담긴 SearchEvent 이벤트를 디스패치(dispatch)한다. 페이지 상단의 Metadata 태그는 여기에서 이 이벤트 타입을 내보낼 것임을 컴파일러에 알린다.
...
private function searchBooks(searchEvent:SearchEvent):void {
     new FindBooksEvent(searchEvent).dispatch();
}
...



... 
각 검색 패널로부터 디스패치된 bookSearch 이벤트는 index.mxml의 searchBooks 메서드로 보내지는데, searchBooks 메서드에서는 FindBooksCommand에 대응되는 BookieController상의 이벤트를 디스패치하며, FindBooksCommand의 execute 메서드는 수행해야할 검색 유형을 알아내어 적절한 위임 메서드를 호출한다:
    public class FindBooksCommand implements ICommand, IResponder {
  
           public function execute(event:CairngormEvent):void {
                 var evt:FindBooksEvent = event as FindBooksEvent;
                 var searchData:SearchEvent = evt.searchEvent;
                 var delegate:BookieDelegate = 
                      new BookieDelegate(this);
   
                 switch(searchData.searchType) {
                       case SearchEvent.AUTHOR_SEARCH_TYPE :
                            delegate.findBooksByAuthor(
                                 Person(searchData.searchData));
                       break;
                       case SearchEvent.TITLE_SEARCH_TYPE :
                            delegate.findBooksByTitle(
                                 String(searchData.searchData));
                       break;
                       case SearchEvent.SUBJECT_SEARCH_TYPE :
                            delegate.findBooksBySubject(
                                 Subject(searchData.searchData));
                       break;
                  }
            }
  
           public function result(event:Object):void {
                 BookieModel.getInstance().books = event.result;
            }
  ...
FindBooksCommand의 result 메서드는 단순히 현재 책 컬렉션을 적절한 모델 프로퍼티인 books에 에 설정하기만 한다. lcds.examples.booke.view.BookList를 열어 보면 주요 DataGrid의 dataProvider 프로퍼티가 BookieModel.books로 설정되어 있음을 알 수 있을 것이다. 바인딩은 그것이 얼마나 단순한지와 개발을 얼마나 편하게 해주는지에 대해 계속해서 나를 놀라게 한다.

예약 과정을 살펴보고 그것의 동작 방식을 이해할 수 있을지 확인해 보라. 책을 선택하는 과정은 lcds.examples.bookie.view.BookList에서 시작되며, 예약 과정의 경우에는 lcds.examples.bookie.view.ReserveBooksPanel에서 시작된다.

다음 연재에서는 애플리케이션의 관리자 영역을 살펴봄으로써 연재를 마치도록 하겠다. Flex와 LiveCycle Data Servces의 관리 데이터(managed data)를 살펴보고 LiveCycle Data Services를 통해 JMS에서 Flex로의 서버 푸시(server push)가 어떻게 작동하는지 살펴보기 바란다.

언제든 전체 연재 기사는 여기에서 확인해 볼 수 있다.
TAG :
댓글 입력
자료실

최근 본 상품0