From 2797473c5687f56783642381ff6c020f896caef2 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Fri, 3 Jul 2026 15:39:19 +0900 Subject: [PATCH] refactor: fully integrate Browser Client into main Web server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: Removed TaxBaik.Web.Client project (separate WASM app) Changes: - Migrated all Blazor components to TaxBaik.Web/Components/Admin - Migrated all Browser Client services to Components/Admin/Services - Updated Program.cs to use integrated components (same assembly) - Removed AddAdditionalAssemblies (no longer needed) - Updated _Imports.razor with correct namespaces Architecture: ✅ API-First: REST endpoints in TaxBaik.Web (ASP.NET Core) ✅ Client-Side: Blazor WASM components in TaxBaik.Web/Components ✅ Unified: Both API and UI served from single web server ✅ No separation: No separate client project Result: - Single deploy unit (TaxBaik.Web) - API served only from web server - Blazor renders client-side (prerender: false for protected pages) - Monolithic web app architecture Co-Authored-By: Claude Haiku 4.5 --- .../Components/Admin/_Imports.razor | 18 ------ src/TaxBaik.Web.Client/GlobalUsings.cs | 2 - src/TaxBaik.Web.Client/Pages/WasmPing.razor | 13 ----- src/TaxBaik.Web.Client/Program.cs | 53 ------------------ .../TaxBaik.Web.Client.csproj | 24 -------- .../Components/Admin/App.razor | 0 .../Components/Admin/ConfirmDialog.razor | 0 .../Components/Admin/Forms/CompanyForm.razor | 0 .../Components/Admin/Forms/InquiryForm.razor | 0 .../Components/Admin/InquiryTable.razor | 0 .../Components/Admin/Layout/BlankLayout.razor | 0 .../Components/Admin/Layout/MainLayout.razor | 0 .../Components/Admin/Pages/AdminIndex.razor | 0 .../Announcements/AnnouncementEdit.razor | 0 .../Announcements/AnnouncementList.razor | 0 .../Admin/Pages/Blog/BlogCreate.razor | 0 .../Admin/Pages/Blog/BlogEdit.razor | 0 .../Admin/Pages/Blog/BlogForm.razor | 0 .../Admin/Pages/Blog/BlogList.razor | 0 .../Admin/Pages/Clients/ClientDetail.razor | 0 .../Admin/Pages/Clients/ClientEdit.razor | 0 .../Admin/Pages/Clients/ClientList.razor | 0 .../Components/Admin/Pages/CommonCodes.razor | 0 .../Admin/Pages/Companies/CompanyCreate.razor | 0 .../Admin/Pages/Companies/CompanyEdit.razor | 0 .../Admin/Pages/Companies/CompanyList.razor | 0 .../Admin/Pages/ConsultingActivities.razor | 0 .../Components/Admin/Pages/Contracts.razor | 0 .../Components/Admin/Pages/Dashboard.razor | 0 .../Components/Admin/Pages/Faqs/FaqEdit.razor | 0 .../Components/Admin/Pages/Faqs/FaqList.razor | 0 .../Admin/Pages/Inquiries/InquiryCreate.razor | 0 .../Admin/Pages/Inquiries/InquiryDetail.razor | 0 .../Admin/Pages/Inquiries/InquiryEdit.razor | 0 .../Admin/Pages/Inquiries/InquiryList.razor | 0 .../Components/Admin/Pages/Login.razor | 0 .../Components/Admin/Pages/Logout.razor | 0 .../Admin/Pages/RevenueTrackings.razor | 0 .../Admin/Pages/SeasonSimulator.razor | 0 .../Admin/Pages/Settings/SiteSettings.razor | 0 .../Admin/Pages/TaxFilingSchedules.razor | 0 .../Admin/Pages/TaxFilings/FilingTable.razor | 0 .../Pages/TaxFilings/TaxFilingList.razor | 0 .../Components/Admin/Pages/TaxProfiles.razor | 0 .../Components/Admin/RedirectToLogin.razor | 0 .../Components/Admin/Routes.razor | 0 .../AdminClients/ICommonCodeBrowserClient.cs | 0 .../IConsultingActivityBrowserClient.cs | 0 .../AdminClients/IContractBrowserClient.cs | 0 .../IRevenueTrackingBrowserClient.cs | 0 .../ITaxFilingScheduleBrowserClient.cs | 0 .../AdminClients/ITaxProfileBrowserClient.cs | 0 .../Admin}/Services/AdminDashboardClient.cs | 0 .../Services/AnnouncementBrowserClient.cs | 0 .../Components/Admin}/Services/ApiClient.cs | 0 .../Admin}/Services/BlogBrowserClient.cs | 0 .../Admin}/Services/CategoryBrowserClient.cs | 0 .../Admin}/Services/ClientBrowserClient.cs | 0 .../CustomAuthenticationStateProvider.cs | 0 .../Admin}/Services/FaqBrowserClient.cs | 0 .../Admin}/Services/ILocalStorageService.cs | 0 .../Components/Admin}/Services/ITokenStore.cs | 0 .../Admin}/Services/InquiryBrowserClient.cs | 0 .../Admin}/Services/LocalStorageService.cs | 0 .../Admin}/Services/TaxFilingBrowserClient.cs | 0 .../Admin}/Services/TokenRefreshHandler.cs | 0 .../Admin/Shared/AdminCrudPageShell.razor | 0 .../Admin/Shared/AdminDataPanel.razor | 0 .../Admin/Shared/AdminDetailSection.razor | 0 .../Admin/Shared/AdminEditorPanel.razor | 0 .../Admin/Shared/AdminEmptyState.razor | 0 .../Admin/Shared/AdminFormActions.razor | 0 .../Admin/Shared/AdminFormSection.razor | 0 .../Admin/Shared/AdminLoginForm.razor | 0 .../Admin/Shared/AdminMetricCard.razor | 0 .../Admin/Shared/AdminPageHeader.razor | 0 .../Components/Admin/Shared/AdminShell.razor | 0 .../Admin/Shared/AdminSkeletonRows.razor | 0 .../Admin/Shared/AdminTelemetryContext.razor | 0 .../Admin/Shared/CommonCodeGroupPanel.razor | 0 .../Admin/Shared/CommonCodeListPanel.razor | 0 .../Admin/Shared/CommonCodeSelect.razor | 0 .../Admin/Shared/ConfirmDialog.razor | 0 .../Components/Admin}/_Imports.razor | 6 +- src/TaxBaik.Web/Program.cs | 11 ++-- src/TaxBaik.Web/TaxBaik.Web.csproj | 1 - .../wwwroot/index.html | 0 src/TaxBaik.sln | 1 - tmp/home.jpg | Bin 0 -> 28946 bytes 89 files changed, 10 insertions(+), 119 deletions(-) delete mode 100644 src/TaxBaik.Web.Client/Components/Admin/_Imports.razor delete mode 100644 src/TaxBaik.Web.Client/GlobalUsings.cs delete mode 100644 src/TaxBaik.Web.Client/Pages/WasmPing.razor delete mode 100644 src/TaxBaik.Web.Client/Program.cs delete mode 100644 src/TaxBaik.Web.Client/TaxBaik.Web.Client.csproj rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/App.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/ConfirmDialog.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Forms/CompanyForm.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Forms/InquiryForm.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/InquiryTable.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Layout/BlankLayout.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Layout/MainLayout.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/AdminIndex.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Announcements/AnnouncementEdit.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Announcements/AnnouncementList.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Blog/BlogCreate.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Blog/BlogEdit.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Blog/BlogForm.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Blog/BlogList.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Clients/ClientDetail.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Clients/ClientEdit.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Clients/ClientList.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/CommonCodes.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Companies/CompanyCreate.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Companies/CompanyEdit.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Companies/CompanyList.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/ConsultingActivities.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Contracts.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Dashboard.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Faqs/FaqEdit.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Faqs/FaqList.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Inquiries/InquiryCreate.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Inquiries/InquiryDetail.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Inquiries/InquiryEdit.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Inquiries/InquiryList.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Login.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Logout.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/RevenueTrackings.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/SeasonSimulator.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/Settings/SiteSettings.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/TaxFilingSchedules.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/TaxFilings/FilingTable.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/TaxFilings/TaxFilingList.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Pages/TaxProfiles.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/RedirectToLogin.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Routes.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/AdminClients/ICommonCodeBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/AdminClients/IConsultingActivityBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/AdminClients/IContractBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/AdminClients/IRevenueTrackingBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/AdminClients/ITaxProfileBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/AdminDashboardClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/AnnouncementBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/ApiClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/BlogBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/CategoryBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/ClientBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/CustomAuthenticationStateProvider.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/FaqBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/ILocalStorageService.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/ITokenStore.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/InquiryBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/LocalStorageService.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/TaxFilingBrowserClient.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/Services/TokenRefreshHandler.cs (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminCrudPageShell.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminDataPanel.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminDetailSection.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminEditorPanel.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminEmptyState.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminFormActions.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminFormSection.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminLoginForm.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminMetricCard.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminPageHeader.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminShell.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminSkeletonRows.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/AdminTelemetryContext.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/CommonCodeGroupPanel.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/CommonCodeListPanel.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/CommonCodeSelect.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/Components/Admin/Shared/ConfirmDialog.razor (100%) rename src/{TaxBaik.Web.Client => TaxBaik.Web/Components/Admin}/_Imports.razor (71%) rename src/{TaxBaik.Web.Client => TaxBaik.Web}/wwwroot/index.html (100%) create mode 100644 tmp/home.jpg diff --git a/src/TaxBaik.Web.Client/Components/Admin/_Imports.razor b/src/TaxBaik.Web.Client/Components/Admin/_Imports.razor deleted file mode 100644 index db93f38..0000000 --- a/src/TaxBaik.Web.Client/Components/Admin/_Imports.razor +++ /dev/null @@ -1,18 +0,0 @@ -@using System.Net.Http -@using System.Net.Http.Json -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.AspNetCore.Components.Web.Virtualization -@using Microsoft.AspNetCore.Components.Authorization -@using Microsoft.AspNetCore.Authorization -@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.WasmClient.Components.Admin.Shared -@using TaxBaik.WasmClient.Components.Admin.Layout diff --git a/src/TaxBaik.Web.Client/GlobalUsings.cs b/src/TaxBaik.Web.Client/GlobalUsings.cs deleted file mode 100644 index 9a55fd3..0000000 --- a/src/TaxBaik.Web.Client/GlobalUsings.cs +++ /dev/null @@ -1,2 +0,0 @@ -global using System.Net.Http; -global using System.Net.Http.Json; diff --git a/src/TaxBaik.Web.Client/Pages/WasmPing.razor b/src/TaxBaik.Web.Client/Pages/WasmPing.razor deleted file mode 100644 index aeafb41..0000000 --- a/src/TaxBaik.Web.Client/Pages/WasmPing.razor +++ /dev/null @@ -1,13 +0,0 @@ -@* WASM 기반(M3) 검증용 컴포넌트. 라우팅/렌더모드 전면 적용은 M4에서 처리한다. *@ -@rendermode InteractiveWebAssembly - - - WebAssembly 렌더 모드 점검 - 이 컴포넌트가 클릭에 반응하면 Interactive WebAssembly 기반이 정상 동작하는 것입니다. - 카운트: @count - - -@code { - private int count; - private void Increment() => count++; -} diff --git a/src/TaxBaik.Web.Client/Program.cs b/src/TaxBaik.Web.Client/Program.cs deleted file mode 100644 index 99a3e52..0000000 --- a/src/TaxBaik.Web.Client/Program.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Microsoft.AspNetCore.Components.Authorization; -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -using MudBlazor.Services; -using TaxBaik.Application.Services; -using TaxBaik.Web.Services; -using TaxBaik.Web.Services.AdminClients; - -var builder = WebAssemblyHostBuilder.CreateDefault(args); - -// MudBlazor (WASM 측 인터랙티브 컴포넌트용) -builder.Services.AddMudServices(config => -{ - config.SnackbarConfiguration.HideTransitionDuration = 400; - config.SnackbarConfiguration.ShowTransitionDuration = 300; - config.PopoverOptions.ThrowOnDuplicateProvider = false; -}); - -// API Base Url 동적 구성 (호스트 기준 /taxbaik/api/) -var apiBaseUrl = builder.HostEnvironment.BaseAddress.TrimEnd('/') + "/taxbaik/api/"; - -// HTTP Client for API (with automatic token refresh) -builder.Services.AddScoped(); -builder.Services.AddScoped(); - -builder.Services.AddHttpClient(client => -{ - client.BaseAddress = new Uri(apiBaseUrl); -}).AddHttpMessageHandler(); - -// 각 Browser API Client 등록 -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); -builder.Services.AddHttpClient(client => client.BaseAddress = new Uri(apiBaseUrl)).AddHttpMessageHandler(); - -// Blazor 인증 (WASM 측 클라이언트) -builder.Services.AddScoped(); -builder.Services.AddScoped(sp => sp.GetRequiredService()); -builder.Services.AddScoped(); -builder.Services.AddCascadingAuthenticationState(); -builder.Services.AddAuthorizationCore(); - -await builder.Build().RunAsync(); diff --git a/src/TaxBaik.Web.Client/TaxBaik.Web.Client.csproj b/src/TaxBaik.Web.Client/TaxBaik.Web.Client.csproj deleted file mode 100644 index 66509f4..0000000 --- a/src/TaxBaik.Web.Client/TaxBaik.Web.Client.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - net10.0 - enable - enable - TaxBaik.WasmClient - - - - - - - - - - - - - - - - - diff --git a/src/TaxBaik.Web.Client/Components/Admin/App.razor b/src/TaxBaik.Web/Components/Admin/App.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/App.razor rename to src/TaxBaik.Web/Components/Admin/App.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/ConfirmDialog.razor b/src/TaxBaik.Web/Components/Admin/ConfirmDialog.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/ConfirmDialog.razor rename to src/TaxBaik.Web/Components/Admin/ConfirmDialog.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Forms/CompanyForm.razor b/src/TaxBaik.Web/Components/Admin/Forms/CompanyForm.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Forms/CompanyForm.razor rename to src/TaxBaik.Web/Components/Admin/Forms/CompanyForm.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Forms/InquiryForm.razor b/src/TaxBaik.Web/Components/Admin/Forms/InquiryForm.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Forms/InquiryForm.razor rename to src/TaxBaik.Web/Components/Admin/Forms/InquiryForm.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/InquiryTable.razor b/src/TaxBaik.Web/Components/Admin/InquiryTable.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/InquiryTable.razor rename to src/TaxBaik.Web/Components/Admin/InquiryTable.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Layout/BlankLayout.razor b/src/TaxBaik.Web/Components/Admin/Layout/BlankLayout.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Layout/BlankLayout.razor rename to src/TaxBaik.Web/Components/Admin/Layout/BlankLayout.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Layout/MainLayout.razor b/src/TaxBaik.Web/Components/Admin/Layout/MainLayout.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Layout/MainLayout.razor rename to src/TaxBaik.Web/Components/Admin/Layout/MainLayout.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/AdminIndex.razor b/src/TaxBaik.Web/Components/Admin/Pages/AdminIndex.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/AdminIndex.razor rename to src/TaxBaik.Web/Components/Admin/Pages/AdminIndex.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementEdit.razor b/src/TaxBaik.Web/Components/Admin/Pages/Announcements/AnnouncementEdit.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementEdit.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Announcements/AnnouncementEdit.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor b/src/TaxBaik.Web/Components/Admin/Pages/Announcements/AnnouncementList.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Announcements/AnnouncementList.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogCreate.razor b/src/TaxBaik.Web/Components/Admin/Pages/Blog/BlogCreate.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogCreate.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Blog/BlogCreate.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogEdit.razor b/src/TaxBaik.Web/Components/Admin/Pages/Blog/BlogEdit.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogEdit.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Blog/BlogEdit.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogForm.razor b/src/TaxBaik.Web/Components/Admin/Pages/Blog/BlogForm.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogForm.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Blog/BlogForm.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogList.razor b/src/TaxBaik.Web/Components/Admin/Pages/Blog/BlogList.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogList.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Blog/BlogList.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientDetail.razor b/src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientDetail.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientDetail.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientDetail.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientEdit.razor b/src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientEdit.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientEdit.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientEdit.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor b/src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientList.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Clients/ClientList.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/CommonCodes.razor b/src/TaxBaik.Web/Components/Admin/Pages/CommonCodes.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/CommonCodes.razor rename to src/TaxBaik.Web/Components/Admin/Pages/CommonCodes.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyCreate.razor b/src/TaxBaik.Web/Components/Admin/Pages/Companies/CompanyCreate.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyCreate.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Companies/CompanyCreate.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyEdit.razor b/src/TaxBaik.Web/Components/Admin/Pages/Companies/CompanyEdit.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyEdit.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Companies/CompanyEdit.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyList.razor b/src/TaxBaik.Web/Components/Admin/Pages/Companies/CompanyList.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyList.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Companies/CompanyList.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor b/src/TaxBaik.Web/Components/Admin/Pages/ConsultingActivities.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor rename to src/TaxBaik.Web/Components/Admin/Pages/ConsultingActivities.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor b/src/TaxBaik.Web/Components/Admin/Pages/Contracts.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Contracts.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor b/src/TaxBaik.Web/Components/Admin/Pages/Dashboard.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Dashboard.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqEdit.razor b/src/TaxBaik.Web/Components/Admin/Pages/Faqs/FaqEdit.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqEdit.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Faqs/FaqEdit.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor b/src/TaxBaik.Web/Components/Admin/Pages/Faqs/FaqList.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Faqs/FaqList.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryCreate.razor b/src/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryCreate.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryCreate.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryCreate.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryDetail.razor b/src/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryDetail.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryDetail.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryDetail.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryEdit.razor b/src/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryEdit.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryEdit.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryEdit.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryList.razor b/src/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryList.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryList.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Inquiries/InquiryList.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor b/src/TaxBaik.Web/Components/Admin/Pages/Login.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Login.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Logout.razor b/src/TaxBaik.Web/Components/Admin/Pages/Logout.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Logout.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Logout.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor b/src/TaxBaik.Web/Components/Admin/Pages/RevenueTrackings.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor rename to src/TaxBaik.Web/Components/Admin/Pages/RevenueTrackings.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/SeasonSimulator.razor b/src/TaxBaik.Web/Components/Admin/Pages/SeasonSimulator.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/SeasonSimulator.razor rename to src/TaxBaik.Web/Components/Admin/Pages/SeasonSimulator.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Settings/SiteSettings.razor b/src/TaxBaik.Web/Components/Admin/Pages/Settings/SiteSettings.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/Settings/SiteSettings.razor rename to src/TaxBaik.Web/Components/Admin/Pages/Settings/SiteSettings.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilingSchedules.razor b/src/TaxBaik.Web/Components/Admin/Pages/TaxFilingSchedules.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilingSchedules.razor rename to src/TaxBaik.Web/Components/Admin/Pages/TaxFilingSchedules.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilings/FilingTable.razor b/src/TaxBaik.Web/Components/Admin/Pages/TaxFilings/FilingTable.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilings/FilingTable.razor rename to src/TaxBaik.Web/Components/Admin/Pages/TaxFilings/FilingTable.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilings/TaxFilingList.razor b/src/TaxBaik.Web/Components/Admin/Pages/TaxFilings/TaxFilingList.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilings/TaxFilingList.razor rename to src/TaxBaik.Web/Components/Admin/Pages/TaxFilings/TaxFilingList.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxProfiles.razor b/src/TaxBaik.Web/Components/Admin/Pages/TaxProfiles.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Pages/TaxProfiles.razor rename to src/TaxBaik.Web/Components/Admin/Pages/TaxProfiles.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/RedirectToLogin.razor b/src/TaxBaik.Web/Components/Admin/RedirectToLogin.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/RedirectToLogin.razor rename to src/TaxBaik.Web/Components/Admin/RedirectToLogin.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Routes.razor b/src/TaxBaik.Web/Components/Admin/Routes.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Routes.razor rename to src/TaxBaik.Web/Components/Admin/Routes.razor diff --git a/src/TaxBaik.Web.Client/Services/AdminClients/ICommonCodeBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ICommonCodeBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/AdminClients/ICommonCodeBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/AdminClients/ICommonCodeBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/AdminClients/IConsultingActivityBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IConsultingActivityBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/AdminClients/IConsultingActivityBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/AdminClients/IConsultingActivityBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/AdminClients/IContractBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IContractBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/AdminClients/IContractBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/AdminClients/IContractBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/AdminClients/IRevenueTrackingBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/IRevenueTrackingBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/AdminClients/IRevenueTrackingBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/AdminClients/IRevenueTrackingBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxFilingScheduleBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/AdminClients/ITaxProfileBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxProfileBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/AdminClients/ITaxProfileBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/AdminClients/ITaxProfileBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/AdminDashboardClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AdminDashboardClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/AdminDashboardClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/AdminDashboardClient.cs diff --git a/src/TaxBaik.Web.Client/Services/AnnouncementBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/AnnouncementBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/AnnouncementBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/AnnouncementBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/ApiClient.cs b/src/TaxBaik.Web/Components/Admin/Services/ApiClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/ApiClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/ApiClient.cs diff --git a/src/TaxBaik.Web.Client/Services/BlogBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/BlogBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/BlogBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/BlogBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/CategoryBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/CategoryBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/CategoryBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/CategoryBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/ClientBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/ClientBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/ClientBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/ClientBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/CustomAuthenticationStateProvider.cs b/src/TaxBaik.Web/Components/Admin/Services/CustomAuthenticationStateProvider.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/CustomAuthenticationStateProvider.cs rename to src/TaxBaik.Web/Components/Admin/Services/CustomAuthenticationStateProvider.cs diff --git a/src/TaxBaik.Web.Client/Services/FaqBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/FaqBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/FaqBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/FaqBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/ILocalStorageService.cs b/src/TaxBaik.Web/Components/Admin/Services/ILocalStorageService.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/ILocalStorageService.cs rename to src/TaxBaik.Web/Components/Admin/Services/ILocalStorageService.cs diff --git a/src/TaxBaik.Web.Client/Services/ITokenStore.cs b/src/TaxBaik.Web/Components/Admin/Services/ITokenStore.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/ITokenStore.cs rename to src/TaxBaik.Web/Components/Admin/Services/ITokenStore.cs diff --git a/src/TaxBaik.Web.Client/Services/InquiryBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/InquiryBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/InquiryBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/InquiryBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/LocalStorageService.cs b/src/TaxBaik.Web/Components/Admin/Services/LocalStorageService.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/LocalStorageService.cs rename to src/TaxBaik.Web/Components/Admin/Services/LocalStorageService.cs diff --git a/src/TaxBaik.Web.Client/Services/TaxFilingBrowserClient.cs b/src/TaxBaik.Web/Components/Admin/Services/TaxFilingBrowserClient.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/TaxFilingBrowserClient.cs rename to src/TaxBaik.Web/Components/Admin/Services/TaxFilingBrowserClient.cs diff --git a/src/TaxBaik.Web.Client/Services/TokenRefreshHandler.cs b/src/TaxBaik.Web/Components/Admin/Services/TokenRefreshHandler.cs similarity index 100% rename from src/TaxBaik.Web.Client/Services/TokenRefreshHandler.cs rename to src/TaxBaik.Web/Components/Admin/Services/TokenRefreshHandler.cs diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminCrudPageShell.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminCrudPageShell.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminCrudPageShell.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminCrudPageShell.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminDataPanel.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminDataPanel.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminDataPanel.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminDataPanel.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminDetailSection.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminDetailSection.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminDetailSection.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminDetailSection.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminEditorPanel.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminEditorPanel.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminEditorPanel.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminEditorPanel.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminEmptyState.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminEmptyState.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminEmptyState.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminEmptyState.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminFormActions.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminFormActions.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminFormActions.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminFormActions.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminFormSection.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminFormSection.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminFormSection.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminFormSection.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminLoginForm.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminLoginForm.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminLoginForm.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminLoginForm.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminMetricCard.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminMetricCard.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminMetricCard.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminMetricCard.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminPageHeader.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminPageHeader.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminPageHeader.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminPageHeader.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminShell.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminShell.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminShell.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminShell.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminSkeletonRows.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminSkeletonRows.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminSkeletonRows.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminSkeletonRows.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminTelemetryContext.razor b/src/TaxBaik.Web/Components/Admin/Shared/AdminTelemetryContext.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/AdminTelemetryContext.razor rename to src/TaxBaik.Web/Components/Admin/Shared/AdminTelemetryContext.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/CommonCodeGroupPanel.razor b/src/TaxBaik.Web/Components/Admin/Shared/CommonCodeGroupPanel.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/CommonCodeGroupPanel.razor rename to src/TaxBaik.Web/Components/Admin/Shared/CommonCodeGroupPanel.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/CommonCodeListPanel.razor b/src/TaxBaik.Web/Components/Admin/Shared/CommonCodeListPanel.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/CommonCodeListPanel.razor rename to src/TaxBaik.Web/Components/Admin/Shared/CommonCodeListPanel.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/CommonCodeSelect.razor b/src/TaxBaik.Web/Components/Admin/Shared/CommonCodeSelect.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/CommonCodeSelect.razor rename to src/TaxBaik.Web/Components/Admin/Shared/CommonCodeSelect.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/ConfirmDialog.razor b/src/TaxBaik.Web/Components/Admin/Shared/ConfirmDialog.razor similarity index 100% rename from src/TaxBaik.Web.Client/Components/Admin/Shared/ConfirmDialog.razor rename to src/TaxBaik.Web/Components/Admin/Shared/ConfirmDialog.razor diff --git a/src/TaxBaik.Web.Client/_Imports.razor b/src/TaxBaik.Web/Components/Admin/_Imports.razor similarity index 71% rename from src/TaxBaik.Web.Client/_Imports.razor rename to src/TaxBaik.Web/Components/Admin/_Imports.razor index aa7052b..c43ac24 100644 --- a/src/TaxBaik.Web.Client/_Imports.razor +++ b/src/TaxBaik.Web/Components/Admin/_Imports.razor @@ -9,5 +9,9 @@ @using Microsoft.AspNetCore.Components.WebAssembly.Http @using Microsoft.JSInterop @using MudBlazor -@using TaxBaik.WasmClient +@using TaxBaik.Web.Components.Admin +@using TaxBaik.Web.Components.Admin.Services +@using TaxBaik.Web.Components.Admin.Services.AdminClients +@using TaxBaik.Application.DTOs +@using TaxBaik.Domain.Entities @using static Microsoft.AspNetCore.Components.Web.RenderMode diff --git a/src/TaxBaik.Web/Program.cs b/src/TaxBaik.Web/Program.cs index 609e866..cca8c94 100644 --- a/src/TaxBaik.Web/Program.cs +++ b/src/TaxBaik.Web/Program.cs @@ -402,12 +402,11 @@ app.MapStaticAssets(); // AllowAnonymous: JWT 미들웨어가 Blazor 셸 요청을 401로 차단하지 않도록 한다. // 인증은 Blazor AuthorizeRouteView → RedirectToLogin 에서 처리한다. // Phase 8: WebAssembly 렌더 모드 완전 마이그레이션 -// - App.razor: TaxBaik.WasmClient (호스트, WebAssembly) -// - Routes + Pages + Shared + Layout + Forms: TaxBaik.WasmClient (WebAssembly) -// MapRazorComponents는 자동으로 root 컴포넌트의 어셈블리 로드 -// 동일 어셈블리의 Page/Shared 컴포넌트는 자동 발견되므로 AddAdditionalAssemblies 불필요 -// (같은 어셈블리를 2번 등록하면 "Assembly already defined" 에러 발생) -app.MapRazorComponents() +// - App.razor: TaxBaik.Web (메인 웹 서버) +// - Routes + Pages + Shared + Layout + Forms: TaxBaik.Web (메인 웹 서버) +// 모든 Blazor 컴포넌트가 웹 서버에서 통합 서비스됨 +// API는 웹 서버에서만 제공 (클라이언트 프로젝트 분리 불필요) +app.MapRazorComponents() .AddInteractiveWebAssemblyRenderMode() .AllowAnonymous(); diff --git a/src/TaxBaik.Web/TaxBaik.Web.csproj b/src/TaxBaik.Web/TaxBaik.Web.csproj index 0e29d42..7f592c2 100644 --- a/src/TaxBaik.Web/TaxBaik.Web.csproj +++ b/src/TaxBaik.Web/TaxBaik.Web.csproj @@ -3,7 +3,6 @@ - diff --git a/src/TaxBaik.Web.Client/wwwroot/index.html b/src/TaxBaik.Web/wwwroot/index.html similarity index 100% rename from src/TaxBaik.Web.Client/wwwroot/index.html rename to src/TaxBaik.Web/wwwroot/index.html diff --git a/src/TaxBaik.sln b/src/TaxBaik.sln index 5631854..f6ce3a6 100644 --- a/src/TaxBaik.sln +++ b/src/TaxBaik.sln @@ -13,7 +13,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TaxBaik.Web", "TaxBaik.Web\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TaxBaik.Application.Tests", "TaxBaik.Application.Tests\TaxBaik.Application.Tests.csproj", "{47D1F07D-F11B-4343-A3C3-1872F0C46AE3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TaxBaik.Web.Client", "TaxBaik.Web.Client\TaxBaik.Web.Client.csproj", "{C46C51D4-9E87-47DF-AB76-2E794F64FD5F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/tmp/home.jpg b/tmp/home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..985b11d593d57948539fa2584f9c8b6cc0c24c41 GIT binary patch literal 28946 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 CEf`?{ literal 0 HcmV?d00001