본문 바로가기

Programming/Laboratory

WPF, MVVM | 초심자를 위한 MVVM


 C#은 풍부한 라이브러리를 통한 높은 생산성과 GUI 프로그래밍이 용이하다는 장점이 있습니다. 저 역시 이러한 점에 매료되어 C#을 공부하기 시작했지만 '디자인 패턴'에 대한 필요성은 느끼지 못했습니다. 학부 시절에는 제가 짠 코드를 남이 볼일이 없는데다가, 프로젝트 구조가 어찌되었던 간에 결과물만 제대로 기능하기만 하면 아무런 문제가 없이 성적을 받을 수 있었기 때문이죠.

 하지만, 이제 갓 사회 생활을 시작하게 되면서 '디자인 패턴'에 대해 조금 생각할 시간이 있었습니다. 직장에서의 프로젝트는 혼자 개발할 수가 없기 때문입니다. 특히 신규 프로젝트를 WPF로 진행하게 되면 MVVM이라는 디자인 패턴을 적용하는 것이 유지보수 측면에서도 굉장히 유리할테니 스스로 공부하고 싶은 마음이 생겼습니다.

 그래서 개인적으로 공부하면서 중요하다고 생각되는 내용도 정리해 놓고, 코드도 작성하면서 MVVM 패턴과 조금 친해지고자 블로그에 글을 작성하게 되었습니다.

 

1. 개요


  • Model(모델) - 비즈니스 로직과 데이터를 캡슐화 한 것
  • ViewModel(뷰 모델) - Model과 View 사이를 연결, 화면의 동작방식 및 흐름을 표현하는 곳
  • View(뷰) - 사용자가 화면에서 보는 구조, 레이아웃 및 모양을 정의하는 역할, 비즈니스 로직을 포함하지 않음

[MVVM: Model View ViewModel]

MVVM의 주 목표는 로직과 UI 부분의 명확한 분리입니다. 따라서 Model을 교체하더라도 View는 독립적으로 동작하게 되며, Command와 Data Binding을 통해 View와 ViewModel 사이의 의존성도 없습니다. MVVM 패턴을 사용함으로써 따라오는 장점과 단점은 아래와 같습니다.

 

2. 장단점


장점

Maintainabilitiy (유지관리성)

깔끔하게 분리된 다른 종류의 코드들은 변경하기 쉬워진다.

 

Testability (테스트 가능성)

View와 ViewModel 사이의 의존성이 없어 ViewModel 단독으로 테스트가 가능.

 

Extensibility (확장성)

Maintainability와 같은 맥락.

단점

단순한 프로그램의 경우, MVVM은 오히려 개발을 어렵게 만들 수 있다.

ViewModel의 설계가 어려울 수 있다.

DataBinding이 복잡하면 디버깅이 어려울 수 있다.

 

3. 구현 시 지켜야할 점


Model

속성을 가진 개체, 변수를 가진 객체로 구성된다.

    이러한 속성 중 일부는 다른 Model 객체를 참조할 수 있다.

Model 객체는 WPF에서 Data Binding을 뜻하는 속성 변경 알림(Property change notification)을 발생시켜야 한다.

(선택 사항) INotifyDataErrorInfo/IDataErrorInfo와 같은 인터페이스를 통해 Model 객체에 유효성 검사 정보를 포함시킬 수 있다.

View

Static parts(정적 부분): View가 구성되는 컨트롤의 제어와 레이아웃을 정의하는 XAML 부분

Dynamic parts(동적 부분): View의 일부로 정의된 애니메이션, 상태 변경

MVVM의 주요 목표는 View에는 Code behind가 없어야 한다는 것.

    하지만 이 점은 불가능하며, 적어도 구성 요소를 초기화하려면 생성자와 호출이 필요하다.

    UI 요소에 대한 참조가 필요한 코드 역시 필요하다.

    대신, Event handling, Action, 데이터 변경 코드는 없어야 한다.

ViewModel

View에 데이터를 제공해 해당 데이터를 화면에 표시할 수 있도록 한다.

사용자가 데이터와 상호작용하고 데이터를 변경할 수 있어야 한다.

View에 대한 상호작용(Interaction) 로직을 캡슐화

    하지만 애플리케이션의 모든 로직이 ViewModel에 있어야 한다는 것은 아니다.

사용자나 View의 변경에 따라 올바르게 작동하도록 적절한 호출 순서를 가져야 한다.

또한, 다른 View로 이동할 타이밍 등의 탐색 로직을 관리해야 한다.


 다음 글에서는 직접 프로그래밍을 통해 MVVM 패턴을 적용하는 법을 알아보겠습니다.