[Windows Programming/Prism] - [Prism] 들어가며...

[Windows Programming/Prism] - [Prism] 1. Introduction


잘못 작성되어 있는 부분이나 매끄럽지 않은 부분 대해서 Feedback을 주시면 반영토록 하겠습니다. 감사합니다.


2: Initializing Applications Using the Prism Library 5.0 for WPF 


 이 주제는 WPF 응용프로그램이 동작하기 위해 Prism을 취하는데 필요한 것이 무엇인지 언급합니다. 응용프로그램의 시작시 Prism 응용프로그램은 등록과 설정을 필요로 합니다 - 이는 응용프로그램을 부트스트래핑 하는 것으로 알려져 있습니다. Prism 부트스트랩 절차는 모듈 카탈로그를 만들고 설정, Unity같은 의존성 주입 컨테이너를 생성, UI구성에 대한 기본 리전 어댑터를 구성, 쉘 뷰를 만들고 초기화, 그리고 모듈들을 초기화하는 것을 포함하고 있습니다.


부트스트래퍼란? (What Is a Bootstrapper?)

 부트스트래퍼는 Prism 라이브러리를 사용하여 구축된 응용프로그램의 초기화를 담당하는 클래스 입니다. 부트스트래퍼를 사용함으로써, Prism 라이브러리 구성요소가 당신의 응용프로그램에 연결되는 방법을 더 잘 다룰 수 있습니다. (you have more control of how the Prism Library components are wired up to your application.) Prism 라이브러리는 어느 컨테이너와도 사용하기 위해 특화 될 수 있는 기본적인 추상 부트스트래퍼 기초 클래스(abstract Bootstrapper base class)를 포함하고 있습니다. 부트스트래퍼 클래스들의 메서드들의 상당수는 가상 메서드 입니다. 당신은 사용자 정의 부트스트래퍼 구현에 적절하도록 이 메서드들을 오버라이드(override) 할 수 있습니다.



Basic stages of the bootstrapping process

[ 부트스트래핑 절차의 기본 단계 (Basic stages of the bootstrapping process) ]



 Prism 라이브러리는 부트스트래퍼로 부터 파생되어 대부분의 응용프로그램에 적합한 기본적인 구현체들 가지고 있는 몇가지 추가 기본 클래스들을 제공합니다. 당신의 응용프로그램 부트스트래퍼를 위해서 구현까지 남은 유일한 단계들은 쉘을 만들고 초기화 하는 것입니다.


의존성 주입 (Dependency Injection)

 Prism 라이브러리로 개발된 응용프로그램은 컨테이너가 제공하는 의존성 주입을 필요로 합니다. 라이브러리는 Unity Application Block (Unity) 또는 Mananged Extensibility Framework (MEF)와 동작하는 어셈블리들을 제공하며, 이는 당신이 다른 의존성 주입 컨테이너들을 사용 할 수 있도록 합니다.부트스트랩 절차의 일부는 이러한 컨테이너를 설정하고 컨테이너와 함께한 형식을 을 등록하는 것 입니다. Prism 라이브러리는 UnityBootStrapper 와 MefBootstrapper 클래스를 포함하며, 이들은 당신의 응용프로그램에서 의존성 주입 컨테이너로써 Unity나 MEF를 사용하는데 필요한 대부분의 기능이 구현되어 있습니다. 이전의 그림에서 보여주는 단계에 추가하여, 각각의 부트스트래퍼는 그것들의 컨테이너를 특정화하는 몇몇 단계들을 추가 합니다.

쉘 만들기 (Creating the Shell)

 기존의 Windows Presentation Foundation (WPF) 응용프로그램의 경우, 시작 Uniform Resource Identifiuer (URI)는 주 화면을 실행하는 App.xaml 파일에 지정되어 있습니다.


Prism 라이브러리로 만든 응용프로그램은, 쉘이나 주 화면을 만드는 것은 부트스트래퍼의 책임입니다. 쉘은 쉘이 표시되기 전에 등록되어야 하는 ,리전 관리자 같은, 서비스에 의존하기 때문입니다.


주요 결정 (Key Decisions)

응용프로그램에서 Prism 라이브러리를 사용을 결정 한후에, 추가로 결정해야할 몇가지 들이 있습니다.

    • 당신의 의존성 주입 컨테이너를 위해서 MEF, Unity, 혹은 또다른 컨테이너를 사용할지 결정해야 합니다. 이는 당신이 사용할 부트스트래퍼가 어떤것인며 당신이 다른 컨테이너에 대해 부트스트래퍼 작성여부를 결정 할 것입니다.
    • 응용프로그램에서 당신이 원하는 응용프로그램 특정 서비스에 대해서 생각해보아야 합니다. 해당 서비스는 컨테이너에 등록해야 합니다.
    • 내장 로깅 서비스가 당신의 필요에 적합한지 다른 로깅 서비스를 제작하는게 필요한지 결정하세요.
    • 응용프로그램이 어떻게 모듈을 탐색할지 결정하세요: 명시적 코드 선언, 디렉토리 검색을 통해 발견된 코드 속성, 설정, 혹은 XAML

남은 주제들은 좀더 자세한 정보를 제공합니다.


핵심 시나리오 (Core Scenarios)

시작 시퀀스를 작성하는 것은 Prism 응용프로그램 구축에 중요한 한 부분입니다.

이 섹션에서는 부트스트래퍼를 작성하고 쉘을 작성하기 위해 사용자 정의 하는 것, 의존성 주입 컨테이너를 설정,  응용프로그램 수전의 서비스들을 등록, 그리고 모듈을 불러오고 초기화하는 방법에 대해서 설명합니다.


당신의 응용프로그램을 위한 부트스트래퍼 만들기 (Creating a Bootstrapper for Your Application)

Unity나 MEF를 의존성 주입 컨테이너로써 사용을 택했다면, 응용프로그램을 위한 간단한 부트스트래퍼만드는 것은 쉽습니다. MefBootStrapperUnityBootstrapper로 부터 상속한 새로운 클래스를 만들어야 합니다. 그후, CreateShell 메서드를 구현하세요. 선택적으로, 쉘 특정 초기화를 위해 InitializeShell 메서드를 오버라이드 할 수도 있습니다.


CreateShell 메서드 구현하기 (Implementing the CreateShell Method)

CreateShell메서드는 개발자가 Prism응용프로그램의 취상위 윈도우를 지정 할수 있습니다. 쉘은 보통 MainWindowMainPage입니다.

응용프로그램의 쉘 클래스의 인스턴스를 반환하여 이 메서드를 구현하세요. Prism응용프로그램에서, 응용프로그램 요구사항에 따라서 당신은 쉘 객체를 만들거나, 컨테이너로부터 요구사항을 해결 할 수 있습니다.


아래 코드 예제에서 쉘 객체를 해결하기 위해 ServiceLocator를 사용하는 예를 보여줍니다.


protected override DependencyObject CreateShell()
{
    return ServiceLocator.Current.GetInstance<Shell>();
}


Note:

당신은 종종 ServiceLocator가 특정 의존성 주입 컨테이너대신의 타입들의 인스턴스를 해결하는데 사용되기도 하는걸 볼 수 있습니다. ServiceLocator는 컨테이너를 호출 함으로써 구현됩니다, 그래서 컨테이너 사용없는 코드에 대해서 좋은 선택입니다. 당신은 직접 참조할수 있고 ServiceLocator대신 컨테이너를 사용할 수도 있습니다.


InitializeShell 메서드 구현하기 (Implementing the InitializeShell Method)

