안녕하세요. 눈팅만 하다 글을 쓰는 건 이번이 처음이네요.
저는 초급 C# 개발자입니다. 입사한 회사에서 외주로 맡긴 프로그램이 닷넷으로 개발된 탓에 얼떨결에 C#에 입문했다 보니 배워야 할 것과 공부해야 할 것이 투성이네요.
최근에는 WPF와 MVVM 패턴에 대해 고민하고 있습니다. 특이한 구조를 가진 MVVM 패턴이 재미있고 신기하면서도, 대학에서 곁다리로 c만 얕게 배웠던 저에게는 그만큼 낯설기도 하네요.
그 중에서도 MVVM을 엄격하게 구현할 때 프로젝트 구조를 어떻게 구성할 것인가, 특히 특정 모듈의 뷰모델과 뷰를 어떤 방식으로 분리할 것인가는 생각해 볼 점이 많은 것 같아 다른 개발자분들과 의견을 나누고 싶습니다.
예를 들어 하나의 프로그램 안에서 그림판 기능을 하는 모듈과 메모장 기능을 하는 모듈이 있을 때, 크게는 이 프로그램의 프로젝트 구조를 어떻게 구성할 것인지, 작게는 모듈별 구조를 어떻게 구성할 것인지입니다.
아래는 제가 생각한 방안들입니다.
- View를 포함한 모듈을 메인 프로젝트와 분리하되, 각 모듈의 View와 ViewModel을 동일 프로젝트에서 관리한다.
그림판과 메모장 모듈의 UI 및 로직을 메인 프로젝트와 분리하되, 각 모듈의 뷰와 뷰모델은 동일한 프로젝트 안에서 함께 관리되는 구조입니다. 물론 각 뷰모델과 뷰는 분리되어 있어야겠죠. 프로젝트 구조는 다음과 같을 수 있겠네요.
- MyProgram.Paint
- MyProgram.Notepad
- MyProgram
프로그램의 메인 View는 MyProgram 프로젝트 내에 있겠지만, 각 모듈을 구성하는 View는 각 모듈 프로젝트 안에 존재합니다. 메인 프로젝트에서는 UI를 구성하면서 각 모듈의 View를 가져오는 방식으로 사용하게 될 겁니다.
- 별도의 프로젝트에서 UI를 구성하고, 각 모듈별 프로젝트에서 로직을 담당한다.
UI를 별개 프로젝트에서 관리하고, 각 모듈 UI마다 해당하는 모듈의 ViewModel을 바인딩하는 방식입니다. 프로젝트는 아래와 같이 만들 수 있을 것 같습니다.
- MyProgram.Paint
- MyProgram.Notepad
- (MyProgram.Views)
- MyProgram
개발하기에 따라 View가 메인 프로젝트 안에 존재할 수도 있고 완전히 별개의 프로젝트로 분리될 수도 있고, 혹은 MyProgram.Paint.Views와 같은 방식으로 각 모듈별로 View를 전부 분리할 수도 있겠지만 어쨌든 핵심은 모듈의 View와 로직이 완전히 분리된다는 점입니다.
어쨌든 View와 ViewModel을 별개 어셈블리로 분리할 것인지 여부가 가장 큰 차이점인 것 같습니다.
말인즉슨 모듈화 대상을 로직과 UI를 별개로 볼 것인지, 로직과 UI를 함께 볼 것인지의 관점 차이 같네요. 1의 경우 UI만 갈아치우면 된다지만 어쨌든 전체 프로젝트의 입장에서 보면 한 프로젝트 안에 묶여 있는 것이기도 하니까요. 개발하기에 따라 다르겠지만 UI에 대한 종속성은 로직만 모듈화된 후자가 더 느슨할 것 같네요.
글재주가 적어 횡설수설 했는데 써놓고 보니 결국 취향 차이와 개발 노하우의 문제인 것 같기도 하군요…