TN_1111: TechNote 1111 하향식(top-down) 방식 시스템 디자인
Bill Gibson, 프로그램 관리자
Microsoft Corporation
적용 대상 :
Microsoft Visual Studio 2005 Team System
여기에서는 시스템 디자이너를 사용하여 하향식(top-down) 방식으로 시스템을 디자인하는 방법을 설명합니다.
소개
Visual Studio Team Edition for Software Architects에서는 시스템 디자이너는 기존의 응용 프로그램이나 시스템에서 상향식(bottom-up)으로 시스템을 조립하는 디자인 대상으로 최적화됩니다. 다만, 하향식(top-down) 방식 시스템 디자인도 의미있는 아키텍처 디자인 방법의 한가지입니다. 하향식(top-down) 방식 디자인을 사용하는 경우, 시스템 아키텍트는 우선, 시스템 전체적인 동작을 기술한 후 서서히 하부구조나 응용 프로그램의 개별 디자인을 진행합니다. 그리고 시스템 동작의 각 요소를 이러한 시스템 멤버에 매핑합니다. 최종적으로 시스템의 모든 동작을 구현 예정 또는 이미 구현된 응용 프로그램에 매핑합니다. 이 프로세스를 사용하면, 레벨 수의 제한 없이 하부구조를 정의할 수 있습니다.
하향식(top-down) 방식 디자인은 시스템 디자이너의 초기 출시에는 중요한 시나리오는 아니었지만, 하향식(top-down) 즉 "부분화(decomposition)" 방식이 지원됩니다. 시스템에 직접 끝점(endpoint)을 추가하여, 다음에 동작을 멤버 시스템이나 응용 프로그램의 끝점(endpoint)에 위임할 수 있는 것이 이상적입니다. 그러나, Visual Studio 2005에서는 멤버 시스템이나 응용 프로그램의 기존 끝점에 대한 "프록시 끝점 " 으로서 상향식(bottom-up)에서 끝점을 추가하여 시스템 끝점을 작성할 수 있습니다. 다만, 잘 알려지지 않은 기능을 사용하면, 쉽게 이 제한을 극복하고, 시스템을 하향식(top-down) 방식으로 디자인할 수 있습니다. 또, 이 방식에 의해, 어떻게 반복적이고 유연하게 프로세스를 사용할 수 있는지 확인할 수 있습니다. 하향식(top-down) 방식과 워터 폴 프로세스를 혼동하지 않도록 해 주세요.
하향식(top-down) 방식 소개
하향식(top-down) 방식 디자인은 매우 합리적입니다. 우선, 시스템과 시스템의 동작을 정의하여, "그림자" 응용 프로그램을 작성합니다. 이 응용 프로그램을 시스템에 포함해 프록시 끝점(endpoint)을 사용하여 시스템에서 이 응용 프로그램의 끝점을 모두 공개합니다. 이것으로 필요에 따라서 이 시스템은 다른 상위시스템 내에 포함되어 접속할 수 있게 됩니다. 시간을 들여, 시스템을 어떻게 구현하는지를 정의하는 과정에서 저수준 하부구조 또는 응용 프로그램을 정의하여 포함하고, 단계적으로 시스템 끝점의 동작을 그림자 응용 프로그램 대신, 이러한 멤버 위의 끝점에 위임합니다. 이 방법을 재귀적으로 사용하여 새로운 시스템을 작성하여, 레벨 수의 제한없이 시스템을 중첩하여, 하향식(top-down) 방식으로 디자인을 점차적으로 개선할 수 있습니다.
위임 재할당
시스템은 그 멤버의 구성에 지나지 않습니다. 시스템의 끝점은 멤버의 동작을 공개하기 위해 존재하고, 이것은 시스템 끝점을 멤버 끝점에 위임하는 것으로 표현됩니다. 이 때문에 시스템 끝점은 프록시 끝점으로 불립니다. 하향식(top-down) 방식 디자인은 프록시 끝점을 가지고 다른 멤버 끝점으로 매핑을 가능하게 하는 기능을 합니다. 이 기능에 의해, 한번의 조작으로 프록시 끝점 위임을 멤버 끝점에서 다른 멤버 끝점으로 이동할 수 있습니다. 위임를 삭제하고 다시 추가해도 같은 결과를 얻을 수 있지만, 위임를 삭제하면 프록시 끝점도 삭제되어 버립니다. 이 조작의 영향은 멤버로서 편집중 시스템을 포함한 시스템 내에 파급됩니다. 이 시스템에서 문제의 끝점에의 접속과 위임 및 이 끝점의 프록시가 모두 삭제됩니다. 위임의 이동 기능을 사용하면, 이러한 파급효과는 없고, 하향식(top-down) 방식 디자인은 실용 가능한 방법입니다.
예를 사용한 안내서
이 이후는 하향식(top-down) 방식 디자인의 예를 사용한 안내서를 보여주고, 위임의 이동 기능을 사용하는 방법을 설명합니다. 이 예에서는 우선 상위의 옥션 시스템을 작성하여, 시스템 끝점으로 공개되는 그 중요한 동작의 일부를 기술합니다. 이 옥션 시스템 하부구조로서 입찰 시스템을 추가하고, 한층 더 입찰 시스템에서 입찰 응용 프로그램 정의로 진행됩니다. 이 입찰 응용 프로그램에는 Web 서비스와 입찰 저널 데이터베이스를 준비하고, 입찰 시스템 동작을 구현합니다.
우선, 옥션 시스템을 정의합시다. 솔루션 탐색기에서 직접 새로운 시스템 다이어그램을 추가하는 것으로 이것은 작성할 수 있습니다. 다만, 이 시스템 내에 응용 프로그램을 작성 해야 하기때문에 응용 프로그램 디자이너를 사용하여 먼저 응용 프로그램을 작성한 후 시스템을 추가하기로 하겠습니다. 이부분은 간단합니다. 응용 프로그램 디자이너로 ASP.NETWebService 프로토타입을 다이어그램에 드래그하여, ASP.NETApplication 를 추가하고, AuctionSystem_shadow 라는 이름을 붙입니다. 또, 기본값의 Web 서비스 끝점 이름을 Bidding 으로 변경합니다. 다음에 옥션 시스템이 공개하는 다른 동작을 지원하기 위해, 추가의 Web 서비스 끝점을 각각 Buyers, Sellers 및 Administration 이라는 이름으로 추가합니다. 이것으로 각 끝점의 동작을 정의할 수 있습니다. 이 시점의 응용 프로그램 상태는 다음과 같습니다.
.jpg)
그림 1. 응용 프로그램 다이어그램 위의 옥션 시스템 그림자 응용 프로그램
Bidding 끝점에 Bid 라는 형식의 입력 매개 변수 NewBid 를 가지는 조작 SubmitBid 를 추가합니다. 이것은 형식 BidAcknowledgement 를 반환합니다. 이 단계에서는 이름만을 붙이고, 형식 자체는 정의하지 않는 것에 주의해 주세요. 상세한 형식 정의는 코드를 생성할 경우에만 필요합니다. 다른 조작도 추가할 수 있지만, 이 예에서는 이 조작 하나로 충분합니다. 시스템 디자인을 진행하기 전에 조작을 정의하지 않아도 괜찮습니다. 실제, 끝점의 동작은 이 프로세스 어디에서도 정의할 수 있습니다. 일반적으로는 가급적 작성하는 그림자 응용 프로그램의 수가 적어지도록 합니다. 이러한 응용 프로그램은 시스템 끝점을 기술하기 위한 개체 틀로서만 존재합니다. 그림자 응용 프로그램의 동작이 저수준의 하부구조나 응용 프로그램에 마이그레이션 되면, 그림자 응용 프로그램은 삭제됩니다. 다만, 그림자 응용 프로그램은 시스템 사양을 최신 상태로 유지하도록 끝점 정의를 추가, 삭제 또는 업데이트 하고, 디자인 프로세스 내에 필요한 만큼 업데이트를 할 수 있습니다.
다음은 그림자 응용 프로그램을 선택하여, [Design Application System] 을 클릭합니다. 대화상자로 새로운 시스템에 AuctionSystem 이라는 이름을 붙입니다. 생성된 시스템 다이어그램에서 AuctionSystem_shadow 의 각 끝점을 참조하여, 프록시 끝점을 AuctionSystem 에 추가합니다. 거기에는 각 끝점에서 시스템 경계에 위임선을 드래그 하거나, 각 끝점을 오른쪽 클릭하여 [add a proxy endpoint] 를 클릭합니다. 이 단계의 AuctionSystem 상태는 다음과 같습니다.
.jpg)
그림 2. 프록시 끝점이 그림자 응용 프로그램에 위임된 상태의 옥션 시스템
상위시스템이 정의되어 그 동작의 일부가 기술되는 것을 알 수 있습니다. 다음 다이어그램에서는 옥션 시스템 구현을 정의하지 않아도 이 시스템을 보다 상위의 시스템에 포함하여, 소비자를 시스템이 제공하는 끝점에 접속하게 하는 모습이 보여줍니다.
.jpg)
그림 3. 다른 시스템 문맥에 기본 제공되는 옥션 시스템
다음 단계는 옥션 시스템에서 이것을 어떻게 구현하는지 기술합니다. 이것은 단계적, 반복적으로 실행 가능합니다. 따라서 워터 폴 방식으로 작업을 진행할 필요는 없습니다. 실제로 이 예에서는 가능하면, 여기까지 작업한 상태로 충분히 SubmitBid 동작의 완전한 구현으로 진행될 수도 있습니다.
시스템을 개선하여, 다음 수준의 부분화(decomposition)를 정의할 수 있는 상태가 되면, 동작을 시스템 그림자 응용 프로그램에서 다른 응용 프로그램으로 "마이그레이션" 합니다. 이러한 응용 프로그램은 구현하거나, 하위 시스템 그림자 응용 프로그램으로서 사용하는 응용 프로그램입니다. 동작은 다음 순서로 마이그레이션 합니다.
응용 프로그램 다이어그램에서 동작이 마이그레이션되는 응용 프로그램을 작성하고 참조합니다. 적절한 끝점을 복사하여 붙이기, 끝점 복사를 새로운 응용 프로그램에 추가합니다. 시간을 들여 단계적으로 끝점을 마이그레이션 하기 위해, 한 번에 모든 끝점을 마이그레이션 할 필요는 없습니다. 따라서 시스템 일부는 상세하게 정의하고, 다른 부분에 대해는 상위의 정의만으로 가능합니다.
따라서 이 예에서는 위의 순서로 BiddingSystem_shadow 응용 프로그램을 추가하여, 이것에 Bidding 끝점을 복사합니다. 이 시점에서 응용 프로그램 다이어그램에는 다음 두가지 응용 프로그램이 작성됩니다.
.jpg)
그림 4. 응용 프로그램 다이어그램의 두가지 그림자 응용 프로그램
다음에 BiddingSystem_shadow application 를 선택하고, 앞에서 AuctionSystem 을 작성한 것과 같은 방법으로 BiddingSystem 을 작성합니다. 생성된 시스템 다이어그램에서 Bidding 끝점을 프록시 끝점으로 공개합니다.
.jpg)
그림 5. 그림자 응용 프로그램을 갖춘 입찰 시스템
다음은 AuctionSystem 다이어그램으로 돌아와서, [System View] 창이 열리지 않은 경우는 이것을 엽니다. 이 윈도우에는 옥션 시스템에 포함할 수 있는 솔루션내의 응용 프로그램과 시스템이 모두 목록으로 표시됩니다. [Systems] 노드 아래에 있는 BiddingSystem 을 찾아내 AuctionSystem_shadow 응용 프로그램의 피어로서 시스템 다이어그램에 드래그 합니다. 이 시점에서 AuctionSystem은 다음 이미지와 같습니다. AuctionSystem 의 모든 동작이 AuctionSystem_shadow 와 Bidding 이라는 끝점을 한가지는 미접속의 멤버 BiddingSystem 에 전달됩니다. 여기서 BiddingSystem 의 Bidding 끝점을 선택하여 [View Operations] 를 클릭하면, AuctionSystem_shadow 의 Bidding 끝점과 같이, NewBid 조작이 정의된 것을 확인할 수 있습니다.
.jpg)
그림 6. 옥션 시스템에 기본 제공되는 입찰 시스템
그럼, 위임 이동 기능을 사용하여 위임을 재할당하여, 입찰 서비스의 소비자가 새로운 BiddingSystem 에 위임 되도록 합니다. 마우스를 AuctionSystem 의 Bidding 끝점으로 이동하여, Alt 키를 누르면서 새로운 위임 선을 BiddingSystem 의 Bidding 끝점에 드래그 합니다. 1 단계로 그림자 응용 프로그램에의 위임이 삭제되어 하위 시스템 Bidding 끝점에의 위임으로 옮겨졌습니다.
.jpg)
그림 7. 입찰 시스템에 위임된 Bidding 끝점이 있는 옥션 시스템
이 시점에서 그림자 응용 프로그램을 정리하여, Bidding 끝점을 삭제할 수 있습니다. BiddingSystem 의 구현을 기술할 수 있을 준비되면, 같은 프로세스를 다시 실행합니다. Web 서비스와 Web 서비스를 통해서 밖에 액세스 할 수 없는 데이터베이스를 포함한 ASP.NETWebApplication 를 사용하고, 입찰 시스템을 구현합니다. 이 예에서는 기존의 그림자 응용 프로그램을 구현의 기초로서 사용할 수 있으므로 그림자 응용 프로그램의 이름을 BiddingManager 로 변경하여, 외부 BidHistory 데이터베이스를 추가하고, 이것을 BiddingManager 에 접속하는 것만으로 충분합니다. 이 응용 프로그램 이름의 변경은 응용 프로그램 다이어그램과 시스템 다이어그램의 양쪽 모두로 실시할 필요가 있습니다. 다음에 데이터베이스를 Bidding 시스템에 추가하고, 이것을 BiddingService 응용 프로그램에 접속합니다. 시스템 위의 데이터베이스 접속 끝점을 공개하지 않는 것으로 이 데이터베이스를 BiddingSystem 의 사적인 데이터베이스로 하고 있습니다. 이 시점에서 일반적으로 응용 프로그램을 구현하기 전에 응용 프로그램 디자이너를 사용하여 응용 프로그램의 상세한 부분을 조정합니다. 완성한 BiddingSystem 는 다음 이미지와 같습니다. BiddingSystem은 AuctionSystem 내에서 위임된 채로 AuctionSystem은 EnterpriseSystem 내에서 접속됩니다.
.jpg)
그림 8. 완성한 입찰 시스템 구성
이 시점에서 이러한 시스템 정의에 따라서 EnterpriseSystem 가 배포되는 경우는 위임과 접속이 모두 해결되어 AuctionPortal 응용 프로그램이 BiddingManager 에 접속하도록 구성됩니다.
그림자 응용 프로그램의 구현
이 방식의 응용으로서 흥미로운 사용법은 간단한 스텁 아웃(stubbed-out)된 동작을 갖춘 그림자 응용 프로그램을 구현입니다. 이것에 의해, 시스템 구현 디자인의 세부를 확정하기 전에 시스템 소비자의 테스트를 어느 정도 실행할 수 있습니다. 이와 같이 하여, 하향식(top-down) 방식 디자인을 실시하는 경우에서도 agile 프로그래밍을 채용할 수 있습니다.
요약
시스템 디자이너를 사용하여 하향식(top-down) 방식으로 디자인하여, 하부구조와 응용 프로그램을 사용하고, 시스템 구현을 단계적으로 디자인할 수 있습니다. 여기서 중요한 것은 위임을 재할당할 수 있는 기능입니다. 이 기능을 이용하여 먼저 시스템수준에서 동작을 정의한 후 이 시스템을 구현하는 응용 프로그램에 동작을 마이그레이션 할 수 있습니다.