블로그로 돌아가기
Wpf

WPF CommunityToolkit MVVM ObservableProperty 사용법 실무 가이드

wpf communitytoolkit mvvm observableproperty 사용법을 통해 CommunityToolkit.Mvvm의 ObservableProperty 어트리뷰트를 실무 코드에 적용하는 방법과 주의점을 단계별로 설명합니다.

CommunityToolkit.MvvmObservablePropertyMVVMINotifyPropertyChanged
WPF CommunityToolkit MVVM ObservableProperty 사용법을 설명하는 기술 블로그 썸네일 이미지

wpf communitytoolkit mvvm observableproperty 사용법이 필요한 상황

wpf communitytoolkit mvvm observableproperty 사용법을 배우면 ViewModel에서 반복적인 INotifyPropertyChanged 구현을 줄이고 가독성 높은 코드를 얻을 수 있습니다. 이 글에서는 설치부터 어트리뷰트 사용, 실무 예제, 주의점, 체크리스트까지 실무 적용 관점으로 정리합니다. 독자는 실제 WPF 프로젝트에 바로 적용 가능한 코드와 판단 기준을 얻을 수 있습니다.

wpf communitytoolkit mvvm observableproperty 사용법 핵심 개념

ObservableProperty는 CommunityToolkit.Mvvm에서 제공하는 소스 생성(source generator) 기반 어트리뷰트입니다. 클래스를 INotifyPropertyChanged로 설정하고 필드에 [ObservableProperty]를 붙이면 자동으로 속성(Property)과 PropertyChanged 호출 코드를 생성합니다. 이로써 수작업으로 속성에 Change 알림을 추가하던 코드를 크게 줄일 수 있습니다.

주요 포인트:

  • 소스 생성기 사용: 빌드 시점에 코드를 생성하여 런타임 오버헤드가 거의 없습니다.
  • 자동 Property 생성: private 필드로 선언하면 public 속성이 자동으로 생성됩니다.
  • 옵션: Set/Change 동작 커스터마이징, Partial 메서드를 통한 후킹 가능.

wpf communitytoolkit mvvm observableproperty 사용법 실무 예제

아래 예제는 CommunityToolkit.Mvvm을 설치하고 단순한 ViewModel에 ObservableProperty를 적용하는 방법을 보여줍니다.

  1. 패키지 설치 (NuGet)
dotnet add package CommunityToolkit.Mvvm
  1. ViewModel 예제
using CommunityToolkit.Mvvm.ComponentModel; public partial class PersonViewModel : ObservableObject { [ObservableProperty] private string name; [ObservableProperty] private int age; // 변경 후 추가 로직을 원하면 partial 메서드 사용 partial void OnNameChanged(string oldValue, string newValue) { // 이름 변경 시 추가 처리 } }
  1. XAML 바인딩 예제
<Window x:Class="MyApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="200" Width="400"> <Grid> <StackPanel Margin="20"> <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> <TextBlock Text="{Binding Age}" /> </StackPanel> </Grid> </Window>
  1. ViewModel 연결
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new PersonViewModel { Name = "홍길동", Age = 30 }; } }

위 예제는 ObservableProperty를 이용해 간결하고 안전하게 속성 변경 알림을 처리하는 기본 흐름을 보여줍니다.

ObservableProperty와 기존 방식 비교 (판단 기준표)

구분수동 INotifyPropertyChangedObservableProperty (CommunityToolkit)비고
코드량많음: 속성마다 set에 Raise 필요적음: 필드에 어트리뷰트만 추가유지보수성 개선
오류 가능성타이핑 오류, 누락 가능컴파일 타임 생성으로 누락 감소안정성 향상
확장성커스텀 로직 직접 작성 필요partial 메서드로 후킹 가능유연성 확보
빌드 영향없음빌드 시 소스생성기 실행빌드 시간 소폭 증가

언제 쓰면 좋고 언제 피해야 할까

언제 쓰면 좋은가:

  • ViewModel 속성이 많은 대규모 WPF 앱에서 반복 코드 감소가 필요할 때
  • 속성 변경 알림을 일관되게 관리하고자 할 때
  • partial 메서드를 이용해 변경 후 로직을 깔끔하게 분리하고 싶을 때

언제 피해야 하는가:

  • 프로젝트 규칙상 소스 생성기가 금지된 경우
  • 아주 단순한 소규모 프로젝트에서 외부 라이브러리 도입 부담이 있을 때
  • 빌드 파이프라인에서 소스 생성기에 의한 문제(예: 레거시 빌드 도구)가 발생할 때