당신은 쉘을 만든 다음에, 쉘이 표시될 준비가 되었다는 것을 확인하기 위한 초기화 단계를 실행 해야 합니다. 아래에 보이는 것처럼 (from the Modularity QuickStarts for WPF), WPF 응용프로그램을 위해, 당신은 쉘 응용프로그램 객체를 만들고 응용프로그램의 주 윈도우로써 설정할 것입니다.


protected override void InitializeShell()
{
    Application.Current.MainWindow = Shell;
    Application.Current.MainWindow.Show();
}

InitializeShell의 기본적의 구현은 아무것도 하지 않습니다. 기본 클래스 구현을 호출하지 않는 것에 안전합니다.


모듈 카탈로그 작성 및 구성하기 (Creating and Configuring the Module Catalog)

 모듈 응용프로그램을 만드는 중이라면, 모듈 카탈로그를 작성하고 설정해야합니다. Prism은 응용프로그램에 어떤 모듈이 이용가능한 지, 어떤 모듈들이 다운로드 되어야 하는지, 어느곳에 상주해야 하는지에 대한 추적을 유지 위해 구체 IModuleCatalog 인스턴스를 사용합니다. 


 부트스트래퍼는 가상 CreateModuleCatalog 메소드의 기본 구현체뿐만 아니라 카탈로그를 참조할 protected ModuleCatalog 속성을 제공합니다.

기본 구현체는 새로운  ModuleCatalog를 반환해줍니다; 하지만, 대신에 WPF의 빠른 시작을 위해 MEF의 모듈화에서 QuickStartBootstrapper 부터 다음의 코드를 보여주는 것처럼 이 메소드는 다른 IModuleCatalog 인스턴스를 제공하기 위해 재정의 할 수 있습니다.


protected override IModuleCatalog CreateModuleCatalog()
{
    // When using MEF, the existing Prism ModuleCatalog is still
    // the place to configure modules via configuration files.
    return new ConfigurationModuleCatalog()
}

UnityBootstrapper 와 MefBootstrapper class 두개 모두, Run메소드는 CreateModuleCatalog 메소드를 호출하고 반환된 값을 사용하여 클래스의 ModuleCatalog 속성을 설정합니다. (In both the UnityBootstrapper and MefBootstrapper classes, the Run method calls the CreateModuleCatalog method and then sets the class's ModuleCatalog property using the returned value.) 이 메소드를 재정의 한다면, 제공된 기능을 대체 할 것이므로 기반 클래스의 구현체를 호출할 필요가 없습니다. 모듈화에 대한 더 많은 정보는, "Modular Application Development"를 보시기 바랍니다.


컨테이너 작성 및 구성하기 (Creating and Configuring the Container)

컨테이너는 Prism 라이브러리로 만들어진 응용프로그램에서 핵심 역할을 합니다. Prism 라이브러리와 이 위에 작성된 응용프로그램들은 요구되는 의존성들 주입과 서비스들을 위한 컨테이너에따라 달라집니다. (Both the Prism Library and the applications built on top of it depend on a container for injecting required dependencies and services.) 컨테이너 구성 단계에서, 몇몇 핵심 서비스들이 등록되어 있습니다. 핵심 서비스들에 이외에, 구성요소 관한 추가적인 기능을 제공하는 응용프로그램 특정 서비스를 취할 수 있습니다.

핵심 서비스 (Core Services)

다음 표는 Prsim 라이브러리에서 핵심 비 응용프로그램 특정 서비스들을 나열합니다.


 Service Interface

 설명

 IModuleManager

 응용 프로그램의 모듈들을 검색하고 초기화하는 서비스를 위한 Interface를 정의합니다.

 IModuleCatalog 

 응용프로그램에서의 모듈에 대한 메타 데이터를 포함합니다. Prism 라이브러리는 여러가지 다른 카탈로그들을 제공합니다.

 IModuleInitializer 

 모듈들을 초기화 합니다.

 IRegionManager 

 배치를 위한 시각적 컨테이너인 리전들을 등록하고 검색합니다.

 IEventAggregator 

 발행자와 구독자사이의 느슨한 결합인 이벤트들의 모음(collection)입니다.

 ILoggerFacade 

 로깅 메카니즘에 대한 래퍼입니다. 그래서 당신이 가진 로깅 메카니즘을 선택할 수 있습니다. 당신의 로거(logger)를 사용하  는 방법의 예로써, 주식 거래 참고 구현 (Stock Trader RI)가 EnterpriseLibraryLoggerAdapter class를 통해서 Enterprise  Library Logging Application Block을 사용합니다. CreateLogger 메소드가 반환한 값을 사용하는 부트스트래퍼의 Run메소드  의해서 로깅 서비스는 컨테이너에 등록됩니다.

 컨테이너와 함께 다른 로거(logger)를 등록하는 것은 동작하지 않을 것입니다; 대신 부트스트래퍼의 CreateLogger 메소드를  재정의 하십시요.

 IServiceLocator 

 Prism 라이브러리가 컨테이너에 접근토록 합니다. 라이브러리를 사용자 정의 혹은 확장하고 싶을 경우 유용할 수 있습니다.


응용프로그램 특정 서비스 (Application-Specific Services)

 다음 표는 Stock Trader RI에서 사용되는 응용프로그램 특정 서비스들을 나열하고 있습니다. 당신의 응용프로그램에서 제공할 서비스들의 타입들을  이해하기위한 예로써 사용할수 있습니다.


 Services in the Strock Trader RI

 설명

 IMarketFeedService

 실시간 (모의) 시장 자료를 제공합니다. PositionSummaryViewModel 은 이 서비스로부터 수신한 알림에 기초하여 화면 위치를 갱신합니다.

 IMarketHistoryService

 선택한 기금에 대한 추세선을 표시하는데 사용되는 역사적인 시장 자료를 제공합니다.

 IAccountPositionService

 포트폴리오 내의 펀드 목록을 제공합니다.

 IOrdersService

 제출한 판매/구매 주문을 계속합니다.

 INewsFeedService

 선택된 펀드에 대한 새로운 항목의 목록을 제공합니다.

 IWatchListService

 새로운 아이템이 감시 목록에 추가 될 경우를 다룹니다.


 Prism에서 이용 가능한 두개의 부트스트래퍼 파생 클래스가 있습니다. UnityBootstrapper 와 MefBootstrapper 입니다. 다른 컨테이너를 작성 하고 구성하는 것은 다르게 구현된 유사한 개념을 포함하고 있습니다. (Creating and configuring the different containers involve similar concepts that are implemented differently.)


UnityBootStrapper에서 컨테이너를 작성 및 구성하기 (Creating and Configuring the Container in the UnityBootstrapper)

 UnityBootstrapper 클래스의 CreateContainer 메소드는 간단하게 UnityContainer  새로운 인스턴스를 만들고 반환 합니다. 대부분의 경우에서, 이 기능들을 바꿀 필요가 없을 것입니다; 그러나, 이 메소드는 가상이므로 유연성있게 합니다.


컨테이너가 만들어진 후, 응용프로그램을 위해 구성해야 합니다. 여기에서 보여주는 것 처럼, UnityBootstrapper 에서 ConfigureContainer 구현은 기본적으로 많은 수의 핵심 Prism서비스들 등록합니다.



Note:

이는 모듈이 초기화 메소드에서 모듈-레벨 서비스를 등록할 때의 예제 입니다.


// UnityBootstrapper.cs protected virtual void ConfigureContainer() { ... if (useDefaultConfiguration) { RegisterTypeIfMissing(typeof(IServiceLocator), typeof(UnityServiceLocatorAdapter), true); RegisterTypeIfMissing(typeof(IModuleInitializer), typeof(ModuleInitializer), true); RegisterTypeIfMissing(typeof(IModuleManager), typeof(ModuleManager), true); RegisterTypeIfMissing(typeof(RegionAdapterMappings), typeof(RegionAdapterMappings), true); RegisterTypeIfMissing(typeof(IRegionManager), typeof(RegionManager), true);

RegisterTypeIfMissing(typeof(IEventAggregator), typeof(EventAggregator), true);

RegisterTypeIfMissing(typeof(IRegionViewRegistry), typeof(RegionViewRegistry), true);

RegisterTypeIfMissing(typeof(IRegionBehaviorFactory), typeof(RegionBehaviorFactory), true);

RegisterTypeIfMissing(typeof(IRegionNavigationJournalEntry), typeof(RegionNavigationJournalEntry), false);

RegisterTypeIfMissing(typeof(IRegionNavigationJournal), typeof(RegionNavigationJournal), false);

RegisterTypeIfMissing(typeof(IRegionNavigationService), typeof(RegionNavigationService), false);

RegisterTypeIfMissing(typeof(IRegionNavigationContentLoader), typeof(UnityRegionNavigationContentLoader), true);

} }

 부트스트래퍼의 RegisterTypeIfMissing 메소드는 서비스가 이미 등록 되어 있는지 판별합니다 - 이는 두번 등록하지 않도록 합니다. 이는 당신이 구성을 통해 기본 등록(default registration)을 재정의 할 수 있도록 합니다. 또한 기본적으로 모든 서비스를 등록 해제 할 수 있습니다; 이를 하기위해, false로 통과하는 오버로드된 Bootstrapper.Run 메소드를 사용하세요. ConfigureContainer 메소드를 재정의 하고, 이벤트 event aggregator 같이 사용을 원치 않는 서비스들을 비활성화 할 수 있습니다.



