WPF 개발, MVVM

Windows Presentation Foundation (WPF)는 마이크로소프트의 .NET 프레임워크에서 그래픽 사용자 인터페이스 (GUI) 애플리케이션을 만들기 위한 플랫폼입니다. WPF는 강력한 데이터 바인딩, 뛰어난 그래픽 기능 및 다양하고 유연한 UI 구성 요소들을 제공하여 개발자들이 매력적인 UI 애플리케이션을 쉽게 만들 수 있도록 합니다.

1. WPF의 특징

WPF는 다음과 같은 특징을 가지고 있습니다:

  • XAML (Extensible Application Markup Language): WPF는 UI를 구축하기 위해 XAML이라는 마크업 언어를 사용합니다. 이를 통해 레이아웃과 UI 요소를 선언적으로 정의할 수 있습니다.
  • 데이터 바인딩: WPF는 강력한 데이터 바인딩 기능을 제공하여, UI 요소와 데이터 모델 간의 연결을 쉽게 할 수 있습니다.
  • 스타일과 템플릿: UI 요소의 스타일을 정의하고, 템플릿을 통해 UI의 시각적인 요소를 변경할 수 있습니다.
  • 3D 그래픽스: WPF는 3D 그래픽스를 지원하여 보다 풍부한 사용자 경험을 제공합니다.

2. MVVM 패턴이란?

MVVM(모델-뷰-뷰모델) 패턴은 WPF 애플리케이션에서 UI와 비즈니스 로직을 분리하기 위한 아키텍처 패턴입니다. MVVM 패턴은 다음과 같은 세 가지 주요 구성 요소로 구성됩니다:

  • 모델 (Model): 애플리케이션의 데이터 및 비즈니스 로직을 포함합니다.
  • 뷰 (View): 사용자 인터페이스를 구성하며, 주로 XAML 파일로 정의됩니다.
  • 뷰모델 (ViewModel): 모델과 뷰 사이의 중재자 역할을 하며, UI에 필요한 데이터를 준비하고, 명령을 처리합니다.

2.1 MVVM의 장점

  • 코드의 재사용성을 높입니다.
  • 테스트 용이성을 증가시킵니다.
  • 유지보수성을 향상시킵니다.
  • UI와 비즈니스 로직을 분리하여 서로 간섭을 최소화합니다.

3. MVVM 패턴을 사용하는 WPF 예제

이제 MVVM 패턴을 적용한 WPF 애플리케이션의 간단한 예제를 살펴보겠습니다. 이 예제에서는 사용자 입력을 받아서 간단한 계산을 수행하는 애플리케이션을 생성합니다.

3.1 프로젝트 생성

Visual Studio에서 새 WPF 애플리케이션 프로젝트를 생성합니다. 프로젝트 이름은 “MVVMExample”으로 지정합니다.

3.2 모델 (Model)

첫 번째로, 모델 클래스를 만듭니다. 이 클래스는 계산할 두 개의 숫자를 속성으로 갖습니다.


public class CalculatorModel
{
    public double Number1 { get; set; }
    public double Number2 { get; set; }
    public double Result { get; set; }
    
    public void Add()
    {
        Result = Number1 + Number2;
    }
}

3.3 뷰모델 (ViewModel)

다음으로 뷰모델 클래스를 생성합니다. 뷰모델은 모델에 대한 접근을 관리하고, UI와 상호작용할 수 있도록 ICommand 인터페이스를 사용하여 명령을 구현합니다.


using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;

public class CalculatorViewModel : INotifyPropertyChanged
{
    private CalculatorModel _model;

    public CalculatorViewModel()
    {
        _model = new CalculatorModel();
        CalculateCommand = new RelayCommand(Calculate);
    }

    public double Number1
    {
        get => _model.Number1;
        set
        {
            _model.Number1 = value;
            OnPropertyChanged();
        }
    }

    public double Number2
    {
        get => _model.Number2;
        set
        {
            _model.Number2 = value;
            OnPropertyChanged();
        }
    }

    public double Result
    {
        get => _model.Result;
        set
        {
            _model.Result = value;
            OnPropertyChanged();
        }
    }

    public ICommand CalculateCommand { get; private set; }

    private void Calculate()
    {
        _model.Add();
        Result = _model.Result;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

3.4 커맨드 클래스 (RelayCommand)

ICommand를 구현한 RelayCommand 클래스를 추가합니다. 이 클래스는 명령을 정의하고, 실행 가능 여부를 결정하는 논리를 포함합니다.


using System;
using System.Windows.Input;

public class RelayCommand : ICommand
{
    private readonly Action _execute;
    private readonly Predicate _canExecute;

    public RelayCommand(Action execute, Predicate canExecute = null)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);

    public void Execute(object parameter) => _execute(parameter);
}

3.5 뷰 (View)

마지막으로 XAML 파일을 수정하여 UI를 구성합니다. 사용자로부터 두 개의 숫자를 입력받고, 결과를 표시하는 UI를 만듭니다.



    
        
            
            
            
            
        
    

4. MVVM 패턴 적용의 중요성

MVVM 패턴을 적용하면 애플리케이션의 유지 보수성, 확장성 및 테스트 용이성을 대폭 향상시킬 수 있습니다. UI와 비즈니스 로직 간의 분리를 통해, 개발자는 코드의 재사용성을 높일 수 있으며, UI를 변경할 필요 없이 비즈니스 로직을 수정할 수 있습니다. 또한, 뷰모델을 통해 데이터와 명령을 UI에 바인딩하여 더욱 직관적인 코드 작성이 가능해집니다.

5. 결론

WPF와 MVVM 패턴의 조합은 현대 GUI 애플리케이션 개발에 있어 강력한 도구입니다. WPF의 풍부한 UI 구성 요소와 MVVM의 구조적 접근 방식은 전문가와 초보자 모두에게 매력적인 선택이 될 것입니다. 위에서 살펴본 간단한 예제를 통해 MVVM 패턴을 WPF 애플리케이션에 효과적으로 적용하는 방법을 익혔습니다.

6. 참고 자료