WPF Developement
Zipper를 개발하면서 WPF 개발 practice를 정리해 보았습니다.
개념적인 부분 위주로 다루겠습니다.
WPF
Windows Presentation Framework.
뭔가 거창하지만 .Net 진영의 Winform의 버전업이라고 보시면 될 것 같습니다.
RIA(Rich internet application) 및 WindowsPhone7을 위한 platform인 Silverlight의 부모격이며, UWP 등의 현재 MS platform의 근간이기도 합니다.
MS가 ASP.NET Webform에서 MVC로 바뀌면서 패러다임 및 기술의 큰 변화를 이루었고, Winform을 WPF로 변경하면서도 그렇습니다.
UI는 XML베이스의 xaml(재믈이라고 읽습니다.)로 작성합니다.
로직은 전통적인 방식의 code_behind 형태로 개발할 수도 있으나, MVVM이라는 패턴을 권장하고 있습니다.
MVVM pattern
Model - View - ViewModel의 약자입니다.
익숙한 MVC와 크게 다르지 않습니다만, View와 Model을 완벽하게 분리할 수 있다는 점이 특징입니다.
이를 위해서는 Data binding, Command(Behavior)라는 개념이 필요합니다.
이를 통해서 xaml designer와 programmer는 서로의 영역을 침범하지 않고 app을 개발할 수 있습니다.
출처: http://hackersstudy.tistory.com/71
MVVM Light
이러한 MVVM pattern을 지원하기 위한 다양한 library가 존재합니다.
대표적으로 MVVM Light를 들 수 있으며, 지난 NY**에서 사용한 MVVM Cross도 그 일종입니다. (Alex는 후자를 좋아하더라고요. )
MVVM pattern에 따른 개발에 필요한 추상 class 및 helper들을 제공하며, IoC 기능도 지원합니다.
예를 들면, ViewModel의 base가 되는 ViewModelBase, IoC를 위한 SimpleIoc, Command를 지원하기 위한 RelayCommand 등이 있습니다.
IoC
Inversion of Control.
해석하기 참 애매하네요, 제어 반전??
이건 도저히 짤게 넘길 수 없는 주제이네요.
아래의 link를 살펴 봅시다.
https://msdn.microsoft.com/en-us/library/ff921087.aspx
이를 위한 개발 패턴으로는 Service Locator pattern과 Dependency Injection(DI) pattern이 있습니다.
개발한 Zipper에서 실제 App 부분을 MVVM light를 통한 service locator pattern을 사용하였고, Unit test에서는 Dependecy injection pattern을 이용하였습니다.
MUI Template
WPF를 통해 UI 표현력을 크게 향상시켰음에도 불구하고, 기본적인 그 형태는 기존의 것 (Winform)과 큰 차이를 느끼기 어렵습니다.
WPF가 공개되고 Morden UI (or Metro UI라고 불리우는)를 Windows8을 통해서 크게 대중화시켰던 MS의 제품의 그러한 design을 손쉽게 적용할 수 있도록 MUI Template이 제공됩니다.
쉽게 이와 같은 UI를 만들 수 있다는 거죠.
https://github.com/firstfloorsoftware/mui/wiki
Conclusion
WPF는 관심사의 분리를 완벽하게 해낸 의미 있는 framework입니다.
실제 개발 과정에서 개발자는 VisualStuio를 통해, 디자이너는 Blend라는 툴을 이용해 완벽하게 따로 작업할 수 있습니다.
초기 웹에 대한 붐이 일었을 때, Html과 javascript 및 ASP, PHP 코드가 뒤섞인 환경에서 개발자와 디자이너는 앙숙일 수 밖에 없었습니다.
내가 다 개발해 놓으면 디자이너가 기능을 망가뜨리고, 디자이너가 UI를 잘 꾸며 놓으면 개발자가 layout을 흐트려 놓는...
이렇게 틀을 잘 만들어 놓았기에 이어서 UWP나 Xamarin이나 이를 근간으로 할 수 있었습니다.
xaml이 XML을 근간으로 하다 보니 Microsoft 진영의 mark up 언어의 parsing 속도는 Java 진영에 비해서 월등하다는 소문을 들은 적도 있습니다. :)
또한, 개발에 대한 pattern도 바뀌었습니다.
저는 게으른 개발자로서 application을 개발하면서, 수시로 app을 실행해 보고 테스트해 보는 작업이 피하고 싶었습니다.
그리고 그러한 고민을 하던 선배들이 그 방법을 검토해왔고, 그러한 practice들을 만들어 왔습니다.
흐름에 뒤쳐지지 않기 위해서가 아니라 더 나은 개발을 위해서 그리고 더 나은 결과를 만들어 내기 위해서 이러한 패턴의 습득은 선택이 아닌 필수라고 생각합니다.
MV* pattern이나 IoC는 비단 .net platfrom에서만 도입된 개념이 아니고, Java나 혹은 javascript framework에도 적용이 됩니다.
AngularJs도 controller 선언할 때 참조할 service 등을 나열하는 것으로 의존성을 해결하고 있습니다.
이는 또한 product의 완성도를 높이는 가장 높은 방법 중 하나입니다.