Note:

만약 기본 등록(default registration)을 해제한 경우, 수동으로 필요한 서비스들을 등록해야 합니다.


 ConfigureContainer 의 기본 행위를 확장하려면, 단순히 응용프로그램의 부트스트래퍼에 재정의를 추가하고 다음에서 보여주는 것 같이 선택적으로 기본 구현체를 호출하세요. the Modularity for WPF (with Unity) QuickStart 의 QuickStartBootstrapper 로부터 온 코드입니다.

이 구현부는 기초 클래스의 구현부를 호출하고, IModuleTracker의 구제적 구현부로서 ModuleTracker형식을 등록하고, Unity와 함께 CallbackLogger의 싱글톤 인스턴스로써 callbackLogger를 등록합니다.


protected override void ConfigureContainer()
{
    base.ConfigureContainer();

    this.RegisterTypeIfMissing(typeof(IModuleTracker), typeof(ModuleTracker), true);
    this.Container.RegisterInstance<CallbackLogger>(this.callbackLogger);
}

MefBootstrapper에서 Container 작성 및 구성하기 (Creating and Configuring the Container in the MefBootstrapper)

 MefBootstrapper 클래스의 CreateContainer 메소드는 여러가지 작업을 수행합니다. 첫번째로, AssemblyCatalog 와 CatalogExportProvider를 생성합니다. The CatalogExportProvider allows the MefExtensions assembly to provide default exports for a number of Prism types and still allows you to override the default type registration. 그런다음 CreateContainerCatalogExportProvider를 사용해서 CompositionContainer의 새로운 인스턴스를 생성하고 반환합니다. 대부분의 경우, 이 기능들을 변경할 필요가 없습니다; 그러나, 이 메소드는 가상이므로, 유연성을 가집니다.


 해당 컨테이너가 생성된 후에, 응용프로그램에 대한 구성을 해야 합니다. 다음의 예제 코드에서 보여주듯이, MefBootstrapperConfigureContainer 구현부는 기본적으로 많은수의 Prism 핵심 서비스들을 등록합니다.

If you override this method, consider carefully whether you should invoke the base class's implementation to register the core Prism services, 

이 메소드를 재정의 하거나 당신의 구현부에서 Prism 핵심 서비스들을 제공할 것이라면, Prism 핵심 서비스들을 등록하는 기본 클래스의 구현부를 호출할지의 여부를 신중하게 고려해야 합니다.


protected virtual void ConfigureContainer()
{
    this.RegisterBootstrapperProvidedTypes();
}

protected virtual void RegisterBootstrapperProvidedTypes()
{
    this.Container.ComposeExportedValue<ILoggerFacade>(this.Logger);
    this.Container.ComposeExportedValue<IModuleCatalog>(this.ModuleCatalog);
    this.Container.ComposeExportedValue<IServiceLocator>(new MefServiceLocatorAdapter(this.Container));
    this.Container.ComposeExportedValue<AggregateCatalog>(this.AggregateCatalog);
}


Note:

MefBootstrapper에서, Prism의 핵심 서비스들은 싱글톤들로써 컨테이너에 추가 되어 그들은 응용프로그램 전체에서 컨테이너를 통해 위치할 수 있습니다.


 CreateContainer 와 ConfigureContainer를 제공하는 것 뿐 아니라, MefBootstrapper는 MEF가 사용하는 AggregateCatalog를 작성하고 구성하기 위한 두개의 메소드역시 제공하고 있습니다. CreateAggregateCatalog는 간단히 AggregateCatalog 객체를 생성하고 반환합니다. MefBootstrapper의 다른 메소드들과 같이, CreateAggregateCatalog는 가상이며 필요하면 재정의 할 수 있습니다. ConfigureAggregateCatalog 메소드는 당신이 AggregateCatalog에 형식 등록을 추가 할수 있도록 합니다. 예를 들어, Modularity with MEF QuickStart 의 QuickStartBootstrapper는 아래에서 보는것 처럼 AggregateCatalog에 ModuleA 와 ModuleC를 명쾌하게 추가하고 있습니다.


protected override void ConfigureAggregateCatalog()
{
    base.ConfigureAggregateCatalog();
    // Add this assembly to export ModuleTracker
    this.AggregateCatalog.Catalogs.Add(
                 new AssemblyCatalog(typeof(QuickStartBootstrapper).Assembly));
    // Module A is referenced in in the project and directly in code.
    this.AggregateCatalog.Catalogs.Add(
                 new AssemblyCatalog(typeof(ModuleA.ModuleA).Assembly));
    this.AggregateCatalog.Catalogs.Add(
                 new AssemblyCatalog(typeof(ModuleC.ModuleC).Assembly));

    // Module B and Module D are copied to a directory as part of a post-build step.
    // These modules are not referenced in the project and are discovered by inspecting a directory.
    // Both projects have a post-build step to copy themselves into that directory.
    DirectoryCatalog catalog = new DirectoryCatalog("DirectoryModules");
    this.AggregateCatalog.Catalogs.Add(catalog);
}


'Windows Programming > Prism' 카테고리의 다른 글

[Prism] 1. Introduction  (0) 2016.09.07
[Prism] 들어가며...  (0) 2016.09.07


[Windows Programming/Prism] - [Prism] 들어가며...


잘못 작성되어 있는 부분이나 매끄럽지 않은 부분 대해서 Feedback을 주시면 반영토록 하겠습니다. 감사합니다.


