이번 글에서는 C#의 최신 언어 기능들과 MVVM (Model-View-ViewModel) 패턴을 결합한 WPF 애플리케이션 개발에 대해 논의하겠습니다. .NET 6/7의 시대에 우리는 각종 기능들을 더욱 효율적으로 활용할 수 있으며, MVVM 패턴을 통해 아키텍처의 청결함과 유지 관리성을 극대화할 수 있습니다.
1. MVVM 개요
MVVM 패턴은 애플리케이션의 구조를 세 가지 주요 컴포넌트로 나눕니다: Model, View, ViewModel.
- Model: 애플리케이션의 비즈니스 로직과 데이터를 담당합니다. 이 부분은 UI와 독립적입니다.
- View: 사용자에게 표시되는 UI 구성 요소입니다. WPF에서는 XAML로 정의됩니다.
- ViewModel: Model과 View 간의 연결 역할을 합니다. View에 바인딩할 수 있는 데이터를 제공하며, 뷰에서 발생한 이벤트를 처리하여 Model을 업데이트합니다.
2. .NET 6/7의 기능
.NET 6/7은 새로운 기능과 성능 개선을 제공합니다. 특히, C# 10 및 11에서는 다양한 신기능들이 추가되었고, MVVM 패턴은 이러한 기능을 최대한 활용할 수 있습니다.
2.1. Nullable Reference Types
C# 8.0부터 지원되는 Nullable Reference Types는 코드의 안전성을 높이는 데 도움을 줍니다. 이 기능은 객체가 null이 될 수 있는지를 명시적으로 나타내며, 이를 통해 NRE(Null Reference Exception) 같은 실수를 피할 수 있습니다.
csharp
public class User
{
public string? Name { get; set; }
public string Email { get; set; } = "default@example.com"; // null이 아님
}
2.2. Records
Records는 데이터 전송 객체(DTO)에 적합한 기능을 제공합니다. 데이터의 불변성을 기본으로 하며, 값 비교와 같은 기능이 간편해집니다. MVVM 패턴에서 Model을 정의할 때 유용합니다.
csharp
public record Person(string FirstName, string LastName);
3. MVVM과 Nullable Reference Types 통합
MVVM 패턴을 사용할 때, ViewModel에서 Nullable Reference Types를 활용하면 데이터 바인딩이 더욱 안전해집니다. 예를 들어, ViewModel에서 사용자의 입력을 받을 때, Nullable을 통해 입력값의 유효성을 검사할 수 있습니다.
csharp
public class UserViewModel : INotifyPropertyChanged
{
private string? _name;
public string? Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged();
}
}
}
4. MVVM과 Records 통합
Records를 활용하면 데이터를 더욱 쉽게 다룰 수 있습니다. ViewModel에서 ObservableCollection을 사용하여 데이터를 저장하고, 이 데이터를 View에 바인딩하는 예제를 살펴보겠습니다.
csharp
public class UserViewModel : INotifyPropertyChanged
{
public ObservableCollection<Person> Users { get; set; }
public UserViewModel()
{
Users = new ObservableCollection<Person>()
{
new Person("John", "Doe"),
new Person("Jane", "Doe")
};
}
}
5. WPF에서의 데이터 바인딩
WPF는 데이터 바인딩을 통해 View와 ViewModel 간의 연결을 쉽게 처리할 수 있습니다. ViewModel의 속성과 View의 UI 요소를 바인딩하는 방법을 살펴보겠습니다.
xaml
6. MVVM과 최신 C# 기능 조합하기
최신 C# 기능과 MVVM 패턴을 결합하면 더욱 간결하고 유지 보수하기 쉬운 코드를 작성할 수 있습니다. 이러한 기능들을 활용하여 비즈니스 로직을 더욱 잘 분리할 수 있으며, UI와의 종속성을 낮출 수 있습니다.
csharp
public class UserService
{
public IEnumerable<Person> GetUsers()
{
return new List<Person>()
{
new Person("Alice", "Wonderland"),
new Person("Bob", "Builder")
};
}
}
public class MainViewModel : INotifyPropertyChanged
{
private readonly UserService _userService;
public ObservableCollection<Person> Users { get; private set; }
public MainViewModel(UserService userService)
{
_userService = userService;
Users = new ObservableCollection<Person>(_userService.GetUsers());
}
}
7. 결론
MVVM 패턴은 WPF 애플리케이션에서 코드를 구조적으로 개선할 수 있는 강력한 도구입니다. .NET 6/7에서는 최신 C# 기능들과 함께 MVVM을 통합하면 더욱 안정적이고 유지 보수가 용이한 애플리케이션을 개발할 수 있습니다. Nullable Reference Types와 Records는 이러한 개발 방식을 지원하여, 코드의 명확성과 안전성을 높이는 데 기여합니다.
이 글을 통해 최신 C# 전체 기능과 MVVM 패턴을 활용한 WPF 애플리케이션 개발에 도움이 되기를 바랍니다.