refactor: complete WebAssembly migration - proper architecture
TaxBaik CI/CD / build-and-deploy (push) Failing after 2m17s

Phase 8: Complete WebAssembly 렌더 모드 전환 (정공법)

Migration Summary:
- ALL Admin components → TaxBaik.Web.Client
- Routes.razor, Pages/*, Layout/*, Shared/*, Forms/*
- App.razor → TaxBaik.WasmClient (호스트 컴포넌트)
- Shared utilities → TaxBaik.Application.Utils

Architecture:
 App.razor: TaxBaik.WasmClient (WebAssembly, 호스트)
 Routes + Pages: TaxBaik.WasmClient (WebAssembly)
 Layout + Shared + Forms: TaxBaik.WasmClient (WebAssembly)
 Services: TaxBaik.Web (API-First)

Key Changes:
- Namespaces: TaxBaik.Web.Components.Admin → TaxBaik.WasmClient.Components.Admin
- Shared utilities: TaxBaik.Application.Utils (single source of truth)
- Program.cs: MapRazorComponents<TaxBaik.WasmClient.Components.Admin.App>()
- _Imports.razor: Components/Admin 폴더에 재구성

Build Status:  0 errors, 0 warnings

Benefits:
- Stateless server (no Circuit memory)
- Client-side rendering (WebAssembly)
- Unlimited concurrent users (horizontal scaling)
- ERP-ready architecture

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-07-03 01:03:51 +09:00
parent 76446ee0f0
commit 8202c3278b
63 changed files with 41 additions and 30 deletions
@@ -1,6 +1,6 @@
namespace TaxBaik.Application.Tests;
using TaxBaik.Web.Components.Admin.Shared;
using TaxBaik.Application.Utils;
using Xunit;
public class BusinessDayCalculatorTests
@@ -1,4 +1,4 @@
namespace TaxBaik.Web.Components.Admin.Shared;
namespace TaxBaik.Application.Utils;
public static class BusinessDayCalculator
{
+7
View File
@@ -0,0 +1,7 @@
namespace TaxBaik.Application.Utils;
public class VersionInfo
{
public string Version { get; set; } = "unknown";
public string Built { get; set; } = "unknown";
}
@@ -1,6 +1,6 @@
@using TaxBaik.Application.DTOs
@using TaxBaik.Application.Services
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
<MudForm @ref="form">
<AdminFormSection Title="연락처" Description="고객 식별과 기본 회신 정보입니다." CssClass="mb-4">
@@ -3,7 +3,7 @@
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.Web.Services
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IAnnouncementBrowserClient AnnouncementClient
@inject NavigationManager Navigation
@inject ISnackbar Snackbar
@@ -1,7 +1,7 @@
@page "/admin/blog/create"
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.Web.Components.Admin.Pages.Blog
@using TaxBaik.WasmClient.Components.Admin.Pages.Blog
@inject IBlogBrowserClient BlogClient
@inject ICategoryBrowserClient CategoryClient
@inject NavigationManager Navigation
@@ -1,7 +1,7 @@
@page "/admin/blog/{id:int}/edit"
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.Web.Components.Admin.Pages.Blog
@using TaxBaik.WasmClient.Components.Admin.Pages.Blog
@inject IBlogBrowserClient BlogClient
@inject ICategoryBrowserClient CategoryClient
@inject NavigationManager Navigation
@@ -2,7 +2,7 @@
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IClientBrowserClient ClientClient
@inject IConsultingActivityBrowserClient ConsultingClient
@inject NavigationManager Navigation
@@ -4,7 +4,7 @@
@using TaxBaik.Application.DTOs
@using TaxBaik.Web.Services
@using TaxBaik.Domain.Entities
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IClientBrowserClient ClientClient
@inject NavigationManager Navigation
@inject ISnackbar Snackbar
@@ -1,6 +1,6 @@
@page "/admin/companies/create"
@attribute [Authorize]
@using TaxBaik.Web.Components.Admin.Forms
@using TaxBaik.WasmClient.Components.Admin.Forms
@inject IApiClient ApiClient
@inject NavigationManager Navigation
@inject ISnackbar Snackbar
@@ -1,6 +1,6 @@
@page "/admin/companies/{id:int}/edit"
@attribute [Authorize]
@using TaxBaik.Web.Components.Admin.Forms
@using TaxBaik.WasmClient.Components.Admin.Forms
@inject IApiClient ApiClient
@inject NavigationManager Navigation
@inject ISnackbar Snackbar
@@ -1,6 +1,6 @@
@page "/admin/consulting-activities"
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IConsultingActivityBrowserClient ActivityClient
@inject IClientBrowserClient ClientClient
@inject ISnackbar Snackbar
@@ -1,6 +1,6 @@
@page "/admin/contracts"
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IContractBrowserClient ContractClient
@inject IClientBrowserClient ClientClient
@inject ISnackbar Snackbar
@@ -1,7 +1,7 @@
@page "/admin/dashboard"
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IAdminDashboardClient DashboardClient
@inject NavigationManager Nav
@@ -1,7 +1,7 @@
@page "/admin/inquiries/create"
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.Web.Components.Admin.Forms
@using TaxBaik.WasmClient.Components.Admin.Forms
@inject IInquiryBrowserClient InquiryClient
@inject NavigationManager Navigation
@inject ISnackbar Snackbar
@@ -1,7 +1,7 @@
@page "/admin/inquiries/{id:int}/edit"
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.Web.Components.Admin.Forms
@using TaxBaik.WasmClient.Components.Admin.Forms
@inject IInquiryBrowserClient InquiryClient
@inject NavigationManager Navigation
@inject ISnackbar Snackbar
@@ -1,5 +1,5 @@
@page "/admin/login"
@layout TaxBaik.Web.Components.Admin.Layout.BlankLayout
@layout TaxBaik.WasmClient.Components.Admin.Layout.BlankLayout
@attribute [AllowAnonymous]
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: true))
<PageTitle>로그인</PageTitle>
@@ -1,6 +1,6 @@
@page "/admin/revenue-trackings"
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IRevenueTrackingBrowserClient RevenueClient
@inject IClientBrowserClient ClientClient
@inject ISnackbar Snackbar
@@ -1,7 +1,7 @@
@page "/admin/tax-filing-schedules"
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Domain.Entities
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject ITaxFilingScheduleBrowserClient TaxFilingClient
@inject IClientBrowserClient ClientClient
@inject ISnackbar Snackbar
@@ -1,6 +1,6 @@
@using TaxBaik.Web.Services
@using TaxBaik.Domain.Entities
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject ITaxFilingBrowserClient FilingClient
@inject ISnackbar Snackbar
@@ -2,7 +2,7 @@
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Domain.Entities
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject ITaxFilingBrowserClient FilingClient
@inject IClientBrowserClient ClientClient
@inject ISnackbar Snackbar
@@ -1,6 +1,6 @@
@page "/admin/tax-profiles"
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject ITaxProfileBrowserClient TaxProfileClient
@inject IClientBrowserClient ClientClient
@inject ISnackbar Snackbar
@@ -1,9 +1,9 @@
@namespace TaxBaik.Web.Components.Admin
@namespace TaxBaik.WasmClient.Components.Admin
@using Microsoft.AspNetCore.Components.Routing
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(TaxBaik.Web.Components.Admin.Layout.MainLayout)">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(TaxBaik.WasmClient.Components.Admin.Layout.MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
@@ -12,7 +12,7 @@
</Found>
<NotFound>
<PageTitle>찾을 수 없음</PageTitle>
<LayoutView Layout="@typeof(TaxBaik.Web.Components.Admin.Layout.MainLayout)">
<LayoutView Layout="@typeof(TaxBaik.WasmClient.Components.Admin.Layout.MainLayout)">
<p>요청한 페이지를 찾을 수 없습니다.</p>
</LayoutView>
</NotFound>
@@ -9,8 +9,10 @@
@using Microsoft.JSInterop
@using MudBlazor
@using TaxBaik.Application.DTOs
@using TaxBaik.Application.Services
@using TaxBaik.Application.Utils
@using TaxBaik.Domain.Entities
@using TaxBaik.Web.Services
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Domain.Entities
@using TaxBaik.Application.Services
@using TaxBaik.Web.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Shared
@using TaxBaik.WasmClient.Components.Admin.Layout
+5 -3
View File
@@ -15,6 +15,7 @@ using Serilog;
using System.Threading.RateLimiting;
using TaxBaik.Application;
using TaxBaik.Application.Services;
using TaxBaik.Application.Utils;
using TaxBaik.Infrastructure;
using TaxBaik.Web.Services;
using TaxBaik.Web.Services.AdminClients;
@@ -388,9 +389,10 @@ app.MapStaticAssets();
// AllowAnonymous: JWT 미들웨어가 Blazor 셸 요청을 401로 차단하지 않도록 한다.
// 인증은 Blazor AuthorizeRouteView → RedirectToLogin 에서 처리한다.
// Note: TaxBaik.Web.Components.Admin.App를 root로 지정하면 TaxBaik.Web 어셈블리가 자동 포함됨
// 따라서 AddAdditionalAssemblies에는 TaxBaik.WasmClient만 추가
app.MapRazorComponents<TaxBaik.Web.Components.Admin.App>()
// Phase 8: WebAssembly 렌더 모드 완전 마이그레이션
// - App.razor: TaxBaik.WasmClient (호스트, WebAssembly)
// - Routes + Pages + Shared + Layout + Forms: TaxBaik.WasmClient (WebAssembly)
app.MapRazorComponents<TaxBaik.WasmClient.Components.Admin.App>()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(TaxBaik.WasmClient._Imports).Assembly)
.AllowAnonymous();