diff --git a/CLAUDE.md b/CLAUDE.md index 2329903..4a913cd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,9 +49,120 @@ TaxBaik.Admin ASP.NET Core 앱 (Blazor Server, port 5002) --- -## 3. 서버 & 배포 +## 3. 로컬 개발 환경 설정 -### 3.1 SSH 접속 +### 3.1 SSH 터널링으로 서버 DB 접속 + +**목적**: 로컬에서 개발/테스트 시 서버의 PostgreSQL에 접속 + +#### 단계 1: SSH 터널 구성 (PowerShell / Bash) + +```bash +# 터널 열기 (백그라운드 유지) +ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7 + +# 터널이 열린 상태에서 다른 터미널에서 개발 +``` + +또는 **영구 설정** (`~/.ssh/config`): +``` +Host taxbaik-tunnel + HostName 178.104.200.7 + User kjh2064 + LocalForward 5432 127.0.0.1:5432 + IdentityFile ~/.ssh/id_ed25519 +``` + +그 후: +```bash +ssh taxbaik-tunnel # 터널 유지 +``` + +#### 단계 2: 연결 확인 + +```bash +# 로컬에서 PostgreSQL 연결 테스트 +psql -h localhost -U taxbaik -d taxbaikdb -c "\dt" + +# 또는 .NET 앱 실행 (자동으로 마이그레이션 실행) +dotnet run -p TaxBaik.Web +``` + +#### 단계 3: 개발 워크플로우 + +```bash +# 터미널 1: SSH 터널 유지 +ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7 + +# 터미널 2: Web 사이트 (Razor Pages) +cd TaxBaik.Web +dotnet run +# 접속: http://localhost:5001/taxbaik + +# 터미널 3: Admin 앱 (Blazor) +cd TaxBaik.Admin +dotnet run +# 접속: https://localhost:5002 +# 로그인: admin / admin123 +``` + +### 3.2 appsettings.json (로컬) + +```json +{ + "ConnectionStrings": { + "Default": "Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=XXXXXXXX" + } +} +``` + +**중요**: 로컬 appsettings.json은 버전 관리에서 제외 또는 .local suffix 사용 + +```bash +# 로컬 오버라이드 +appsettings.Development.json # gitignore에 추가 +``` + +### 3.3 데이터베이스 마이그레이션 + +앱 시작 시 자동 실행: +1. `db/migrations/` 폴더에서 V001, V002, V003... 순서대로 읽음 +2. `schema_migrations` 테이블에서 실행 여부 확인 +3. 미실행 마이그레이션만 실행 + +**마이그레이션 추가**: +```bash +# 파일명: db/migrations/V004__새기능설명.sql +# 예시 +CREATE TABLE IF NOT EXISTS new_table ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL +); +``` + +### 3.4 블로그 & 문의 테스트 데이터 + +마이그레이션 V003에서 자동 생성: +- 테스트 관리자: `admin` / `admin123` +- 테스트 블로그 포스트 5개 +- 테스트 카테고리 5개 + +수동 추가: +```sql +-- Admin 추가 +INSERT INTO admin_users (username, password_hash, created_at) +VALUES ('newadmin', '$2a$11$...bcrypt_hash...', NOW()); + +-- 블로그 포스트 추가 +INSERT INTO blog_posts (title, content, slug, category_id, is_published, created_at) +VALUES ('제목', '내용', 'slug-text', 1, true, NOW()); +``` + +--- + +## 6. 서버 & 배포 + +### 4.1 SSH 접속 ```bash ssh kjh2064@178.104.200.7 ``` @@ -118,7 +229,7 @@ KillMode=mixed # SIGTERM → 30초 대기 → SIGKILL /etc/systemd/system/taxbaik-admin.service ← Admin ``` -### 3.5 배포 디렉토리 구조 (서버) +### 5.5 배포 디렉토리 구조 (서버) ``` /home/kjh2064/ ├── taxbaik_active → ./deployments/taxbaik_20260626_150000/ @@ -132,7 +243,7 @@ KillMode=mixed # SIGTERM → 30초 대기 → SIGKILL --- -## 4. Nginx 라우팅 +## 6. Nginx 라우팅 기존 Gitea (`/`)와 QuantEngine (`/quant/`)을 유지하면서 TaxBaik 추가: @@ -166,9 +277,9 @@ location /taxbaik/admin { --- -## 5. 데이터베이스 +## 6. 데이터베이스 -### 5.1 연결 설정 +### 4.1 연결 설정 **환경 변수** (systemd unit file에 설정): ```ini @@ -177,7 +288,7 @@ Environment=ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;Usernam **절대 appsettings.Production.json에 비밀값을 하드코딩하지 말 것.** -### 5.2 Dapper 사용 패턴 +### 3.2 Dapper 사용 패턴 **DbConnectionFactory.cs**: ```csharp @@ -209,7 +320,7 @@ public async Task GetBySlugAsync(string slug, CancellationToken ct) - 절대 문자열 연결 금지 - 대소문자 구분 안 함 (Dapper가 매핑) -### 5.3 마이그레이션 +### 3.3 마이그레이션 마이그레이션 파일: `db/migrations/V{number}__{description}.sql`