CommunityToolkit.Mvvm
CommunityToolkit.Mvvm
은 Microsoft에서 제공하는 경량의 MVVM(Model-View-ViewModel) 프레임워크로, WPF, UWP, WinUI, MAUI와 같은 XAML 기반 애플리케이션 개발에서 MVVM 패턴을 더 쉽게 구현할 수 있도록 도와줍니다.
CommunityToolkit.Mvvm
의 주요 특징
ObservableObject
와 INotifyPropertyChanged
지원
INotifyPropertyChanged
를 구현하는 반복 작업을 줄여줍니다.
기존 코드:
public class ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _name; public string Name { get => _name; set { if (_name != value) { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name))); } } } }
CommunityToolkit.Mvvm
사용:using CommunityToolkit.Mvvm.ComponentModel; public partial class ViewModel : ObservableObject { [ObservableProperty] private string name; }
[ObservableProperty]
를 사용하면 자동으로PropertyChanged
이벤트가 생성됩니다.
RelayCommand
로 간편한 ICommand
생성
MVVM에서 자주 사용되는 ICommand
를 간단히 생성합니다.
기존 코드:
public ICommand SubmitCommand { get; } public ViewModel() { SubmitCommand = new RelayCommand(Submit); } private void Submit() { // 명령 로직 }
CommunityToolkit.Mvvm
사용:using CommunityToolkit.Mvvm.Input; public partial class ViewModel : ObservableObject { [RelayCommand] private void Submit() { // 명령 로직 } }
[RelayCommand]
를 사용하면SubmitCommand
가 자동 생성됩니다.
ObservableValidator
로 데이터 유효성 검증
ObservableValidator
는 ObservableObject
를 기반으로 추가적인 유효성 검사 기능을 제공합니다.
using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel.DataAnnotations;
public partial class FormViewModel : ObservableValidator
{
[ObservableProperty]
[Required(ErrorMessage = "Name is required")]
private string name;
[ObservableProperty]
[Range(18, 99, ErrorMessage = "Age must be between 18 and 99")]
private int age;
public void ValidateAll()
{
ValidateAllProperties();
}
}
- 자동 검증: 속성 변경 시 자동으로 유효성 검사를 실행합니다.
- 에러 메시지 관리:
GetErrors
메서드로 유효성 검사 결과를 확인할 수 있습니다.
Message Handling with WeakReferenceMessenger
View와 ViewModel 간의 메시지를 전달할 수 있는 강력한 메시지 전달 도구를 제공합니다.
using CommunityToolkit.Mvvm.Messaging;
public class UpdateMessage : IMessage { }
public class Sender
{
public void SendMessage()
{
WeakReferenceMessenger.Default.Send(new UpdateMessage());
}
}
public class Receiver
{
public Receiver()
{
WeakReferenceMessenger.Default.Register<UpdateMessage>(this, (r, m) =>
{
Console.WriteLine("Message Received");
});
}
}
- 메모리 누수 방지: 메시지를 Weak Reference로 관리하여 메모리 누수를 방지합니다.
Task
기반 비동기 명령 지원
ICommand
를 비동기적으로 실행할 수 있도록 AsyncRelayCommand
를 제공합니다.
using CommunityToolkit.Mvvm.Input;
public partial class ViewModel : ObservableObject
{
[RelayCommand]
private async Task LoadDataAsync()
{
await Task.Delay(1000); // 비동기 작업
}
}
장점
경량
CommunityToolkit.Mvvm
는 단순하면서도 효율적입니다. Prism이나 Caliburn.Micro와 같은 무거운 MVVM 프레임워크보다 가볍습니다.
Microsoft 공식 지원
Microsoft
에서 개발하고 관리하므로 신뢰성과 지속적인 업데이트를 기대할 수 있습니다.
소스 생성기 활용
- C#의 최신 소스 생성기 기능을 활용하여 컴파일 시간에 중복 코드를 생성합니다. 성능에도 유리합니다.
학습 곡선이 낮음
- 기존 MVVM 개념을 알고 있다면 빠르게 적응할 수 있습니다.
유효성 검사 및 메시지 전달 통합
- 데이터를 검증하거나 ViewModel 간 메시지를 전달하는 기능이 포함되어 있어 외부 라이브러리 의존성이 적습니다.
단점
심플하지만 제한적
- 복잡한 시나리오를 지원하는 Prism 또는 Caliburn.Micro 같은 강력한 기능이 필요하다면 부족할 수 있습니다.
XAML 기반 MVVM 전용
- 비 XAML UI 기술(예: WinForms, Console 애플리케이션)에는 적용하기 어렵습니다.
소스 생성기 사용 필요
- 소스 생성기 기능이 C# 최신 버전에 의존하므로, .NET 5 이상에서만 완전히 활용할 수 있습니다.
CommunityToolkit.Mvvm
사용이 적합한 경우
- 가벼운 MVVM 프레임워크를 찾고 있을 때
- 작거나 중간 규모의 프로젝트
- WPF, UWP, MAUI 또는 WinUI 기반 프로젝트
- .NET 최신 버전 사용 가능