1: Introduction to the Prism Library 5.0 for WPF


 Prism은 풍부하고, 유연한, 그리고 유지 보수가 쉬운 WPF 데스크톱 응용이나 실버라이트 RIAs, Windows Phone 7 응용을 쉽게 디자인하고 개발 할 수 있는 가이드라인을 제공합니다. ‘관심사의 분리(seperation of concerns)’나 ‘낮은 결합도(loose coupling)’과 같은 중요한 아키텍처적 디자인 원칙을 포함하는 디자인 패턴을 사용하여, 독립적이면서도 전체 응용 프로그램에 쉽고 이음새 없이 통합할 수 있는 낮은 결합도의 컴포넌트를 설계하고 개발하는 것을 도와줍니다.


 Prism은 다중 스크린을 사용하거나, 사용자 인터렉션이 많거나, 중요한 표현 계층 및 비즈니스 로직을 포함한 WPF 혹은 Silverlight 응용을 개발하는 소프트웨어 개발자를 위해 고안되었습니다. 이러한 보통 다중 백엔드(back-end) 시스템이나 서비스, 계층적 아키텍처와 상호작용하는 이러한 응용들은 여러 계층을 통계 물리적으로 배포될 수 있다. 새로운 요구 사항이나 비즈니스 기회를 통해 응용의 생명주기 동안 상당히 변경된다. 짧게 말해, 이러한 응용은 튼튼하게 만들어져야(built to last)하며 변경이 쉬워야 합니다.(built for change). 이러한 특징을 가지지 않는 응용은 Prism을 사용하는데 아무런 이득이 없습니다.


 Prism은 Reference Implementations와 QuickStarts, 재사용 가능한 라이브러리 코드(the Prism Library), 광범위한 문서가 포함되어 있습니다. 이 Prism 버전은 Microsoft .NET Framwork 4.0과 Silverlight 4, 그리고 Model-View-ViewModel(MVVM) 패턴과 Navigation, Managed Extensibility Framwork(MEF)을 포함한 새 지침을 포함하고 있습니다. Prism은 .NET Framwork 4.0(WPF 포함), Silverlight 4 상에서 개발되었기 때문에, 이러한 기술들에 익숙하다면 Prism을 평가하고 적용하는데 도움이 될 것입니다.

Prism은 배우기 어렵지 않으나, 개발자는 반드시 처음 마주할 패턴과 관례(practices)를 받아드릴 준비가 되어야 합니다. 관리에 대한 이해와 약속은 중요하며, 프로젝트 기한은 반드시 이러한 패턴과 관례를 익히기 위한 선행시간이 포함되어야 합니다.


왜 Prism을 사용하는가? (Why Use Prism?)

 유연하고 유지보수가 쉬운 WPF/Silverlight 클라이언트 프로그램을 디자인하고 개발하는 것은 도전적입니다. 이 섹션에서는 WPF/Silverlight 클라이언트 프로그램을 개발할 때 마주칠 일반적인 문제들을 설명하고, Prism에서는 어떻게 이러한 문제를 다루는지 설명하겠습니다.


클라이언트 프로그램 개발 문제 (Client Application Development Challenges)

 보통, 클라이언트 프로그램 개발자들은 몇몇 상당히 약간의 문제에 부딪칩니다. 프로그램 요구사항은 매번 바뀝니다. 새 비즈니스 기회와 과제는 그 자체로서 혹은 새로운 사용 가능한 기술 또는 개발 기간 중에 들어오는 고객의 요구사항으로 인해 프로그램의 요구사항이 변경됩니다. 그러므로 개발 기간 동안 유연하면서도 쉽게 수정 가능한 프로그램을 개발하는 것이 중요합니다. 이러한 유형의 유연함을 디자인하는 것은 매우 어렵습니다. 프로그램의 다른 부분에 영향을 주지 않으면서, 프로그램의 각각의 부분이 독립적으로 개발되고 테스트 될 수 있는 아키텍처가 필요합니다.

대부분의 엔터프라이즈 어플리케이션은 한 명 이상의 개발자, 심지어 UI 디자이너나 지역화 담당자가 있는 큰 팀이 필요할 정도의 복잡성을 가지고 있습니다. 여러 개발자나 서브 팀들이 독립적으로 프로그램의 다른 부분을 효율적으로 개발하면서도, 프로그램에 통합될 때 이음새 없이 잘 동작하는 것을 보장할 수 있는 디자인을 결정하는 것은 매우 중요한 과제입니다.

하나로 집적된(monolithic) 형태로 디자인하고 개발하는 응용들은 유지보수하기 매우 어렵고 비효율적입니다. 여기서 “집적된(monolithic)”은 컴포넌트들이 매우 밀접하게 결합되어 있고, 각각이 명확히 분리되지 않는 프로그램을 의미합니다. 보통, 이렇게 디자인되고 개발된 프로그램은 개발자의 삶을 힘들게 합니다. 또한 새 기능을 넣거나, 기존의 기능을 대체하는 것이 어려우며, 버그를 발견하기 어려우며, 테스트하거나 배포하는 것이 어렵습니다. 또한 개발자와 디자이너가 함께 효율적으로 일할 수 있는데도 영향을 줍니다.


Composite 접근 (The Composite Approach)

 이러한 문제점에 대한 효율적인 해결책은 프로그램을 일관된 해결책의 형태를 지닌 프로그램 “쉘(shell)” 형태로 쉽게 통합할 수 있는 약간은 독립적이면서 느슨하게 결합된 몇 개의 컴포넌트로 분리하는 것입니다. 이러한 방법으로 디자인되고 개발된 프로그램은 흔히 복합 응용 프로그램(composite application)이라고 불립니다.

복합 응용 프로그램은 다음과 같은 장점을 가집니다.

  • 각각의 모듈은 서로 다른 사람이나 서브 팀이 개별적으로 개발하고 테스트하고 배포될 수 있습니다. 좀 더 쉽게 새 기능들이 수정되거나 확장될 수 있기 때문에 응용 프로그램은 좀더 쉽게 확장되거나 유지될 수 있습니다. composite 접근법을 사용하면 심지어 한 명이 진행하는 프로젝트에서도 보다 테스트 가능하며 유지보스가 가능한 응용프로그램을 만드는데 도움이 됩니다.
  • 느슨하게 결합된 방법으로 상호작용하는 다양한 모듈들이 제공하는 UI 컴포넌트들이 구성된 쉘을 사용할 수 있습니다. 이는 UI에 새 기능을 추가하려는 여러 개발자들 사이에서 발생하는 논쟁을 줄일 수 있으며, 일관된 형태를 가질 수 있도록 지원합니다.
  • 로깅이나 인증과 같은 응용 프로그램의 수평적 기능, 응용 프로그램의 구체적인 비즈니스 기능과 같은 수직적 기능 사이의 관심사 분리가 깔끔하게 이루어 질 수 있으며, 재사용 가능하게 지원합니다. 또한 좀 더 쉽게 응용 프로그램 사이의 상호작용과 종속성들을 관리 할 수 있도록 지원합니다.
  • 다른 개발자 혹은 서브 팀들이 특정 과업 혹은 관심이나 전문성에 따른 기능의 분화에 집중 할 수 있도록 하여, 역할 분리를 유지하는데 도움이 됩니다. 특히, 응용프로그램의 UI와 비즈니스 로직이 깔끔하기 분리될 수 있도록 지원합니다.

 복합 응용 프로그램은 전반적인 클라이언트 응용 프로그램 시나리오에 적합합니다. 예를 들어, 복합 응용 프로그램은 이질적인 백엔드 시스템 상에서의 풍부한 UX를 개발하는데 이상적인 방법입니다.


Composite application with multiple back-end systems

[ 여러 백엔드 시스템과 복합 응용프로그램 (Composite application with multiple back-end systems)]


 이러한 형태의 응용 프로그램은, 하나 이상의 전용 모듈로 표현되는 여러 데이터 보관, 서비스, 백엔드 시스템을 바탕으로 확장된 기능 상에서 과업에 초점을 둔 풍부하고 유연한 UX를 사용자에게 제공할 수 있습니다. 응용 프로그램 로직과 UI 간의 깔끔한 분리는 응용프로그램이 모든 구성 모듈 전체에 걸쳐 일관이면서도 구분된 외형을 제공할 수 있습니다.

 게다가, 복합 응용 프로그램은 이따금 서로 다른 팀에 의해서 유지되거나 서로에서 밀접하게 통합된 UI 상의 컴포넌트가 독립적으로 개발될 때 유용합니다. 강조된 각각의 영역은 UI 상에 구성된 독립 컴포넌트를 의미합니다.



