.NET Community Toolkit 8.4 릴리스를 공식 발표합니다. MVVM Toolkit 생성기의 partial 프로퍼티 지원, 새로운 분석기, 버그 수정 및 개선 사항 등 다양한 업데이트가 포함되었습니다.
URL: https://devblogs.microsoft.com/dotnet/announcing-the-dotnet-community-toolkit-840/
Title: .NET Community Toolkit 8.4 발표! MVVM의 partial 프로퍼티 지원, 새 분석기 등! - .NET Blog
.NET Community Toolkit 8.4 릴리스의 공식 출시를 기쁘게 발표합니다! 이번 새 버전에는 MVVM Toolkit 생성기를 위한 partial 프로퍼티 지원, 새로운 분석기, 버그 수정 및 개선 사항 등 다양한 업데이트가 포함되어 있습니다!
항상 그렇듯이, Toolkit을 사용하고 있는 Microsoft 내부 팀들뿐 아니라 커뮤니티의 다른 개발자 여러분이 보내주신 모든 피드백에 깊이 감사드립니다. 제기된 모든 이슈, 버그 보고, 의견과 피드백은 .NET Community Toolkit 전체에 걸친 기능 작업을 계획하고 우선순위를 정하는 데 계속해서 큰 도움이 되고 있습니다. 이 프로젝트에 기여하고 .NET Community Toolkit을 더 나은 방향으로 만들어 주시는 모든 분들께 감사드립니다! 🎉
다음은 .NET Community Toolkit 8.4의 주요 변경 사항입니다.
MVVM Toolkit 소스 생성기에 대한 가장 인기 있는 기능 요청 중 하나가 partial 프로퍼티 지원이었는데, .NET 9 SDK에서 제공되는 새로운 C# 언어 기능 덕분에 이제 사용할 수 있게 되었습니다! 구체적으로, MVVM Toolkit 소스 생성기는 이제 partial 프로퍼티와 semi-auto 프로퍼티(일명 field 키워드)를 활용하여 다음과 같이 관찰 가능한(Observable) 프로퍼티를 정의할 수 있습니다:
이는 다음과 같은 중요한 개선을 제공합니다:
new, sealed, override, required.[ObservableProperty]가 완전히 AOT 안전(AOT safe)해집니다!물론 이번 릴리스에는 완전히 새로운 코드 수정기(code fixer)도 포함되어 있습니다. 이 수정기는 [ObservableProperty]가 필드에 적용된 코드를 partial 프로퍼티로 마이그레이션하는 작업을 자동화할 수 있으며, 솔루션 전체의 모든 발생 위치를 한 번의 클릭으로 수정할 수 있습니다! Visual Studio에서 물결 밑줄(squiggly line)에 마우스를 올리고 제안된 코드 수정을 선택하기만 하면 됩니다:
특히 CsWinRT를 사용하고(즉 UWP .NET 9 앱 또는 WinUI 3 앱이 있고) Native AOT 지원이 필요한 경우, [ObservableProperty]의 모든 사용을 partial 프로퍼티로 전환할 것을 권장합니다. 더 명확한 코드, 더 나은 언어 지원, 그리고 많은 새 기능을 얻을 수 있습니다. 꼭 사용해 보시고 피드백을 공유해 주세요!
참고
partial 프로퍼티 지원을 사용하려면 C# 미리 보기(preview)가 필요합니다. .csproj 파일 또는 가져오는 .props 파일(예: Directory.Build.props)에 <LangVersion>preview</LangVersion>을 추가하여 활성화할 수 있습니다. 생성된 코드에서 field 키워드를 사용하기 때문에 필요합니다.
MVVM Toolkit의 주요 투자 영역 중 하나는 풍부한 진단 분석기(diagnostic analyzer) 세트입니다. 이 분석기는 코드가 올바르게 작성되었는지, 흔한 실수를 피하고 있는지 확인하는 데 도움을 줍니다. 이러한 분석기들은 다양한 항목을 다룹니다(예: [ObservableProperty] 멤버에 대해 지원되지 않는 타입, 주석 처리된 타입에 대한 잘못된 선언 등). 그리고 MVVM Toolkit의 각 릴리스마다 새로운 분석기가 추가됩니다. 8.4 릴리스 역시 이 흐름을 이어가며 다음과 같은 새로운 진단을 도입합니다:
[ObservableProperty]를 사용할 때 C# 언어 버전이 ‘preview’로 설정되어야 합니다(.csproj/.props 파일에 <LangVersion>preview</LangVersion> 옵션이 설정되어야 함).”.[ObservableProperty]를 사용하는 필드는 대신 partial 프로퍼티로 변환할 수 있으며, 이를 권장합니다(변환하면 개발자 경험이 개선되고 다른 생성기와 분석기가 생성된 프로퍼티를 올바르게 볼 수 있음).”.[ObservableProperty]로 주석 처리된 프로퍼티는 인스턴스(비정적) partial 프로퍼티여야 하며, getter와 init 전용이 아닌 setter를 가져야 합니다.”.[ObservableProperty]를 사용하려면 더 높은 버전의 Roslyn이 필요합니다([ObservableProperty]를 제거하거나 필드를 대상으로 하거나, 최소 Visual Studio 2022 버전 17.12 및 .NET 9 SDK로 업그레이드).”.[ObservableProperty]를 사용하면 WinRT 시나리오(UWP XAML 및 WinUI 3 앱 등)에서 AOT 호환되지 않는 코드를 생성합니다. 대신 partial 프로퍼티를 사용해야 합니다(그렇게 하면 CsWinRT 생성기가 필요한 WinRT 마샬링 코드를 올바르게 생성할 수 있음).”.[GeneratedBindableCustomProperty]를 사용하는 타입 내부의 메서드에 [RelayCommand]를 사용하는 것은 지원되지 않습니다. 대신 수동으로 선언한 command 프로퍼티를 사용해야 합니다(GeneratedBindableCustomProperty 생성기는 MVVM Toolkit 생성기가 생성한 command 프로퍼티를 볼 수 없음).”.[ObservableProperty]를 사용하는 타입에 [GeneratedBindableCustomProperty]를 사용하는 것은 지원되지 않습니다. 대신 partial 프로퍼티를 사용해야 합니다(GeneratedBindableCustomProperty 생성기는 MVVM Toolkit 생성기가 생성한 프로퍼티를 볼 수 없음).”.[RelayCommand]를 사용하는 타입에 [GeneratedBindableCustomProperty]를 사용하는 것은 지원되지 않습니다. 대신 수동으로 선언한 command 프로퍼티를 사용해야 합니다(GeneratedBindableCustomProperty 생성기는 MVVM Toolkit 생성기가 생성한 프로퍼티를 볼 수 없음).”.[INotifyPropertyChanged] 특성을 사용하는 것은 WinRT 시나리오(UWP XAML 및 WinUI 3 앱 등)에서 AOT 호환되지 않습니다. 대신 ObservableObject에서 파생하거나 INotifyPropertyChanged를 수동으로 구현해야 합니다(그렇게 하면 CsWinRT 생성기가 필요한 WinRT 마샬링 코드를 올바르게 생성할 수 있음).”.[ObservableObject] 특성을 사용하는 것은 WinRT 시나리오(UWP XAML 및 WinUI 3 앱 등)에서 AOT 호환되지 않습니다. 대신 ObservableObject에서 파생해야 합니다(그렇게 하면 CsWinRT 생성기가 필요한 WinRT 마샬링 코드를 올바르게 생성할 수 있음).”.[ObservableProperty]를 사용하여 WinRT 시나리오에서 AOT 호환되지 않는 ‘MVVMTK0045’ 경고를 하나 이상 생성하고 있습니다. partial 프로퍼티 및 관련 코드 수정기를 사용하려면 ‘LangVersion’을 ‘preview’로 설정해야 합니다(LangVersion=preview 설정은 partial 프로퍼티에 [ObservableProperty]를 사용하고 이러한 경고를 해결하는 데 필요).”.[ObservableProperty]를 사용하는 프로퍼티가 미완성 partial 정의 부분이 아닙니다([ObservableProperty]는 구현 부분이 없는 partial 프로퍼티 정의에 사용해야 함).”.[ObservableProperty]를 사용하는 프로퍼티가 참조로 값을 반환합니다([ObservableProperty]는 값으로 반환하는 타입의 프로퍼티에 사용해야 함).”.[ObservableProperty]를 사용하는 프로퍼티가 byref-like 값을 반환합니다([ObservableProperty]는 byref-like가 아닌 타입의 프로퍼티에 사용해야 함).”.[ObservableProperty]를 사용하는 프로퍼티가 포인터 유사(pointer-like) 값을 반환합니다([ObservableProperty]는 포인터 유사 타입이 아닌 프로퍼티에 사용해야 함).”.보시다시피 이번 릴리스에는 정말 많은 새 분석기가 포함되었습니다! 이들은 두 가지 범주로 나뉩니다:
필요할 때마다 빠른 정보(quick info)에 보기 좋게 표시됩니다:
MVVM Toolkit을 통해 생성기를 활용하는 코드가 올바르게 작성되고 버그 없이 동작한다는 점을 신뢰하실 수 있기를 바랍니다! 분석기에서 문제를 발견하거나, 아직 다뤄지지 않은 새로운 시나리오를 발견해서 전용 분석기가 필요하다고 생각하시면, GitHub 저장소에 이슈를 열어 알려 주세요.
[ObservableProperty]를 사용할 때 생성된 접근자에 특성을 추가하는 것도 이제 지원됩니다.[ObservableProperty] 필드에 사용자 지정 특성 타깃을 사용할 때 사용자 지정 진단 억제가 올바르게 동작하도록 수정되었습니다.required 한정자를 사용하는 필드에서 [ObservableProperty]를 사용하는 시나리오도 이제 지원됩니다.IndexOf<T>에서 ref readonly 사용 (#997): IndexOf<T> 확장이 이제 ref readonly를 받아, rvalue에 대해 사용하도록 의도된 것이 아님을 명확히 합니다.ReadOnlySequence<byte>에 대한 Stream 추가 (#808): ReadOnlySequence<byte>를 감싸는 읽기 전용(readonly), 탐색 가능(seekable) 스트림을 쉽게 얻기 위한 새로운 AsStream() 확장이 추가되었습니다! 기여해 주신 @paulomorgado님 감사합니다!이번 릴리스의 전체 변경 로그는 GitHub 릴리스 페이지에서 확인할 수 있습니다.
모든 소스 코드는 GitHub 저장소에서 확인할 수 있고, 일부 수기 문서는 MS Learn에서, 완전한 API 참조는 .NET API 브라우저 웹사이트에서 확인할 수 있습니다. 기여하고 싶으시다면 이슈를 열거나 경험을 공유하기 위해 언제든 연락해 주세요! Twitter에서 대화를 팔로우하려면 #CommunityToolkit 해시태그를 사용하세요. 여러분의 모든 피드백은 이 라이브러리들의 방향성을 만드는 데 큰 도움이 되었으니, 꼭 의견을 공유해 주세요!
즐거운 코딩 되세요! 💻
Category
Topics

Senior Software Engineer
저는 Microsoft의 Senior Software Engineer로, Windows 11 및 Windows 10용 새로운 Microsoft Store 앱을 개발하고 있으며, 모든 .NET 개발자를 돕기 위한 오픈 소스 라이브러리 모음인 .NET Community Toolkit의 메인테이너입니다. 2013년에 Silverlight와 이후 WinRT로 Windows 및 .NET 앱 개발을 시작했고, 그 다음 UWP로 옮겼습니다. 저는 오픈 소스 소프트웨어에 열정을 가지고 있으며 2020년부터 .NET Foundation의 멤버입니다. 또한 GitHub에서 여러 프로젝트에 정기적으로 기여하고 있습니다(예: ...
