[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

+ Recent posts