iconDreamine
← 지식 Q&A 목록
Dreamine 입문 · Published

CommunityToolkit.Mvvm과 Dreamine은 무엇이 다른가요?

요청 판정 Supported 개정 1 / 1 조회 834초 동안 분석2026-07-20 23:41
직접 답변

핵심 차이는 범위와 구조입니다. CommunityToolkit.Mvvm은 런타임 기능까지 제공하는 범용 MVVM 툴킷인 반면, Dreamine.MVVM.Attributes는 속성과 명령 생성을 표시하는 선언 계층입니다. Dreamine 샘플은 여기에 ViewModelBase·Event 클래스·플랫폼별 UI 계층을 조합하는 구조를 보여 줍니다.

핵심 코드 근거

직접 근거

Blazor DI 구성 코드 선언

ControlsEvent와 ControlsViewModel을 각각 Scoped 서비스로 등록합니다.

builder.Services.AddScoped<ControlsEvent>(); builder.Services.AddScoped<ControlsViewModel>();
builder.Services.AddScoped<LightBulbModel>();
builder.Services.AddScoped<LightBulbEvent>();
builder.Services.AddScoped<LightBulbViewModel>();
builder.Services.AddScoped<ControlsEvent>();
builder.Services.AddScoped<ControlsViewModel>();
builder.Services.AddScoped<DreamineDialogService>();

var app = builder.Build();

app.UseStaticFiles();
app.UseAntiforgery();

app.MapRazorComponents<App>()
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Blazor/Program.cs:16-28
직접 근거

ClickMe 명령 선언 코드 선언

ClickMe 부분 메서드가 `[DreamineCommand("Event.ClickMe")]`로 Event 메서드 경로를 지정합니다.

[DreamineCommand("Event.ClickMe")] private partial void ClickMe();
    /// \endif
    /// \if EN
    /// <para>Performs the click me operation.</para>
    /// \endif
    /// </summary>
    [DreamineCommand("Event.ClickMe")]
    private partial void ClickMe();

    // ── CheckBox (순수 UI 상태; 커맨드 로직 없음) ───────────
    /// <summary>
    /// \if KO
    /// <para>check1 값을 보관합니다.</para>
    /// \endif
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Shared/ViewModels/ControlsViewModel.cs:185-197
직접 근거

CommunityToolkit.Mvvm 패키지 버전 코드 선언

저장소가 CommunityToolkit.Mvvm 8.4.2를 중앙 패키지 버전으로 관리합니다.

<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<Project>
  <PropertyGroup>
    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
  </PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.2" />
    <PackageVersion Include="Markdig" Version="0.38.0" />
    <PackageVersion Include="Microsoft.Playwright" Version="1.51.0" />
    <PackageVersion Include="Microsoft.VisualStudio.SDK" Version="17.14.40265" ExcludeAssets="runtime" NoWarn="NU1604" />
    <PackageVersion Include="Microsoft.VSSDK.BuildTools" Version="17.14.2120" PrivateAssets="all" NoWarn="NU1604" />
    <PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0" />
    <PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.13.0" />
    <PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
20_SOURCES/Directory.Packages.props:1-13
직접 근거

ControlsEvent 연결 코드 선언

ControlsViewModel이 `[DreamineEvent]` 필드로 ControlsEvent를 선언합니다.

[DreamineEvent] private ControlsEvent _event;
    /// \endif
    /// \if EN
    /// <para>Stores the event value.</para>
    /// \endif
    /// </summary>
    [DreamineEvent]
    private ControlsEvent _event;

    // ── Button ────────────────────────────────────────────
    /// <summary>
    /// \if KO
    /// <para>Click Count 값을 가져옵니다.</para>
    /// \endif
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Shared/ViewModels/ControlsViewModel.cs:153-165
직접 근거

ControlsEvent의 책임 코드 선언

ControlsEvent가 실제 동작을 처리하고 ControlsViewModel은 DreamineCommand를 통해 메서드를 호출만 한다고 설명합니다.

