CommunityToolkit.Mvvm Attributes Framework에서 사용하기

CommunityToolkit 같은경우 우리 닷넷회원님들께서 많이 언급하신 라이브러리기도 합니다.
저도 MvvmLight, Prism 등 여러 라이브러리를 사용해보았고 CommunityToolkit도 정말 잘 사용하고 있습니다 (Microsoft.Toolkit 등 여러 라이브러리가 혼재해서 제 프로그램 내역들도 정말 엉망진창이네요…)

아래는 닷넷데브에서 닷넷 회원분들께서 강좌를 올렸던 내용들입니다. 좋은분들이 좋은내용 적으신거니 한번 또 봐도 좋을듯 해요…

(관련 글을 올리신분들께 감사드립니다.)

아무튼 요근래 CommunityToolKit을 사용하는 주된 이유중에 하나는 Code Generator가 아닐까 하는데요.

private string _greeting = string.Emtpy;
public string Greegting
{
    get => _greeting;
    set => SetProperty(ref _greeting, value);
}

private ICommand _testCommand;
public ICommand TestCommand =>
    _testCommand ?? (_testCommand = new RelayCommand(얄라리얄라); // 물론 다른방식으로 구현하기도 하지요?

Code Generator 즉 툴킷어트리뷰트를 사용하지 않을때, 규모가 작은 ViewModel 경우 감당가능한 정도지만, 수많은 프로퍼티에 커맨드를 구현하고 있노라면 유지보수 측면도, 신규개발적인 측면에서도 매우 피로한 상황이 생기게 됩니다… (저만 그런건지…)

그래서 아래와 같이 사용하는 경우가 많죠

// 위에 partial 뷰모델이겠죠~~?
[ObservableProperty] private string _greeting = string.Empty;
[RelayCommand]
private void 얄라리얄라() {}

너무나도 보기가 편해졌기도 했고, 사용도 편리해진 것 같아요.
심지어 _greeting에서 생성된 Greeting 도 접근이 가능해요!, 또한 xaml에도 얄라리얄라커맨드를 작성할 수 있죠!

private void 얄라리얄라()
{
    Greeting = "사랑해요";
}

이제 저희 회사 프로그램에 한번 리팩터링 겸 진행을 해볼까? 하니 안되는 겁니다(헉)
분명 어트리뷰트는 작성했는데… 어… 테스트 프로젝트에서는 됐는데 왜 여기선 안될까요?

아래사진은 Framework 4.6.2에서의 소스코드 사진입니다.
image

아마 저뿐만 아니라 몇몇 분들도 잉~~ 이건 Core3.1 이상만 되는건가보다… 그냥 기존대로 사용해야지… 라고 생각하고 저처럼 (몇년동안) 기존에 사용했던 대로 사용하셨을 것 같아요.

그런분들중 몇몇분은 아 그래도 저거 쓰고싶은데 라고 생각하시는 분들이 있을 것 같아서 팁글을 올려보아요.

  1. 새 프로젝트를 생성해요. 새 프로젝트는 Framework로 생성하지말고, Core쪽으로 생성해줍니당 ()


    image

  2. 이렇게 생성이 되었다면 프로젝트 파일을 편집합니다.
    image

  3. 요기서 TargetFramework를 변경해요.

    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net462</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <UseWPF>true</UseWPF>
    </PropertyGroup>
  1. 저는 여기서 langversion까지 변경해요. 전 11로 변경해보도록 하겠습니다. 물론 lastest나 다른 것으로 지정하셔도 상관 없지…않나 생각해요. 근데 전 딱 픽스해야 다른분들 협업할때도 피곤하지가 않아서 고정하는 편입니다.
    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net462</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <UseWPF>true</UseWPF>
        <LangVersion>11</LangVersion>
    </PropertyGroup>
  1. 그뒤 Community Toolkit을 받은 후 뷰모델을 생성해봅니다. 이후 ObservableObject를 상속받아요. 물론 ViewModelBase를 새로만들어서 뭐 하는건 생략하겠습니다. 그리고
    image

  2. 이후 한번 코드를 작성해볼게요~~
    image

야호~~ 정상적으로 생성이 되었어요. 디자인에서도 잘 적용되구요. 실제로 빌드가 잘되고 작동이 잘 되는지 한번 확인해봅시다!

  • Framework 4.6.2가 아닌거 아닌가요?
    → 최대 4.6.2가 설치된 환경에서도 테스트 진행해보니 잘 돌아가더라구요.

애로사항이 있어 Core로 넘어가지 못하는 분들께 좋은 팁이 되셨길 바랍니다.

잘못된 정보나 개선할 점이 있으면 댓글 남겨주시면 정정하겠습니다. 그게 제 성장이 되는 길이기도 하니까요. 감사합니당~~

(적고보니 별거 아니기도하네요… 으윽)

3 Likes

헐…?
프레임워크 버전과 언어 버전은 같이 움직여야하는게아니였나요…?
https://www.csharpstudy.com/CSharp/CSharp-version.aspx

3 Likes

헉…? 근데 제가 서비스하고있는 플랫폼중엔 Framework 3.5를 사용중인 곳도 있는데, 이곳은 C# 7.3을 사용하여 빌드중인데 저 도표대로라면 C# 3.0만 사용할터인데…

또한 4.5로 배포중인 서비스도 7.3으로 배포하고 있긴한데요…

심지어 지금 따로 서비스중인건 4.8에 10로 빌드해서 내보냈는데 지난 1년간 큰 문제가 없었는데… 문제가 있을까요? 문제가 있으면 당장 내일 언어버전 내리고 맞춰 작업후 다시 배포해야하겠네요…

(인터넷 문제로 댓글이 이상하게 써졌어요…)

2 Likes

사용 중인 .net 버전에서 권장하는 c# 버전 이상을 선택할 수는 있지만 지원하지는 않는 것으로 알고 있습니다. 즉 혹시나 컴파일이 안될 수도 있고, 만약 오류가 발생하더라도 지원은 받을 수 없을 거에요.

2 Likes

저도 처음엔 지원을 안하는게 당연하다고 생각하고, 언어레벨을 올린후 Windows7 피시 LTSB 피시 등 여러군데에서 테스트를 진행했는데 ‘일단’ 작동해서 당황했었어요.

물론 Visual Studio 내에선 자동으로 언어레벨을 선택하도록 강제했으니 상위 언어를 선택함으로 생기는 문제는 오롯이 저이기 때문에…

일단 이 팁은 언어버전 선택이 주는 아니었긴 하지만…:thinking:

2 Likes

@박진호 안전성 문제와는 별개로, Framework에서도 Attributes 자동 생성을 사용할 수 있는 방법을 소개해주셔서 감사합니다. 저도 실무 현장에서 .NET Framework에서는 이 기능을 사용할 수 없기 때문에 .NET Core 6.0, 그리고 2022 이상에서만 사용이 가능하다고 대응을 하고 있었거든요.

2 Likes