diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 6ddc7d0..8f43a9b 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -81,6 +81,9 @@ jobs: - name: Validate migration version uniqueness run: bash scripts/validate_migrations.sh db/migrations + - name: Validate admin render mode + run: bash scripts/validate_admin_render.sh + - name: Generate build info run: | COMMIT_HASH=$(git rev-parse --short HEAD) @@ -115,6 +118,8 @@ jobs: mkdir -p ./publish/scripts cp scripts/validate_migrations.sh ./publish/scripts/validate_migrations.sh chmod +x ./publish/scripts/validate_migrations.sh + cp scripts/validate_admin_render.sh ./publish/scripts/validate_admin_render.sh + chmod +x ./publish/scripts/validate_admin_render.sh tar -czf taxbaik_deploy.tgz -C ./publish . echo "✓ Package: $(du -sh taxbaik_deploy.tgz | cut -f1)" diff --git a/docs/ENGINEERING_HARNESS.md b/docs/ENGINEERING_HARNESS.md index 8ecd968..ebd5109 100644 --- a/docs/ENGINEERING_HARNESS.md +++ b/docs/ENGINEERING_HARNESS.md @@ -13,6 +13,7 @@ | Auth | JWT 인증, 관리자 API는 `[Authorize]` | 익명으로 관리자 데이터 접근 가능 | | Deploy | Gitea Actions CI/CD만 배포 경로 | 수동 SSH/복사로 운영 반영 | | Evidence | 빌드, 테스트, E2E, API smoke 로그 | "확인함", "될 것" 같은 진술 | +| Admin Render | `InteractiveWebAssemblyRenderMode(prerender: false)` | 어드민에 `InteractiveServerRenderMode` 또는 `prerender: true` 존재 | ## Architecture Guardrails @@ -22,6 +23,7 @@ - Web은 Controller, 공개 Razor Pages SSR, Blazor host, 인증/서빙 설정을 가진다. - Web.Client/Admin UI는 클라이언트 사이드 Blazor WebAssembly로 본다. 서버 DI 서비스에 의존하지 않고 API client만 호출한다. - 관리자 호스트가 prerender를 사용하더라도 데이터 접근 원칙은 WASM + API-first다. prerender는 초기 마크업용이며 비즈니스 로직의 근거가 아니다. +- 어드민 렌더 모드는 `InteractiveWebAssemblyRenderMode(prerender: false)`를 기본값으로 둔다. `InteractiveServerRenderMode`와 `prerender: true`는 어드민에서 허용하지 않는다. - JavaScript는 최소화한다. 브라우저 API, 인증 토큰 저장, 서드파티 편집기처럼 Blazor/MudBlazor만으로 해결하기 부적절한 경우에만 JS module로 격리한다. - 상속은 프레임워크 요구 또는 명확한 다형성 모델에만 사용한다. 폼/테이블/CRUD 재사용은 기본적으로 컴포넌트 합성과 작은 service/client로 처리한다. diff --git a/scripts/validate_admin_render.sh b/scripts/validate_admin_render.sh new file mode 100644 index 0000000..8475e01 --- /dev/null +++ b/scripts/validate_admin_render.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +files=( + "TaxBaik.Web/Components/Admin/App.razor" + "TaxBaik.Web/Components/Admin/Layout/MainLayout.razor" + "TaxBaik.Web/Components/Admin/Pages/Login.razor" +) + +for file in "${files[@]}"; do + if [ ! -f "$file" ]; then + echo "Missing admin render file: $file" >&2 + exit 1 + fi +done + +if grep -nE "InteractiveServerRenderMode|prerender: true" "${files[@]}"; then + echo "Admin render mode violation detected." >&2 + exit 1 +fi + +if ! grep -nE "InteractiveWebAssemblyRenderMode\\(prerender: false\\)" "${files[@]}" >/dev/null; then + echo "Admin render mode must use InteractiveWebAssemblyRenderMode(prerender: false)." >&2 + exit 1 +fi + +echo "Admin render harness passed."