Stock Trader Reference Implementation composite application

[ 주식 거래 참조 복합 응용프로그램 구현 (Stock Trader Reference Implementation composite application) ]


 이 경우에서, 복합 응용프로그램은 UI가 동적으로 결합될 수 있도록 지원한다. 이는 유연한 UX를 가져다 준다. 예를 들어, 실행 중에 응용 프로그램에 새 기능을 동적으로 붙일 수 있으며, 이는 풍부한 사용자화와 확장성(extensibility)을 가능케 한다.


Prism이 다루지 않는 문제 (Challenges Not Adressed by Prism)

 WPF/Silverlight를 개발하는데 직면하는 여러 문제를 Prism이 도와주지만, 응용 프로그램의 시나리오나 요구사항에 따라 다른 다양한 문제에 직면할 것입니다. 예를 들어 다음에 나오는 주제는 직접적으로 다루지 않습니다.

  • Occasional connectivity와 데이터 동기화
  • 서비스와 메시지 기반 디자인
  • 인증과 인가
  • 응용프로그램 성능
  • 응용 프로그램 버전차별전략(Versioning)
  • 에러 처리 및 장애 허용 능력(fault tolerance)

전제조건 (Prerequisites)

 Prism은 당신이 WPF에 대한 경험이 있다는 것을 가정합니다. Prism이 중요하게 사용하는 몇몇 중요한 개념들이 있으며, 당신은 그들과 친해져야 합니다.그들은 다음과 같습니다: 

  • XAML (Extensible Application Markup Language). WPF 응용프로그램에서 UI를 정의하거나 초기화를 서술하기위한 언어입니다.
  • Data binding. UI 요소가 WPF의 요소와 데이터에 연결되는 방법입니다.
  • Resources. WPF에서스타일, 데이터 템플릿, 그리고 제어 템플릿이 만들어 지고 관리되는 방법입니다.
  • Commands. 사용자 행동과 입력이 컨트롤에 연결되는 방법입니다.
  • User controls. 사용자가 정의한 행동이나 외형을 제공하는 컴포넌트 입니다.
  • Dependency properties. 데이터 바인딩, routed command, event를 지원하는 속성(Property) 설정이나 모니터링을 가능케 하는 공용 언어 런타임 속성 시스템(Common Language Runtime(CLR) property system)에 대한 확장입니다.
  • Behaviors. Behaviors are objects that encapsulate interactive functionality that can be easily applied to controls in the user interface.
  • UI 제어에 쉽게 적용 할 수 있는 대화형 기능(interactive functionality)을 캡슐화 하는 객체입니다.


Prism의 개요 (An Overview of Prism)


설계적 목표 (Architectural Goals)

 지침은 설계자나 개발자들이 다음과 같은 목표들을 달성 하는 것을 돕도록 설계되었습니다:
  • WPF를 사용하여 독립적인 팀들로 선택적 빌드, 조립(assembled) 그리고 배포될수 있는 모듈로 부터 응용프로그램을 제작.
  • 팀간 종속성을 최소화 하고 UI설계, 비지니스 로직 구현, 그리고 기반코드 개발과 같은 각기 다른 분야를 전문화.
  • 독립적인 팀전체에 걸쳐 재사용성을 촉진하는 아키텍쳐를 사용.
  • 모든팀에서 사용이 가능한 공용 서비스를 추상화 함으로써 응용프로그램의 품질을 높임.
  • 점진적으로 새로운 기능을 통합하는 것.

Prism 디자인 목표 (Prism Design Goals)

 Prism은 풍부하고 유연하고 유지가 쉬운 WPF/Silverlight 응용 프로그램 디자인과 개발을 돕기 위해 고안되었습니다. Prism 라이브러리는 “관심사 분리(separation of concerns)”나 낮은 결합도와 같은 중요한 아키텍처적 디자인 원칙을 포함하는 디자인 패턴을 구현하였습니다. Prism 라이브러리가 제공하는 디자인 패턴과 기능을 사용하면, 개발자는 전체 응용 프로그램에 쉽고 이음새 없이 통합할 수 있으면서도 독립적으로 개발되는 낮은 결합도의 컴포넌트를 디자인하고 개발할 수 있습니다.

Prism은 핵심 아키텍처 디자인 원칙인 관심사의 분리와 낮은 결합도를 바탕으로 디자인 되었습니다. 이는 다음의 장점을 가지게 됩니다:

  • 재사용(Reuse). Prism은 컴포넌트나 서비스가 하나 이상의 응용 프로그램에 쉽게 개발, 테스트, 통합 될 수 있는 컴포넌트를 사용하여 재사용을 가능하게 합니다. 재사용은 종속성 주입(dependency injection)을 통해 실행 중에 쉽게 발견하고 통합될 수 있는 단위 테스트 컴포넌트를 재사용을 통해 컴포넌트 레벨에서 이룰 수 있으며, 응용 프로그램 레벨에서는 응용 프로그램 전반에서 사용할 수 있는 응용프로그램 레벨의 기능을 캡슐화한 모듈의 재사용을 통해 이룰 수 있습니다.
  • 확장성(Extensibility). Prism은 컴포넌트 종속성 관리, 실행 중 모듈 교체, 독립적으로 배포될 수 있는 모듈들로 분화를 통해 쉽게 확장 가능한 응용 프로그램을 만들 수 있도록 지원합니다. Prism 라이브러리의 많은 컴포넌트 또한 확장되고 교체될 수 있습니다.
  • 유연성(Flexibility). Prism은 개발하고 통합되는 새로운 기능들이 쉽게 변경될 수 있도록 지원하여 유연한 응용 프로그램을 개발 할 수 있도록 도와줍니다. Psirm은 응용 프로그램을 대부분 원하는 방향으로 배포하고 소비할 수 있도록 지원하여, WPF/Silverlight 응용 프로그램이 일반적인 서비스나 컴포넌트를 활용해 개발 할 수 있도록 지원합니다.
  • 팀 단위의 개발(Team Development). Prism은 각기 다른 팀에서 개발하고 심지어 독립적으로 응용 프로그램의 각각의 부분을 배포하는 것을 지원합니다. Prism은 팀 간에 종속성을 최소화 시켜 각각의 기능 영역(UI 디자이너-비즈니스 로직 개발-핵심 인프라 개발자), 비즈니스 레벨의 기능 영역(프로필, 판매, 장바구니, 배송)에 집중할 수 있게 합니다
  • 품질(Quality). Prism은  이미 검증된 일반적인 서비스나 컴포넌트 활용 또는 개발팀이 테스트를 가능하게 하여 품질을 향상시킬 수 있습니다. 덧붙여, 이미 검증된 디자인 패턴, 디자인 패턴을 아우르는 지침을 제공하여, Prism은 개발팀이 인프라의 구현 및 테스트 대신 응용 프로그램의 요구조건에 집중할 수 있도록 합니다.

 응용 프로그램의 시나리오나 요구사항에 맞추어 Prism의 기능과 디자인 패턴을 사용할 수 있습니다. Prism은 중요한 구조적 변경 없이 당신의 특정 응용 프로그램에 맞추어 디자인 패턴이나 기능을 점증적으로 적용할 수 있도록 디자인되어 있습니다.


 마지막으로, 소프트웨어 테스팅은 개발 활동 중에 제일 염두 해야 할 사항이며, 개발 프로세스에 엄격하게(tightly) 통합되어야 하기 때문에, Prism은 당신이 쉽게 테스트 할 수 있는 응용 프로그램을 디자인하고 개발 할 수 있도록, 다양한 형태의 소프트웨어 테스팅을 광범위하게 지원합니다. Prism은 애초에 테스팅을 고려해 개발 했습니다. Microsoft 보안 표준을 만족하는 여러 엄격한 품질 검증을 만족하며, 이는 여러 OS, 다양한 버전의 Visual Studio, 다양한 프로그래밍 언어에서 정상적으로 동작합니다. 단위 테스트 또한 각각의 check-in 후 진행되었습니다. Prism은 아래에 나열된 품질 검증에 맞추어 테스트 했습니다.


 테스트

 설명 

 Acceptance Testing

  응용 프로그램의 기능을 사용자 시나리오에 맞추어 검증합니다. 테스트는 수동 혹은 자동으로 이루어집니다.

 Application Building Exercises

  Team members build applications consuming the deliverable software

 Black Box Testing

  사용자 관점에서 이루어지는 수동 Acceptance tests.

 Cross Browser Testing

  여러 브라우저에서 이루어지는 자동 테스트

 Cross Platform Testing

  여러 플랫폼에서 이루어지는 자동 테스트

 Globalization Testing

  여러 언어에서 이루어지는 자동 테스트

 Performance Testing

  부하 상태에서 시스템의 특정 기능이 얼마나 빨리 수행되는지 측정 

 (Measures how fast a particular aspect of a system performs under-load.)

 Security Review

  쓰레드 모델, 공격 요소 식별, 보안 분석 도구를 통해 코드 실행을 포함한 내부 Microsoft 보안 감사 표준

 Stress Testing

  메모리 누수나 쓰레드 이슈를 검출하기 위한 과부하 상태에서 시스템의 안정성 측정

 White Box Testing  표준 준수 및 구조, 전체 아키텍처에 어떻게 배치되는지를 소스 코드 레벨에서 검증


 Prism 라이브러리의 소스코드는 아래 표에 나와있듯이, 단위 테스트/UI 자동화 테스트까지 포함되어 있습니다. 당신은 이러한 소스를 교육적인 자료나 Prism 라이브러리를 테스트하는데 사용하실 수 있습니다. 테스트 코드는 수정/재 컴파일/테스트 배포하실 수 있습니다.


 테스트

 설명 

 UI 자동화 테스트 (UI Automation Tests)

 제한된 범위의 Acceptance Testing; 사용자 관점에서 응용 프로그램 검증

 단위 테스트 (Unit Tests)

 구현된 클래스의 검증