실무 체크리스트

  • 프로젝트에 CommunityToolkit.Mvvm 패키지 설치 여부 확인
  • ViewModel이 ObservableObject 또는 INotifyPropertyChanged를 구현하도록 설계
  • 필드에 [ObservableProperty] 어트리뷰트 적용 규칙 문서화
  • partial 메서드로 변경 후 로직 테스트 추가
  • 빌드 서버에서 소스 생성기 문제 재현 테스트
  • 성능/메모리 영향 검토 (특히 많은 속성 변경 시)

성능·보안·운영 주의점

성능:

  • 소스 생성기는 런타임 오버헤드가 거의 없지만, 빌드 시 소스가 생성되므로 빌드 시간이 소폭 증가할 수 있습니다. CI 빌드에서 빌드 타임을 모니터링하세요.
  • 많은 빈번한 속성 변경이 발생하는 경우 PropertyChanged 이벤트 핸들러에서 무거운 작업을 하면 UI 응답성이 저하됩니다. UI 스레드에서 무거운 로직은 비동기로 오프로드하세요.

보안:

  • ObservableProperty 자체는 보안 리스크를 만들지 않습니다. 다만 속성에 민감한 정보를 직접 바인딩하지 않도록 주의하세요.

운영:

  • 빌드 시스템(예: CI/CD)에서 CommunityToolkit.Mvvm 버전 차이로 인한 빌드 실패가 발생할 수 있으니 버전 고정과 테스트가 필요합니다.
  • 네이밍 규칙과 partial 메서드 사용 규칙을 팀 내에 문서화하여 일관성을 유지하세요.

wpf communitytoolkit mvvm observableproperty 사용법 실무 팁

  • partial void OnPropertyNameChanged(oldValue, newValue) 서명을 활용해 변경 후 로직을 깔끔히 분리합니다.
  • [ObservableProperty]에 접근 제한자(private/protected)를 적용해 내부 필드 보호와 공개 속성 제어를 함께 사용하세요.
  • 컬렉션 변경은 ObservableCollection<T>를 사용하고, 항목의 개별 속성 변경은 항목 자체가 INotifyPropertyChanged를 구현해야 합니다.

자주 묻는 질문

Q1: ObservableProperty로 모든 속성을 대체해도 되나요? A1: 대부분 경우 대체가 가능하지만, 소스 생성기를 사용할 수 없는 환경이나 아주 단순한 코드베이스에서는 유지 방식에 따라 판단하세요. 외부 라이브러리 도입 비용과 빌드 환경을 고려해야 합니다.

Q2: partial 메서드는 어떻게 사용하나요? A2: 예를 들어 [ObservableProperty]로 생성된 속성 Name에 대해 partial void OnNameChanged(string oldValue, string newValue)를 선언하면 값 변경 시 자동으로 호출됩니다. 이곳에 검증이나 추가 처리를 넣을 수 있습니다.

Q3: ObservableProperty 사용 시 네임스페이스 충돌이나 빌드 오류가 발생하면? A3: 패키지 버전 불일치나 SDK 버전 문제일 가능성이 큽니다. CommunityToolkit.Mvvm 버전을 고정하고, 프로젝트 SDK(예: net6.0, net7.0)와 호환되는지 확인하세요. 빌드 로그에서 소스 생성기 관련 에러 메시지를 확인합니다.

Q4: ObservableProperty와 Fody.PropertyChanged 같은 다른 도구와 비교하면? A4: Fody는 IL 위빙 방식, CommunityToolkit은 소스 생성기 방식입니다. 소스 생성기는 컴파일 타임에 안전하게 코드가 생성되고 런타임 오버헤드가 거의 없습니다. 반면 IL 위빙은 빌드 후 단계에서 수정하므로 도구 호환성에 민감할 수 있습니다.

정리

  • ObservableProperty는 CommunityToolkit.Mvvm의 소스 생성 기반 속성 자동 생성 도구입니다.
  • 수동 INotifyPropertyChanged 구현을 줄여 코드 가독성과 유지보수성을 높입니다.
  • 설치: NuGet 패키지 CommunityToolkit.Mvvm 추가 후 [ObservableProperty] 적용.
  • 주의: 빌드 환경 및 CI에서 소스 생성기 호환성 확인이 필요합니다.
  • 체크리스트를 통해 설치, 코드 규약, 테스트, 빌드 파이프라인 검증을 진행하세요.