public sealed class ControlsEvent

namespace SampleCrossUi.Shared.ViewModels;

/// <summary>
/// \if KO
/// <para>Controls 데모의 실제 동작(버튼 클릭/라디오 선택/LED 토글/텍스트 클리어 등)을 처리합니다. ControlsViewModel은 [DreamineCommand]를 통해 이 클래스의 메서드를 호출만 한다.</para>
/// \endif
/// \if EN
/// <para>Encapsulates controls event functionality and related state.</para>
/// \endif
/// </summary>
public sealed class ControlsEvent
{
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Shared/ViewModels/ControlsEvent.cs:3-15
직접 근거

ControlsViewModel의 기반 형식 코드 선언

Dreamine 속성·인터페이스·ViewModel 네임스페이스를 사용하며 ControlsViewModel이 ViewModelBase를 상속합니다.

public partial class ControlsViewModel : ViewModelBase, IActivatable, IVisibilityAware
/// <summary>
/// \if KO
/// <para>Controls View Model 기능과 관련 상태를 캡슐화합니다.</para>
/// \endif
/// \if EN
/// <para>Controls showcase ViewModel. Platform-independent. Reusable across WPF, WinForms, Blazor, and MAUI. Actual behavior lives in <see cref="ControlsEvent"/>; pure UI-only state (no business logic attached) uses [DreamineProperty] directly here.</para>
/// \endif
/// </summary>
public partial class ControlsViewModel : ViewModelBase, IActivatable, IVisibilityAware
{
    // ── ViewSwitcher.NotifyShown/NotifyHidden 데모 ──────────
    /// <summary>
    /// \if KO
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Shared/ViewModels/ControlsViewModel.cs:90-102
직접 근거

Dreamine.MVVM.Attributes 비교표 코드 선언

CommunityToolkit.Mvvm은 런타임 로직과 코드 생성 마커를 제공하고, Dreamine.MVVM.Attributes는 선언 계층에 집중한다고 설명합니다.

## 비교

## 비교

| 패키지 | 역할 | 런타임 로직 | 코드 생성 마커 |
|---|---|---:|---:|
| CommunityToolkit.Mvvm | MVVM 툴킷 | Yes | Yes |
| Prism | MVVM 프레임워크 | Yes | No |
| Dreamine.MVVM.Attributes | Attribute 선언 | No | Yes |

Dreamine.MVVM.Attributes는 전체 런타임 프레임워크가 아니라 선언 계층에 집중합니다.

---
20_SOURCES/100. Library/Attributes/README_KO.md:350-362
직접 근거

MAUI UI 전용 코드비하인드 사례 코드 선언

버튼 이벤트 처리기에서 DreamineMessageBox를 호출하고 결과를 UI 레이블에 직접 반영합니다.

private async void OnShowMessageBoxClicked(object? sender, EventArgs e)
    /// \endif
    /// </param>
    private async void OnShowMessageBoxClicked(object? sender, EventArgs e)
    {
        var result = await DreamineMessageBox.ShowAsync(
            "DreamineMessageBox 데모입니다.\n버튼을 클릭하거나 기다리면 자동으로 닫힙니다.",
            "MessageBox Demo",
            autoClickDelaySeconds: 5);
        ResultLabel.Text = $"Last result: MessageBox → {result}";
    }