Prism 핵심 개념 (Prism Key Concepts)

 Prism이 제공하는 기능과 디자인 패턴은 당신이 디자인 패턴이나 복합 응용 프로그램 개발에 익숙하지 않으면 어려울 수 있습니다. 이번 절에서는 Prism에 깔려있는 중요한 개념의 대해 간략히 살펴보고, 이 문서나 코드에서 사용하는 단어에 대한 정의도 함께 알아보겠습니다.

  • Module. 모듈은 기능의 집합으로서 독립적으로 개발/테스트/배포가 가능합니다. 다양한 상황에서, 모듈은 다른 팀에서 개발되고 유지됩니다. 일반적인 Prism 응용 프로그램은 여러 모듈로 구성됩니다. 모듈은 비즈니스와 관계된 기능으로 표현되며, 기능을 구현하기 위한 모든 View, Service, Data Model을 캡슐화 합니다. 모듈은 여러 응용프로그램에서 재사용 가능한 범용 응용 프로그램 기반이나 서비스(예를 들어, 로깅이나 예외 관리 서비스)를 캡슐화 하기도 합니다.
  • Module Catalog. 복합 응용 프로그램에서, 실행 응용 프로그램은 모듈을 실행 시에 반드시 발견하고 로딩해야 합니다. Prism에서 모듈 카탈로그는 어떤 모듈을, 언제, 어떤 순서로 로딩할 것인지를 기술하기 위해 사용합니다.  ModuleManager와 Module Loader 컴포넌트가 원격에 있는 모듈을 다운 받거나 응용 프로그램 도메인에 있는 모듈을 불러오거나 초기화 하기 위해서 모듈 카탈로그를 사용합니다. Prism은 프로그래밍적인 코드를 사용하거나 선언형태의 XAML, 또는 설정 파일을 통한 여러 방법으로 모듈 카탈로그를 구성할 수 있습니다. 원하면 당신만의 모듈 카탈로그를 만들 수 있습니다.
  • Shell. 모듈이 로드되는 실행 응용프로그램입니다. 쉘은 응용 프로그램의 전체적인 레이아웃과 구조를 정의합지만, 어떤 모듈이 호스트 될지는 모릅니다. 쉘은 일반적으로 공용 응용프로그램 서비스들이나 기반을 구현하지만, 응용프로그램의 기능과 내용의 대부분은 모듈안에 구현되어 있습니다. 또한 쉘은 로드된 모듈에서 제공하는 각기 다른 UI 컴포넌트들을 실행하는 최상위 레벨 윈도우 및 시각 요소를 제공합니다.
  • Views. 뷰는 응용프로그램의 특정한 기능이나 기능영역을 위한 UI를 캡슐화 하는 UI control입니다. MVVM 패턴과 결합되서 사용 되는데, 이는 UI와 응용프로그램의 표현 로직과 데이터간의 분리를 위함입니다. 뷰는 UI를 캡슐화 하거나 사용자 상호작용 행동(user interaction behavior)을 정의 하는데 사용되는데, 그러므로써 응용프로그램의 기능하에서 뷰가 독립적으로 업데이트 되거나 대체되도록 허락합니다. 뷰모델 클래스와 상호 작용을 위해 데이터 바인딩을 사용합니다.
  • View models. 뷰모델은 응용프로그램의 표현 로직과 상태를 캡슐화 하는 class입니다. MVVM 패턴의 일부입니다. 응요프로그램의 기능들의 대부분을 캡슐화 합니다. 뷰모델은 뷰가 데이터 바인드 할 수 있는 컨트롤인 속성(Property), 명령(commands), 이벤트(events)를 정의합니다.
  • Models. 모델 클래스는 응용프로그램의 데이터와 비지니스 로직을 캡슐화합니다. MVVM 패턴의 일부입니다. 모델은 데이터의 일관성(consistency)와 무결성(integrity)을 보장하기 위해 데이터와 관련된 검증 및 비지니스 규칙을 캡슐화합니다.
  • Commands. 커맨드는 응용프로그램의 UI가 독립적으로 테스트되고 정의 될수 있도록 하기위한 방식으로 응용프로그램 기능을 캡슐화 하기 위해서 사용됩니다. 뷰모델 내에서 커맨드 객체나 command method로서 정의될 수 있습니다. Prim에서는 DelegateCommand 클래스와 CompositeCommand 클래스를 제공합니다. 후자는 같이 호출되어야 하는 커맨드들의 집합체를 나타내는데 사용된다.
  • Regions. 리전은 응용 프로그램의 UI 내부에서 (쉘에서 혹은 뷰 내부에서) 뷰들이 보여질 곳이 정의된 논리적 자리표시자(logical placeholder)입니다. 응용프로그램 UI의 레이아웃이 응용프로그램 로직에 변경 요청 없이 업데이트 될 수 있도록 합니다. 많은 공용 컨트롤들은 리전으로써 사용 될 수 있으며, 뷰가 ContentControl, ItemsControl, ListBox 혹은 TabControl 과 같은 컨트롤내부에서 자동으로 보여지도록 합니다. 뷰는 리전내부에서 코드 작성(programmatically)으로 혹은 자동으로 보여질 수 있습니다. Prim은 리전과 함께 navigation을 구현하기 위한 지원 역시 제공하고 있습니다. 리전은 RegionManager 컴포넌트를통해서 다른 컴포넌트들에 위치 할 수 있으며, RegionManager는 특정한 리전내에 뷰의 위치를 편성하는 RegionAdapter와  RegionBehavior 컴포넌트를 사용합니다.
  • Navigation. 내비게이션은 응용프로그램이나 응용프로그램 내부 상태 변화와 사용자의 상호작용(interaction)에 의한 결과로써 UI변화를 응용프로그램이 조정하는 절차로 정의 합니다. Prism은 2가지 스타일의 내비게이션을 제공합니다: 상태기반 내비게이션(state-based navigation)은 간단한 내비게이션 시나리오를 수행하기 위해 기존에 있는 뷰의 상태가 갱신됩니다, 뷰 전환 내비게이션(view-switching navigation)은 새로 만들어진 뷰와 기존의 (old view)가 응용프로그램의 UI 내에서 교체됩니다. 뷰전환 내비게이션은 유연한 내비게이션 스키마(Flexible navigation schemes)들이 구현 되어 질수 있도록 하기위해 Prism 리전과 결합되어 URI(Uniform Resource Identifier)에 기반한 내비게이션 메카니즘을 사용합니다.
  • EventAggregator. 복합 응용 프로그램내의 컴포넌트들은 때때로 느슨한 결합(loosely coupled) 방법으로 응용프로그램 내에 있는 다른 컴포넌트나 서비스와의 통신통신이 필요하다. 이를 지원하기 위해, Prism에서는 EventAggregator 컴포넌트를 제공하며, 이는 발행-구독 이벤트 메카니즘(a pub-sub : a publish - subscribe pattern)을 구현하고, 그러므로써 컴포넌트들이 서로에 대한 참조 없이, 컴포넌트가 이벤트를 발행하거나 발행된 이벤트를 구독할 수 있도록 합니다. EventAggregator는 각기 다른 모듈에 정의된 컴포넌트들이 서로와 통신하도록 허용하기 위해 사용되기도 한다.
  • Dependency injection container. 의존성 주입 패턴은 관리 되어야되는 컴포넌트들 사이의 종속성(dependencies)을 허용 하기 위해 Prism 도처에서 사용됩니다. 의존성 주입은 컴포넌트가 종속성이 실행 시간(run time)에 구비될 수 있도록 허용하며, 확장성(extensibility)과  테스트 용이성(testability)를 제공합니다. Prism은 ServiceLocator를 통해서 Unity나 MEF, 혹은 다른 어떤 의존성 주입과 작동 하도록 설계(designed) 되었습니다.
  • Services. 서비스는 logging, 예외 관리, 데이터 접근과 같은 기능에 연관이 되어 있는 비 UI 를 캡슐화하는 컴포넌트 입니다. 서비스는 Application이나 Module내부에서 정의 될 수 있습니다. 서비스는 종종 의존성 주입 컨테이너와 함께 등록되어 그들은 그글에게 의존된 다른 컴포넌트들의 요구나 사용에 의해 위치되거나 구성될 수 있습니다. 
  • Controllers. 컨트롤러는 Application의 UI 내부 리전에 표시되는 뷰의 구성과 초기화를 조정하는데 사용되는 클래스 입니다. 컨트롤러는 어떠한 뷰를 표시할지 결정하는 표현 로직을 캡슐화합니다. 컨트롤러는 리전안에서, 뷰의 구조 및 위치를 조정하는 확장 URI 기반 네비게이션 메카니즘인 Prism의 뷰 전환 네비게이션 메카니즘을 사용할 것입니다. 응용프로그램 컨트롤러 패턴은 이 책임을 보여주는 추상(abstraction)을 정의합니다.
  • Bootstrapper. 부트스트래퍼 컴포넌트는 다양한 Prism 컴포넌트들과 서비스들을 초기화 하는 응용프로그램에서 사용합니다. 응용프로그램 수준의 컴포넌트 및 서비스를 등록하기위해 의존선 주입 컨테이너를 초기화 하기도 합니다. 모듈 카탈로그와 쉘의 뷰와 뷰 모델 혹은 presenter를 설정하거나 초기화 하기도 합니다.

 당신의 요구사항과 응용프로그램의 시나리오에 따라, Prism은 이전 기능들, 각각의 디자인 패턴들, 혹은 전부를 같이 사용할 수 있도록 설계 되었습니다. 당신은 MVVM 패턴, 모듈화, 커맨드, 혹은 이벤트들을 모두다 채택할 필요 없이 임의의 조합으로 사용할 수 있습니다. 물론, 당신이 관심사 분리(separation of concerns)와 느슨한 결합(loose coupling)이 주는 이점들을 최대한 활용하려 한다면, Prism의 기능과 design pattern들을 결합하여 사용 할 것입니다. 다음 그림은 일반적인 Prism 응용프로그램 구조를 보여주고, 어떻게 Prism의 다양한 기능들이 다 모듈 복합 응용프로그램(multi module composite application)에서 서로 작동할 수 있는지 보여줍니다.


