C#을 이용한 Windows 데스크톱 프로그램을 개발하다 보면 WPF(Windows Presentation Foundation)와 함께 MVVM(Model-View-ViewModel)이라는 용어를 자주 접하게 됩니다. 특히 규모가 큰 프로젝트나 유지보수가 중요한 업무용 프로그램에서는 MVVM 패턴이 사실상 표준처럼 사용되고 있습니다.
이번 글에서는 WPF와 MVVM이 무엇인지, 왜 사용하는지, 그리고 실제 개발 시 어떤 장점이 있는지 자세하게 알아보겠습니다.
WPF(Windows Presentation Foundation)란?
WPF는 Microsoft에서 제공하는 Windows 데스크톱 애플리케이션 개발 프레임워크입니다. .NET Framework에서 처음 등장했으며 현재는 .NET 6, 7, 8, 9 환경에서도 계속 발전하며 사용되고 있습니다.
기존 WinForms보다 더욱 강력한 UI 표현 능력을 제공하며 다음과 같은 특징을 가지고 있습니다.
- XAML을 이용한 UI 설계
- 뛰어난 그래픽 표현
- 데이터 바인딩(Data Binding)
- 스타일 및 템플릿 지원
- 애니메이션 기능
- 다양한 컨트롤 제공
- 해상도 독립적인 UI
특히 XAML을 이용하여 화면(UI)과 프로그램 로직을 분리할 수 있다는 점이 가장 큰 특징입니다.
MVVM(Model-View-ViewModel)이란?
MVVM은 WPF에서 가장 많이 사용하는 아키텍처 패턴입니다.
프로그램을 크게 세 가지 영역으로 분리하여 개발합니다.
1. Model
Model은 프로그램의 데이터를 담당합니다.
예를 들어
- 회원 정보
- 제품 정보
- 주문 정보
- 데이터베이스 접근
- API 통신
등의 실제 데이터를 관리합니다.
public class User {
public string Name { get; set; }
public int Age { get; set; }
}
Model은 UI를 전혀 알지 못합니다.
2. View
View는 사용자가 보는 화면입니다.
WPF에서는 대부분 XAML로 작성합니다.
예를 들어
- Button
- TextBox
- DataGrid
- ListView
- TreeView
등의 UI가 모두 View에 해당합니다.
View는 데이터를 표시하는 역할만 수행하며 비즈니스 로직은 최소화하는 것이 좋습니다.
3. ViewModel
MVVM의 핵심입니다.
View와 Model을 연결하는 역할을 수행합니다.
ViewModel에서는
- 데이터 제공
- 버튼 클릭 처리
- 명령(Command)
- 화면 상태 관리
- 데이터 검증
등을 담당합니다.
View는 ViewModel의 속성과 명령(Command)에 바인딩만 수행합니다.
MVVM 구조
사용자
↓
View(XAML)
↓
Data Binding
↓
ViewModel
↓
Model
↓
Database / API
View는 Model을 직접 접근하지 않습니다.
반드시 ViewModel을 통해 데이터를 주고받습니다.
Data Binding이란?
MVVM에서 가장 중요한 기능이 바로 Data Binding입니다.
예를 들어 TextBox와 ViewModel을 연결하면
<TextBox Text="{Binding UserName}" />
ViewModel
public string UserName
{
get => _userName;
set
{
_userName = value;
OnPropertyChanged();
}
}
사용자가 TextBox에 입력하면 ViewModel의 값이 자동으로 변경됩니다.
반대로 ViewModel의 값을 변경하면 화면도 자동으로 업데이트됩니다.
이러한 기능 덕분에 개발자는 UI를 직접 수정하는 코드를 거의 작성하지 않아도 됩니다.
ICommand
버튼 클릭도 MVVM에서는 직접 이벤트를 사용하지 않습니다.
대신 Command를 이용합니다.
<Button Content="저장"
Command="{Binding SaveCommand}" />
ViewModel
public ICommand SaveCommand { get; }
버튼을 클릭하면 SaveCommand가 실행됩니다.
덕분에 코드 비하인드(Code Behind)를 거의 사용하지 않게 됩니다.
INotifyPropertyChanged
ViewModel에서 가장 많이 구현하는 인터페이스입니다.
속성이 변경되면 화면에 자동으로 알려주는 역할을 합니다.
public event PropertyChangedEventHandler PropertyChanged;
이 기능이 있어야 화면과 데이터가 항상 동기화됩니다.
ObservableCollection
목록 데이터를 표시할 때 가장 많이 사용하는 컬렉션입니다.
ObservableCollection<User>
일반 List와 달리
- 추가
- 삭제
- 수정
시 화면이 자동으로 갱신됩니다.
DataGrid, ListView, ListBox에서 거의 필수적으로 사용됩니다.
MVVM 프로젝트 구조 예시
Project
├── Models
│ User.cs
│ Product.cs
│
├── ViewModels
│ MainViewModel.cs
│ LoginViewModel.cs
│
├── Views
│ MainWindow.xaml
│ LoginWindow.xaml
│
├── Services
│ DatabaseService.cs
│ ApiService.cs
│
├── Commands
│ RelayCommand.cs
│
└── App.xaml
프로젝트 규모가 커져도 구조를 이해하기 쉽고 유지보수가 편리합니다.
MVVM의 장점
1. 유지보수가 쉽다
UI와 비즈니스 로직이 분리되어 있어 수정 범위가 명확합니다.
2. 테스트가 쉽다
ViewModel은 UI와 독립적이므로 단위 테스트(Unit Test)를 작성하기 쉽습니다.
3. 협업에 유리하다
디자이너는 XAML(View)을, 개발자는 ViewModel과 Model을 각각 담당할 수 있습니다.
4. 코드 재사용성이 높다
동일한 ViewModel을 여러 화면에서 재사용할 수 있으며, 공통 기능을 모듈화하기도 쉽습니다.
5. 대규모 프로젝트에 적합하다
수백 개 이상의 화면을 가진 ERP, MES, CRM, SCM 같은 업무용 시스템에서도 체계적인 구조를 유지할 수 있습니다.
MVVM의 단점
물론 단점도 있습니다.
- 처음 배우기 어렵다.
- 프로젝트 구조가 다소 복잡하다.
- 작은 프로젝트에서는 오히려 개발 속도가 느려질 수 있다.
- Data Binding과 Command 개념을 이해하는 데 시간이 필요하다.
하지만 프로젝트 규모가 커질수록 이러한 초기 비용 이상의 효과를 얻을 수 있습니다.
자주 사용하는 MVVM 라이브러리
실무에서는 기본 MVVM 구현 외에도 생산성을 높여주는 라이브러리를 함께 사용하는 경우가 많습니다.
- CommunityToolkit.Mvvm
- Prism
- ReactiveUI
- Caliburn.Micro
이들 라이브러리는 Command, DI(의존성 주입), 이벤트 처리, 내비게이션, 메시징 등을 간편하게 구현할 수 있도록 지원합니다.
'Programming > C#.NET' 카테고리의 다른 글
| C#에서 Dynamic하게 DLL의 Entity 타입 찾기 (AppDomain vs BuildManager) (0) | 2026.07.20 |
|---|---|
| [C#] WPF MVVM 메모장 만들기 강좌 (0) | 2026.07.09 |
| [C#] WPF 기초 강좌 #3 (0) | 2026.07.07 |
| [C#] WPF 기초 강좌 #2 (0) | 2026.07.05 |
| [C#] WPF 기초 강좌 #1 (0) | 2026.07.01 |