    /// <summary>
    /// \if KO
20_SOURCES/998. DEMO/000. Sample/050. CrossUi/SampleCrossUi.Maui/Views/PopupPage.xaml.cs:50-62

추가 설명

핵심 차이

저장소의 공식 비교표에 따르면 CommunityToolkit.Mvvm은 런타임 로직과 코드 생성 마커를 모두 제공하지만, Dreamine.MVVM.Attributes는 런타임 로직 없이 코드 생성용 선언만 담당합니다. 따라서 CommunityToolkit.Mvvm 전체와 직접 대응하는 것은 Dreamine 전체가 아니라 `Dreamine.MVVM.Attributes` 계층입니다.

Dreamine의 코드 구성

Dreamine 샘플의 `ControlsViewModel`은 `ViewModelBase`를 상속하고, `[DreamineProperty]`로 상태를 선언하며, `[DreamineEvent]`로 `ControlsEvent`를 연결합니다. 명령은 `[DreamineCommand("Event.ClickMe")] private partial void ClickMe();`처럼 실제 처리 대상 경로를 선언합니다. ```csharp [DreamineEvent] private ControlsEvent _event; [DreamineCommand("Event.ClickMe")] private partial void ClickMe(); ``` 검증된 흐름은 `ViewModel의 DreamineCommand 선언 → Event.ClickMe 호출 대상`까지입니다. 제공된 발췌에는 생성기 구현이나 UI 바인딩이 없으므로, 생성되는 Command 프로퍼티 이름과 그 이후 호출 세부 과정은 확정할 수 없습니다.

CommunityToolkit.Mvvm과 비교하면

CommunityToolkit.Mvvm은 이 저장소에서도 별도 NuGet 패키지(버전 8.4.2)로 관리됩니다. 반면 Dreamine 샘플은 실제 동작을 `ControlsEvent`에 두고 ViewModel이 `[DreamineCommand]`를 통해 호출만 하도록 명시합니다. 즉 코드 편집 관점에서는 CommunityToolkit의 런타임 기능을 Dreamine Attributes 하나로 대체한다고 보기보다, Dreamine의 선언·생성 계층과 별도의 ViewModel/Event 구조를 함께 사용하는 방식으로 이해하는 것이 정확합니다.

코드 배치 기준

Dreamine 샘플이 보여 주는 배치는 명확합니다. UI 상태는 ViewModel의 `[DreamineProperty]`에 두고, 버튼 클릭처럼 실제 동작은 `ControlsEvent`에 둔 뒤 ViewModel의 `[DreamineCommand]` 선언으로 연결합니다. 플랫폼 구성 계층에서는 `ControlsEvent`와 `ControlsViewModel`을 각각 DI에 등록합니다. 다만 팝업 샘플처럼 UI 전용 기능은 MAUI XAML 코드비하인드에서 직접 처리하는 사례도 있으므로, 모든 동작을 반드시 Event로 옮긴다고 단정할 수는 없습니다.

확인되지 않은 내용

  • 제공된 발췌만으로 `[DreamineCommand]`가 생성하는 Command 프로퍼티의 정확한 이름과 구현은 확인할 수 없습니다.
  • Dreamine 전체 런타임 라이브러리와 CommunityToolkit.Mvvm의 기능별 완전한 대응 관계는 제공된 발췌만으로 판단할 수 없습니다.
기술 세부정보

정규화된 질문: CommunityToolkit.Mvvm과 Dreamine은 무엇이 다른가요?

Source · Dreamine.MVVM.Attributes 비교표 source-1 · 직접 근거 · confidence 1.00
Source · ControlsViewModel의 기반 형식 source-2 · 직접 근거 · confidence 1.00
Source · ControlsEvent 연결 source-3 · 직접 근거 · confidence 1.00
Source · ClickMe 명령 선언 source-4 · 직접 근거 · confidence 1.00
Source · CommunityToolkit.Mvvm 패키지 버전 source-5 · 직접 근거 · confidence 1.00
Source · ControlsEvent의 책임 source-6 · 직접 근거 · confidence 1.00
Source · Blazor DI 구성 source-7 · 직접 근거 · confidence 1.00
Source · MAUI UI 전용 코드비하인드 사례 source-8 · 직접 근거 · confidence 1.00
검색 원본
서버 저장소 소스 코드
생성 모델
codex-cli:default
생성 정책
dreamine-repository-search-v4
마지막 검증
2026-07-20 23:41:20
이 답변이 유용했나요?