Typical composite application architecture with the Prism Library

[ Prism Library를 사용한 일반적 복합 응용프로그램 구조 (Typical composite application architecture with the Prism Library) ]


 대부분의 Prism 응용프로그램은 최상위 뷰들을 보여주기 위한 리전들이나 로드된 모듈들에 의해 접근가능한 공유 서비스들을 정의하는 하나의 쉘 응용프로그램으로 구성되어 있습니다. 해당 쉘은 어느 모듈들이 시작시 적절한 때에 로드 될지 명시하기 위해 적절한 카탈로그를 정의합니다. 의존성 주입 컨테이너가 정의되며, 이는 실행시간에 컴포넌트 의존성들이 구비되도록 합니다. 응용프로그램이 시작할 때 공유 서비스들과 컴포넌트들은 부트스트래퍼에 의해 컨테이너에 등록됩니다. 


 개별 모듈들은 뷰, 뷰모델, 모델 그리고 서비스 컴포넌트를 정의 한, MVVM과 같은 분리된 표현 패턴을 사용 하여 전체 응용프로그램의 기능 일부를 캡슐화 합니다. 모듈이 로드될 때, 모듈 안에서 정의된 뷰는 쉘이 정의한 리전 안에서 보여집니다. 초기화가 완료된 후, 응용프로그램의 리전들 내에서 새 뷰의 표시나 시각적 갱신을 조정하기 위한 상태 기반 내비게이션 혹은 뷰 전환 내비게이션을 사용한 응용프로그램상에서 사용자는 행동을 취합니다.


Prism 사용 (Using Prism)

 당신은 Prim이 제공하는 주요 기능과 디자인 패턴을 보았기 때문에, 새로운 응용프로그램을 개발할 때 당신이 얼마나 쉽게 Prim을 사용 시작 할수 있는지 볼 시간입니다. 이 섹션은 기본적인 Prism 응용프로그램을 만들기 위해 요구되는 최초의 몇 단계들의 요약을 제공합니다. 당신의 시나리오에 의해 요구되는 것 처럼, Prism에서 제공하는 추가적인 기능과 디자인 패턴을 사용하여 기본적인 응용프로그램을 확장 시킬 수 있습니다.


