App.razor:
• MudBlazor CSS: jsdelivr CDN
• MudBlazor JS: jsdelivr CDN
• admin.css: 로컬 파일 (기본 스타일)
결과:
✅ 로그인 페이지: MudBlazor 스타일 + 기본 스타일 로드
✅ 페이지 로딩 중: admin.css로 기본 UI 표시
✅ MudBlazor 로드 후: 완전한 스타일 적용
이제 Gitea Actions가 자동으로 배포합니다.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
wwwroot/css/admin.css 생성:
• 폼 요소 기본 스타일
• MudBlazor 컴포넌트 기본 스타일
• Responsive 디자인
• Material Design Blue 컬러
결과:
✅ 페이지 로딩 중에도 깔끔한 UI
✅ MudBlazor 로드 후 자동 오버라이드
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
문제:
❌ 로그인 페이지에서 MudBlazor CSS가 적용되지 않음
❌ 스타일이 없는 상태로 렌더링됨
원인:
• BlankLayout에만 MudThemeProvider가 있음
• Login.razor는 직접 MudThemeProvider를 가지지 않음
• Blazor Interactive Server에서 컴포넌트 초기화 전 렌더링됨
수정:
✅ Login.razor에 MudThemeProvider 추가
✅ MudDialogProvider, MudSnackbarProvider도 추가
✅ 버전 파일 자동 생성 (git commit hash + timestamp)
배포:
Release 빌드 → wwwroot/version.txt 생성 → 서버 배포 → systemctl restart
결과:
✅ 로그인 페이지 CSS 정상 렌더링
✅ 버전 정보 최신화
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
문제:
❌ "Publish Admin" 단계가 TaxBaik.Admin 프로젝트를 찾을 수 없음
❌ 분리된 배포 프로세스 (Web, Admin 각각)
원인:
• Web과 Admin이 이미 TaxBaik.Web으로 통합됨
• CI 스크립트가 아직도 분리된 구조를 가정
수정사항:
✅ "Publish Web" → "Publish Web (통합 앱)"
✅ "Publish Admin" 단계 제거
✅ 단일 publish 디렉토리 사용
✅ "Deploy Web" + "Deploy Admin" → "Deploy (통합 Web + Admin)"
✅ systemd를 통한 단일 서비스 재시작
결과:
✅ CI/CD 파이프라인 정상화
✅ 자동 배포 가능 (Gitea Actions)
✅ 1개 앱 배포로 단순화
파이프라인 단계:
1. Checkout → Build → Publish → Deploy → Restart
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
1️⃣ HttpClient 서비스 추가
- IApiClient 인터페이스 구현
- GET, POST, PUT, DELETE 메서드
- JWT 토큰 자동 관리
- /taxbaik/api 경로 자동 처리
2️⃣ Razor Pages 리팩토링
- Pages/Index.cshtml.cs: API /api/blog 호출
- Pages/Blog/Index.cshtml.cs: API /api/blog, /api/category 호출
- Pages/Contact.cshtml.cs: API /api/inquiry 호출
- Service 의존성 제거
3️⃣ Blazor Components 리팩토링
- Login.razor: API /api/auth/login 호출로 변경
- BlogList.razor: API /api/blog/admin/all 호출로 변경
- Service 의존성 제거
아키텍처:
View (Razor Pages + Blazor)
↓ HttpClient
Controllers (REST API)
↓
Services (비즈니스 로직)
↓
Repository (DB)
테스트 결과:
✅ 홈페이지: 200 OK
✅ 블로그 페이지: 200 OK
✅ 문의 페이지: 200 OK
✅ 로그인 페이지: 200 OK
✅ API 엔드포인트 모두 작동
장점:
• UI 리뉴얼 시 API 변경 불필요
• 모바일앱, 데스크톱 클라이언트 추가 가능
• 비즈니스 로직과 UI 완전 독립
• 테스트 가능한 구조 완성
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
4개 API 컨트롤러 구현:
✅ AuthController: POST /api/auth/login
✅ BlogController: GET/POST/PUT/DELETE /api/blog
✅ CategoryController: GET/POST/PUT/DELETE /api/category
✅ InquiryController: POST/GET/PUT /api/inquiry
아키텍처 개선:
- Application 서비스 레이어 확장 (CategoryService 추가)
- Repository 인터페이스 CRUD 지원 추가
- Program.cs에 MapControllers() 추가
- 비즈니스 로직과 UI 완전 분리
장점:
- 향후 UI 리뉴얼 시 API 변경 불필요
- 모바일 앱, 데스크톱 클라이언트 추가 가능
- 테스트 가능한 API 엔드포인트
테스트 결과:
✅ 블로그 API: 5개 포스트 조회
✅ 카테고리 API: 5개 카테고리 조회
✅ 문의 API: 문의 제출 성공
⚠️ 인증 API: 예정된 수정 대기
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Microsoft.AspNetCore.Authentication.JwtBearer 패키지 추가
- Program.cs: JWT 인증 스키마 설정
- Middleware: app.UseAuthentication() 추가
- Admin 대시보드 접근 시 인증 필요 (401 Unauthorized 반환)
테스트 결과:
✅ 홈페이지 (200 OK)
✅ 블로그 (200 OK)
✅ 문의 폼 (200 OK)
✅ 로그인 페이지 (200 OK)
✅ 관리자 대시보드 (401 - 인증 필요)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- 포트 배치: 5001로 통합 (5002 제거)
- 배포 절차: 단일 Web 앱 빌드로 단순화
- 서비스: taxbaik만 관리 (taxbaik-admin 제거)
- Nginx: /taxbaik 블록 하나로 통합
- 파일 구조: Web/Components/Admin으로 명시
- 인증: JWT + localStorage 패턴 문서화
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
분리의 단점을 제거하고 단일 앱으로 통합:
구조 변경:
- TaxBaik.Admin → TaxBaik.Web/Components/Admin/
- Admin Services → TaxBaik.Web/Services/
- 포트: 5001 (기존 5002 제거)
경로:
- 홈페이지: http://localhost:5001/taxbaik
- 관리자: http://localhost:5001/taxbaik/admin
기술:
- Razor Pages (Web) + Blazor Server (Admin) 통합
- 단일 Program.cs로 양쪽 모두 지원
- JWT 인증 유지
- MudBlazor UI 유지
장점:
- 개발 복잡도 감소 (터미널 1개)
- 배포 단순화 (앱 1개)
- DB 마이그레이션 1회 실행
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
로컬에서 서버 PostgreSQL DB에 접속하는 방법:
1. SSH 터널 열기
ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7
2. 다른 터미널에서 Web/Admin 앱 실행
- Web: dotnet run -p TaxBaik.Web
- Admin: dotnet run -p TaxBaik.Admin
3. 마이그레이션 자동 실행 (앱 시작 시)
- schema_migrations 테이블 확인
- 미실행 마이그레이션 순서대로 실행
개발 워크플로우:
- 터미널 1: SSH 터널 유지
- 터미널 2: Web (http://localhost:5001/taxbaik)
- 터미널 3: Admin (https://localhost:5002, admin/admin123)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- 포트 5001로 설정 (기존 5012 → 5001)
- DB 연결 없이도 페이지 렌더링 가능하도록 error handling 추가
- Index.cshtml.cs: 블로그 로드 실패 시 빈 리스트 반환
- Blog/Index.cshtml.cs: 카테고리 및 포스트 로드 실패 시 빈 리스트 반환
- Contact.cshtml.cs: 문의 제출 실패 시 사용자 친화적 에러 메시지
- Program.cs: 마이그레이션을 non-blocking으로 변경
페이지 구성:
- 홈페이지 (Index): 회사 소개 및 최근 블로그
- 블로그 (Blog): 게시글 목록 및 카테고리 필터
- 서비스 (Services): 서비스 소개
- 문의 (Contact): 상담 신청 폼
- 소개 (About): 회사 정보
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
1. NavMenu에 사용자명 표시 및 로그아웃 버튼 추가
2. CustomAuthenticationStateProvider에 토큰 만료 검증 추가
3. Routes.razor 간소화 (AuthorizeRouteView 사용)
4. 미인증 사용자는 _Imports.razor의 [Authorize]로 보호됨
테스트 계정: admin / admin123
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Register IAdminUserRepository in DependencyInjection
- Add connection string to appsettings.json
- Make database migrations non-blocking (allow app to start even if DB unavailable)
- Remove UseAuthentication() middleware (using client-side JWT auth instead)
- App now runs successfully on https://localhost:5002
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- AuthService로 JWT 토큰 생성 및 검증
- CustomAuthenticationStateProvider를 통한 Blazor 인증 통합
- LocalStorageService로 토큰 관리
- Login.razor 완전 재작성 (실제 DB 검증, 토큰 발급)
- BCrypt 기반 비밀번호 검증
- admin/admin123으로 테스트 가능
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
주요 변경사항:
- Hero 섹션: 강력한 임팩트, 자격 배지, 큰 CTA
- 신뢰도 섹션: 자격 3개 항목 수직 확장
- 서비스 섹션: 아이콘 + 상세 설명 + 리스트형 혜택 → 전문성 강조
- 상담 프로세스: 새로운 4단계 시각화 섹션 추가
- 블로그 섹션: 플레이스홀더 이미지, 더 큰 카드
- 최종 CTA: 강렬한 다크 그린 배경, 대비 강한 버튼
디자인 개선:
- 화이트스페이스 확대
- 시각적 계층 구조 강화
- 기능별 섹션 분리
- 반응형 레이아웃 개선
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- site.css: 색상 팔레트 전환 (골드/브론즈/초록/베이지)
- admin.css: MudBlazor 커스터마이징으로 일관성 있는 관리자 UI
- theme-color 메타 태그 업데이트
변경사항:
- 주색: #1B4F8A(네이비) → #C89D6E(따뜻한 골드)
- 보조색: 새로 추가 #2E5C4E(따뜻한 초록)
- 배경: #F7F9FC(차가운 화이트) → #F9F7F3(따뜻한 화이트)
- 그라데이션, 섀도우, 타이포그래피 개선
이전: 기본적인 텍스트 나열식 디자인
현재: 경험 많은 세무사 사무실 느낌의 세련되고 전문적인 디자인
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 문제
App.razor에 Bootstrap/MudBlazor CSS 링크 없음
→ Admin 페이지가 완전히 스타일 없는 상태
## 해결
1. App.razor에 필요한 CSS 링크 추가:
- Bootstrap 5.3.0 CDN
- Material UI 기본 스타일
- Material Icons
- admin.css (커스텀 스타일)
2. admin.css 생성:
- 색상 변수 정의
- MudBlazor 커스터마이징
- 한국어 폰트 (Noto Sans KR)
- 반응형 디자인
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 문제
_ViewStart.cshtml이 없어서 _Layout.cshtml이 렌더링되지 않음
→ CSS/JS가 HTML에 포함되지 않음
→ 스타일 미적용 상태
## 해결
_ViewStart.cshtml 생성하여 Layout 전역 설정
→ 모든 Razor Pages가 _Layout.cshtml을 상속받음
→ CSS/JS 정상 로드
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 변경사항
- Footer에 빌드 버전 및 시간 표시
- VersionInfo를 DI로 주입받아 렌더링
- 형식: v{Version} · {Built}
- 투명도(opacity: 0.6)로 미세하게 표시
## 사용자 편의
배포 후 실시간으로 버전 확인 가능
버그 또는 새 기능 적용 여부를 즉시 확인
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 근본 원인
Razor Pages 기본 HtmlEncoder가 한글을 유니코드 엔티티로 과도 인코딩
- 데이터: '사업자' → 렌더링: '사업자'
- 사용자에게 보이는 것: 인코딩된 엔티티 텍스트
## 해결
Program.cs에서 HtmlEncoder를 UnicodeRanges.All로 초기화
- ASP.NET Core DI에 HtmlEncoder.Create(UnicodeRanges.All) 등록
- 모든 유니코드 문자를 UTF-8 문자 그대로 렌더링
- XSS 보호는 유지 (HTML 마크업 문자는 여전히 이스케이핑)
## 결과
✅ 한글 제목 정상 표시
✅ 블로그 카테고리 정상 표시
✅ 다국어 지원
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 문제
Razor Pages에서 한글 제목이 HTML 유니코드 엔티티로 과도하게 인코딩됨
- 사업자 (한글 '사업자' 등)
- 렌더링 결과: 엔티티 코드가 그대로 표시됨
## 해결
Program.cs에서 WebEncoderOptions 설정
- TextEncoderSettings: UnicodeRanges.All 적용
- 한글 및 다국어 문자를 유니코드 엔티티로 변환하지 않음
- XSS 보호는 유지 (필요시 @Html.Raw() 사용)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 변경사항 요약
TaxBaik 배포 시스템을 최종 완성하고 모든 구성 요소를 통합했습니다.
### 완성된 기능
✅ 전체 배포 파이프라인
✅ systemd 서비스 관리
✅ Nginx 라우팅 설정
✅ PostgreSQL 데이터베이스 연결
✅ Gitea Actions CI/CD
### 배포 환경
- Server: 178.104.200.7
- Web: http://178.104.200.7:5001 (Nginx: /taxbaik)
- Admin: http://178.104.200.7:5002 (Nginx: /taxbaik/admin)
- Database: PostgreSQL 18
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 변경사항 요약
공개 사이트(TaxBaik.Web)의 Razor Pages 레이아웃과 UI를 개선했습니다.
### 개선 사항
✅ Bootstrap 5 레이아웃 적용
✅ 반응형 디자인 구현
✅ 모바일 고정 CTA 바 추가
✅ 푸터 및 헤더 개선
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 변경사항 요약
배포 자동화 시스템을 구축했습니다.
### 주요 기능
✅ Cron 기반 자동 배포
✅ 심링크를 통한 무중단 배포
✅ 버전 정보 추적
✅ 자동 롤백 지원
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
## 변경사항
### 배포 파이프라인 완성
✅ 코드 빌드: dotnet build
✅ Web/Admin 발행: dotnet publish
✅ 버전 정보 생성: version.txt 자동 생성
✅ Web 배포: 심링크 + 프로세스 시작
✅ Admin 배포: 심링크 + 프로세스 시작
### 무중단 배포 메커니즘
- 심링크로 원자적 버전 전환
- 기존 프로세스 종료 (pkill -9)
- 새 프로세스 자동 시작 (nohup)
- 에러 체크: || 로 실패 시 종료
### 환경 변수 설정
- ConnectionStrings__Default: PostgreSQL
- ASPNETCORE_ENVIRONMENT: Production
- ASPNETCORE_URLS: port 5001/5002
### 검증
- 프로세스 시작 확인: ps aux | grep
- 로그 기록: nohup으로 백그라운드 실행
- 버전 정보: git commit hash + build time