Note : 비록 Prism 라이브러리가 새 복합 WPF 응용프로그램을 만드는데 쉽게 사용될 수 있지만, 한개 이상의 Prism의 기능이나 디자인 패턴들의 이점들을 얻기 원한다면 기존에 존재하는 응용프로그램에도 Prism을 사용할 수 있습니다.


 한개의 Prism 응용프로그램은 일반적으로 한개의 쉘 프로젝트와 여러개의 모듈 프로젝트들로 이루어져 있습니다. 다음의 도해는 Prism 라이브러리를 사용하여 복합 응용프로그램을 개발할때 필요한 일반적인 행동들을 보여줍니다.



Activities for creating a composite application

[ 복합 응용프로그램 제작을 위한 행동들 (Activities for creating a composite application) ]



 일반적인 Prism 응용프로그램은 앞서 설명한 느슨한 결합(loose coupling) 과 구조적 설계 원칙의 관심사 분리(separation of concerns architectural design principles)의 이점을 전부 구현 할 수 있도록 하는 Prism 기능과 디자인 패턴들에 대해서 일부 혹은 전부를 활용합니다. 하지만, 이 예에서는, 단일 뷰를 정의하는 단일 모듈로 구성된 기본적인 Prism 응용프로그램을 만들기 위해 요구되는 단계들이 기술되어 있습니다.


Note: 

Prism Library Refrerences

당신의 프로젝트들의 대부분은 Prism 라이브러리 어셈블리들대한 참조를 필요로 할 것입니다. Prism은 NuGet 패키지들을 통해 서명된 바이너리들을 제공하고 있기에 어셈블리들에 대한 참조를 추가하기위한 Visual Studio Manage NuGet Pacakages 대화상자를 사용 할 수 있습니다. 또한 당신은 Prism 라이브러리 프로젝트를 당신의 솔루션내에 포함할 수 있고 어셈블리에 대한 프로젝트 참조를 사용할 수 있습니다. 후자는 Prism 타입들에 대해 이동을 위해 정의로 이동(Go To Definition)과 같은 기능들을 사용 할 수 있을 뿐만 아니라, 당신의 빌드 절차의 일부으로써 당신이 가진 강한 이름(Strong Name)이나 자격과 함께 Prism 라이브러리 어셈블리들을 빌드하거나 서명할 수 있다는 장점을 가지고 있습니다.(역주: Assenbly Name을 의미 하는 듯합니다. Programming with Assemblies 혹은 How to: Sign an Assembly with a Strong Name 참고 하시기 바랍니다.)



쉘 정의 (Define the Shell)

 응용프로그램 쉘은 응용프로그램을 위한 기본적은 레이아웃을 제공합니다. 이 레이아웃은 뷰를 위치시키기 위해 모듈이 사용할 수 있는 리젼을 사용하여 정의 됩니다. 아래의 그림에서 보는 것과 같이, 쉘처럼, 뷰는 컨텐트가 추가 될수 있는 가시적 영역을 정의 하기 위해 리젼을 사용 할 수 있습니다. 쉘은 일반적으로 전체적인 응요프로그램을 위한 외형을 정하고 응용프로그램 전체에서 사용되는 스타일을 포함합니다.


Shells, views, and regions

[ 쉘, 뷰, 그리고 리전 (Shells, views, and regions) ]


부트스트래퍼 제작 (Create the Bootstrapper)

 부트스트래퍼는 Prism라이브러리와 Unity 혹은 MEF 컨테이너화 함께 응용프로그램을 연결하는 접착제입니다. 아래의 그림에서 보는 것과 같이, 각 응용프로그램은 응용프로그램 특화 부트스트래퍼를 생성하며, 해당 부트스트래퍼는 일반적으로 UnityBootstrapper 나 MefBootstrapper 로부터 상속받습니다. 

당신은 당신이 모듈 카탈로그를 채우는데 사용할 방법을 결정해야 합니다. 적어도, 각 응용프로그램은 하나의 모듈 카탈로그와 하나의 쉘을 제공할 것입니다. 

 기본적으로, 부트스트래퍼는 .NET Framework Trace 클래스를 사용하는 이벤트를 기록합니다. Enterprise Library Logging같은, 대부분의 응용프로그램들은 그들이 가진 로깅 서비스를 제공할 것입니다. 응용프로그램은 자신의 부트스트래퍼에서 그들의 로깅 서비스를 제공 할 수 있습니다.  

기본적으로, UnityBootstrapper 와 MefBootstrapper 는 Prism라이브러리 서비스를 할 수 있습니다. 이들은 당신의 응용프로그램 특화 부트스트래퍼를 비활성화 하거나 교체할 수 있습니다.



Diagram demonstrating connecting to the Prism Library

[ Prism라이브러리에 연결하는 것을 보여주는 다이어그램 (Diagram demonstrating connecting to the Prism Library) ]


모듈 제작 (Create the Module)

 모듈은 응용프로그램의 기능의 일부에 구체적인 뷰와 서비스를 포함하고 있습니다. 자주, 이것들은 별도의 어셈블리에 포함이 되거나 별도의 팀으로 개발됩니다. 모듈은 IModule interface를 구현하는 클래스를 의미합니다. 초기화 하는 동안, 이러한 모듈들은 그들의 뷰와 서비스를 등록하고 하나 이상의 뷰를 쉘에 추가 할 수 있습니다. 모듈 검색 방법에 따라서, 모듈 클래스에 속성을 적용하거나 모듈간의 의존성들 정의할 필요가 있습니다.


쉘에 모듈 뷰 추가 (Add a Module View to the Shell)

 모듈은 콘텐츠를 베치시키기 위해 쉘의 리전의 사용합니다. 초기화 하는 동안, 모듈은 쉘안에 리전을 배치하기 위해 the RegionManager를 사용하고 그 리번들에 하나 이상의 뷰를 추가하거나 생성될 하나 이상의 뷰 타입들을 리전에 등록합니다. the RegionManager는 응용프로그램 전체에서 리전에 대한 추적해야 하고 부트스트래퍼로부터 초기화된 핵심 서비스이다.


이 가이드의 나머지 항목에서는 Prism 핵심 개념에 대한 세부정보을 제공합니다.





(역주 : 원문 하단에 있는 Exploring Prim 항목은 추가 및 번역하지 않았습니다.)

'Windows Programming > Prism' 카테고리의 다른 글

[Prism] 2. Initializing Applications  (0) 2016.09.07
[Prism] 들어가며...  (0) 2016.09.07


Prism


들어갑니다...


Download and Setup Prism


What's New in Prism Library 5.0 for WPF


Contents of the Developer's Guide to Prism


[Windows Programming/Prism] - [Prism] 1. Introduction


[Windows Programming/Prism] - [Prism] 2. Initializing Applications


[Windows Programming/Prism] - [Prism] 3. Managing Dependencies Between Components


4: Modular Application Development


5: Implementing the MVVM Pattern


6: Advanced MVVM Scenarios


7: Composing the User Interface


8: Navigation


9: Communicating Between Loosely Coupled Components


10: Deploying Applications


11: Glossary for the Prism Library


12: Patterns in the Prism Library


13: Prism Library


14: Upgrading from Prism Library 4.1


15: Extending the Prism Library


16: Code Samples

Stock Trader Reference Implementation

Modularity QuickStarts

Interactivity QuickStart

MVVM QuickStart

Commanding QuickStart

UI Composition QuickStart

State-Based Navigation QuickStart

View-Switching Navigation QuickStart

Event Aggregation QuickStart


17: Getting Started Hands-on Lab


18: Publishing and Updating Applications Hands-on Lab


Bibliography


Microsoft patterns & practices License


Prism Class Library 5.0 for WPF

'Windows Programming > Prism' 카테고리의 다른 글

[Prism] 2. Initializing Applications  (0) 2016.09.07
[Prism] 1. Introduction  (0) 2016.09.07

+ Recent posts