|
1 | 1 | # ProjectVG API Server |
2 | 2 |
|
3 | | -JWT + OAuth2 + WebSocket 인증 시스템을 포함한 ASP.NET Core API 서버입니다. |
4 | | - |
5 | | -## 🚀 빠른 시작 |
6 | | - |
7 | | -### 1. 전체 개발 환경 설정 (최초 1회) |
8 | | -```powershell |
9 | | -# DB와 Redis를 포함한 전체 환경 설정 |
10 | | -.\scripts\dev-setup.ps1 |
11 | | -``` |
12 | | - |
13 | | -### 2. API만 빠르게 재빌드 (개발 중) |
14 | | -```powershell |
15 | | -# API 코드 변경 후 빠른 재빌드 |
16 | | -.\scripts\start-api.ps1 |
17 | | -``` |
18 | | - |
19 | | -### 3. 서비스 중지 |
20 | | -```powershell |
21 | | -# 모든 서비스 중지 |
22 | | -.\scripts\stop-all.ps1 |
23 | | -``` |
| 3 | +**Clean Architecture 기반 AI 채팅 플랫폼 백엔드 시스템** |
| 4 | + |
| 5 | +.NET 8.0 ASP.NET Core API 서버로, JWT/OAuth2 인증, WebSocket 실시간 통신, Redis 세션 관리를 구현한 AI 채팅 플랫폼입니다. |
| 6 | + |
| 7 | +## 🏗️ 시스템 아키텍처 |
| 8 | + |
| 9 | +### Clean Architecture 구현 |
| 10 | +``` |
| 11 | +┌─────────────────── Presentation Layer ──────────────────┐ |
| 12 | +│ ProjectVG.Api (Controllers, Middleware, Authentication) │ |
| 13 | +├─────────────────── Application Layer ───────────────────┤ |
| 14 | +│ ProjectVG.Application (Services, DTOs, Business Logic) │ |
| 15 | +├─────────────────── Domain Layer ────────────────────────┤ |
| 16 | +│ ProjectVG.Domain (Entities, Repositories, Domain Rules) │ |
| 17 | +├─────────────────── Infrastructure Layer ────────────────┤ |
| 18 | +│ ProjectVG.Infrastructure (Database, External Services) │ |
| 19 | +└─────────────────── Common/Tests ────────────────────────┘ |
| 20 | +``` |
| 21 | + |
| 22 | +### 기술 스택 |
| 23 | +- **.NET 8.0**: C# 12, nullable reference types |
| 24 | +- **ASP.NET Core 8.0**: Controllers 기반 REST API |
| 25 | +- **Entity Framework Core 8.0**: Code-First, SQL Server |
| 26 | +- **Redis**: StackExchange.Redis 세션 관리 |
| 27 | +- **Authentication**: JWT + Google OAuth2 PKCE |
| 28 | +- **Testing**: xUnit + Moq + FluentAssertions |
| 29 | +- **Container**: Docker + Docker Compose |
| 30 | + |
| 31 | +## 📋 핵심 기능 |
| 32 | + |
| 33 | +### 인증 시스템 |
| 34 | +- **JWT 토큰**: Access (15분) + Refresh (30일) 이중 토큰 |
| 35 | +- **OAuth2 PKCE**: Google 인증, 게스트 로그인 |
| 36 | +- **Redis 세션**: 분산 환경 토큰 관리, blacklist 지원 |
| 37 | +- **다중 헤더**: Authorization, X-Access-Credit, X-Refresh-Credit |
| 38 | + |
| 39 | +### AI 캐릭터 관리 |
| 40 | +- **하이브리드 설정**: JSON 필드 구성 + 직접 프롬프트 입력 |
| 41 | +- **소유권 모델**: 시스템/공개/개인 캐릭터 권한 관리 |
| 42 | +- **실시간 프롬프트 생성**: 설정 기반 SystemPrompt 동적 구성 |
| 43 | + |
| 44 | +### 채팅 시스템 |
| 45 | +- **이중 프로토콜**: WebSocket + HTTP REST API |
| 46 | +- **메시지 관리**: User/Assistant/System 역할 기반 대화 |
| 47 | +- **외부 서비스 통합**: LLM, Memory, TTS 서비스 연동 |
| 48 | +- **페이지네이션**: 대화 기록 효율적 조회 |
| 49 | + |
| 50 | +### 크레딧 시스템 |
| 51 | +- **금융급 정밀도**: Decimal(18,2) 정확한 잔액 관리 |
| 52 | +- **불변 거래 기록**: 완전한 audit trail |
| 53 | +- **동시성 제어**: Optimistic concurrency 일관성 보장 |
| 54 | + |
| 55 | +## 🔧 기술 구현 |
| 56 | + |
| 57 | +### 성능 최적화 |
| 58 | +- **메모리 관리**: IMemoryOwner<byte> LOH 회피, ArrayPool 버퍼 재사용 |
| 59 | +- **비동기 패턴**: 모든 I/O 작업 async/await |
| 60 | +- **데이터베이스**: 연결 복원력 (지수 백오프 5회 재시도), 자동 마이그레이션 |
| 61 | +- **ConfigureAwait 제거**: ASP.NET Core 환경 최적화로 가독성 향상 |
| 62 | + |
| 63 | +### 보안 구현 |
| 64 | +- **JWT 보안**: 32자 이상 암호키, 다중 소스 헤더 지원 |
| 65 | +- **OAuth2 PKCE**: Proof Key for Code Exchange, CSRF 방지 |
| 66 | +- **입력 검증**: Data Annotations + 도메인 레벨 검증 |
| 67 | +- **SQL Injection 방지**: EF Core 매개변수화 쿼리 |
| 68 | + |
| 69 | +### 테스트 전략 |
| 70 | +- **100% 인증 커버리지**: JWT Provider (12), Token Service (15), Auth Service (15), JWT Filter (10) 테스트 |
| 71 | +- **다층 테스트**: Unit Tests (Mock), Integration Tests (실제 DB), End-to-End Tests (API) |
| 72 | +- **성능 검증**: Base64 인코딩 13.5% 성능 향상 측정 |
| 73 | + |
| 74 | +## 🗄️ 데이터 모델 |
| 75 | + |
| 76 | +### Core Entities |
| 77 | +- **User**: OAuth2 기반 사용자, 16자 고유 UID, 크레딧 잔액 |
| 78 | +- **Character**: 하이브리드 구성 (JSON/Direct), 공개/개인 구분 |
| 79 | +- **ConversationHistory**: 역할별 메시지, 10,000자 제한 |
| 80 | +- **CreditTransaction**: 불변 거래 기록, 소스 추적 |
| 81 | + |
| 82 | +### 데이터베이스 설계 |
| 83 | +- **Optimistic Concurrency**: RowVersion 타임스탬프 |
| 84 | +- **JSON 컬럼**: 유연한 캐릭터 설정 저장 |
| 85 | +- **정밀 Decimal**: 금융 거래 정확성 |
| 86 | +- **인덱스 전략**: 사용자별, 캐릭터별 효율적 조회 |
| 87 | + |
| 88 | +## 🌐 API 엔드포인트 |
| 89 | + |
| 90 | +### 인증 (`/api/v1/auth`, `/auth`) |
| 91 | +- `POST /api/v1/auth/refresh` - Access Token 갱신 |
| 92 | +- `POST /api/v1/auth/logout` - 세션 종료 |
| 93 | +- `POST /api/v1/auth/guest-login` - 게스트 인증 |
| 94 | +- `GET /auth/oauth2/authorize/{provider}` - OAuth2 시작 |
| 95 | + |
| 96 | +### 캐릭터 (`/api/v1/character`) |
| 97 | +- `GET /api/v1/character` - 전체 캐릭터 조회 |
| 98 | +- `POST /api/v1/character/individual` - JSON 설정 캐릭터 생성 |
| 99 | +- `POST /api/v1/character/systemprompt` - 직접 프롬프트 캐릭터 생성 |
| 100 | +- `GET /api/v1/character/my` - 내 캐릭터 관리 |
| 101 | + |
| 102 | +### 채팅 및 크레딧 |
| 103 | +- `POST /api/v1/chat` - 채팅 메시지 처리 (JWT 필수) |
| 104 | +- `GET /api/v1/credits/balance` - 크레딧 잔액 |
| 105 | +- `GET /api/v1/credits/history` - 거래 내역 (페이지네이션) |
24 | 106 |
|
25 | 107 | ## 📁 프로젝트 구조 |
26 | 108 |
|
27 | 109 | ``` |
28 | | -ProjectVG Server/ |
29 | | -├── ProjectVG.Api/ # API 레이어 |
30 | | -├── ProjectVG.Application/ # 애플리케이션 레이어 |
31 | | -├── ProjectVG.Domain/ # 도메인 레이어 |
32 | | -├── ProjectVG.Infrastructure/# 인프라 레이어 |
33 | | -├── ProjectVG.Common/ # 공통 라이브러리 |
34 | | -├── ProjectVG.Tests/ # 테스트 프로젝트 |
35 | | -├── scripts/ # Docker 스크립트 |
36 | | -├── test-clients/ # 테스트 클라이언트 |
37 | | -└── docker-compose.yml # API 서비스 설정 |
38 | | -``` |
39 | | - |
40 | | -## 🔧 Docker 최적화 설정 |
41 | | - |
42 | | -### 분리된 서비스 구조 |
43 | | -- **API 서비스**: `docker-compose.yml` (빠른 재빌드) |
44 | | -- **DB & Redis**: `docker-compose.db.yml` (별도 관리) |
45 | | - |
46 | | -### 빌드 최적화 |
47 | | -- 멀티스테이지 빌드 |
48 | | -- 레이어 캐시 활용 |
49 | | -- .dockerignore로 불필요한 파일 제외 |
50 | | -- NuGet 복원 캐시 |
51 | | - |
52 | | -### 네트워크 구성 |
53 | | -- API: `projectvg-network` |
54 | | -- DB/Redis: `projectvg-external-db` (외부 네트워크) |
55 | | -- localhost 연결로 통신 |
56 | | - |
57 | | -## 🛠️ 개발 워크플로우 |
58 | | - |
59 | | -### 초기 설정 (1회만) |
60 | | -```powershell |
61 | | -# 전체 개발 환경 설정 (DB + Redis + API) |
62 | | -.\scripts\dev-setup.ps1 |
63 | | -``` |
64 | | - |
65 | | -### 개발 중 (매일) |
66 | | -```powershell |
67 | | -# 코드 변경 후 API만 재빌드 (빠름!) |
68 | | -.\scripts\start-api.ps1 |
69 | | -``` |
70 | | - |
71 | | -### 개별 서비스 관리 |
72 | | -```powershell |
73 | | -# DB와 Redis만 시작 |
74 | | -.\scripts\start-db.ps1 |
75 | | -
|
76 | | -# API만 시작 |
77 | | -.\scripts\start-api.ps1 |
78 | | -
|
79 | | -# 모든 서비스 중지 및 정리 |
80 | | -.\scripts\stop-all.ps1 |
81 | | -``` |
82 | | - |
83 | | -### 테스트 실행 |
84 | | -```powershell |
85 | | -# JWT 인증 시스템 테스트 |
86 | | -dotnet test ProjectVG.Tests/ProjectVG.Tests.csproj |
87 | | -``` |
88 | | - |
89 | | -## 🌐 서비스 연결 정보 |
90 | | - |
91 | | -| 서비스 | URL | 포트 | 설명 | |
92 | | -|--------|-----|------|------| |
93 | | -| API | http://localhost:7910 | 7910 | 메인 API 서버 | |
94 | | -| SQL Server | localhost | 1433 | 데이터베이스 | |
95 | | -| Redis | localhost | 6380 | 캐시/세션 저장소 | |
96 | | - |
97 | | -### 데이터베이스 접속 정보 |
98 | | -- **Server**: localhost:1433 |
99 | | -- **Database**: ProjectVG |
100 | | -- **Username**: sa |
101 | | -- **Password**: ProjectVG123! |
102 | | - |
103 | | -## 🔐 JWT 인증 시스템 |
104 | | - |
105 | | -### 주요 기능 |
106 | | -- ✅ JWT Access/Refresh 토큰 |
107 | | -- ✅ OAuth2 로그인 (Google) |
108 | | -- ✅ 토큰 자동 갱신 |
109 | | -- ✅ Redis 기반 세션 관리 |
110 | | -- ✅ WebSocket 인증 준비 |
111 | | - |
112 | | -### API 엔드포인트 |
113 | | -- `POST /api/auth/test-login` - 테스트 로그인 |
114 | | -- `POST /api/auth/refresh` - 토큰 갱신 |
115 | | -- `POST /api/auth/logout` - 로그아웃 |
116 | | -- `GET /api/test/me` - 사용자 정보 (인증 필요) |
117 | | - |
118 | | -## 🚀 배포 |
119 | | - |
120 | | -### 자동 배포 (CI/CD) |
121 | | -`release` 브랜치에 푸시하면 자동 배포됩니다. |
122 | | - |
123 | | -### 수동 배포 |
124 | | -```bash |
125 | | -# 프로덕션 배포 |
126 | | -./deploy.sh |
127 | | - |
128 | | -# 개발 환경 배포 |
129 | | -./deploy-dev.sh |
130 | | - |
131 | | -# Windows 환경 |
132 | | -.\scripts\deploy.ps1 -Environment dev |
133 | | -.\scripts\deploy.ps1 -Environment prod |
134 | | -``` |
135 | | - |
136 | | -상세한 배포 가이드는 [DEPLOYMENT.md](DEPLOYMENT.md)를 참조하세요. |
137 | | - |
138 | | -## 🧪 테스트 |
139 | | - |
140 | | -### 테스트 실행 |
141 | | -```powershell |
142 | | -# 전체 테스트 |
143 | | -dotnet test ProjectVG.Tests/ProjectVG.Tests.csproj |
144 | | -
|
145 | | -# 특정 테스트 클래스 |
146 | | -dotnet test --filter "FullyQualifiedName~JwtProviderTests" |
147 | | -``` |
148 | | - |
149 | | -### 테스트 커버리지 |
150 | | -- **JWT Provider**: 100% (12개 테스트) |
151 | | -- **Token Service**: 100% (15개 테스트) |
152 | | -- **Auth Service**: 100% (15개 테스트) |
153 | | -- **JWT Filter**: 100% (10개 테스트) |
154 | | - |
155 | | -### OAuth2 테스트 클라이언트 |
156 | | - |
157 | | -#### 자동 실행 스크립트 |
158 | | -```powershell |
159 | | -# PowerShell 스크립트 (권장) |
160 | | -.\scripts\start-oauth2-client.ps1 |
161 | | -
|
162 | | -# 배치 파일 |
163 | | -.\scripts\start-oauth2-client.bat |
164 | | -``` |
165 | | - |
166 | | -#### 수동 실행 |
167 | | -```powershell |
168 | | -# 테스트 클라이언트 디렉토리로 이동 |
169 | | -cd test-clients |
170 | | -
|
171 | | -# Python 서버 실행 |
172 | | -python start-oauth2-client.py |
173 | | -``` |
174 | | - |
175 | | -#### 브라우저 접속 |
176 | | -``` |
177 | | -http://localhost:3000 |
178 | | -``` |
179 | | - |
180 | | -#### OAuth2 테스트 기능 |
181 | | -- ✅ PKCE (Proof Key for Code Exchange) 생성 |
182 | | -- ✅ OAuth2 Authorization Code Flow 테스트 |
183 | | -- ✅ Google OAuth2 연동 |
184 | | -- ✅ JWT 토큰 발급 확인 |
185 | | -- ✅ 사용자 정보 표시 |
186 | | -- ✅ 클립보드 복사 기능 |
187 | | - |
188 | | -## 📝 환경 변수 |
189 | | - |
190 | | -### 환경 변수 설정 |
191 | | -1. `env.example` 파일을 `.env`로 복사 |
192 | | -2. 필요한 값들을 수정 |
193 | | - |
194 | | -### 주요 환경 변수 |
195 | | -```bash |
196 | | -# 외부 서비스 연결 |
197 | | -LLM_BASE_URL=http://localhost:5601 |
198 | | -MEMORY_BASE_URL=http://localhost:5602 |
199 | | -TTS_API_KEY=your-tts-api-key |
200 | | - |
201 | | -# 데이터베이스 연결 |
202 | | -DB_CONNECTION_STRING=Server=localhost,1433;Database=ProjectVG;User Id=sa;Password=ProjectVG123!;TrustServerCertificate=true;MultipleActiveResultSets=true |
203 | | - |
204 | | -# Redis 연결 |
205 | | -REDIS_CONNECTION_STRING=localhost:6380 |
206 | | - |
207 | | -# JWT 설정 |
208 | | -JWT_SECRET_KEY=your-super-secret-jwt-key-here-minimum-32-characters |
209 | | -JWT_ACCESS_TOKEN_LIFETIME_MINUTES=15 |
210 | | -JWT_REFRESH_TOKEN_LIFETIME_DAYS=30 |
211 | | - |
212 | | -# OAuth2 설정 (선택사항) |
213 | | -GOOGLE_OAUTH_CLIENT_ID=your-google-client-id |
214 | | -GOOGLE_OAUTH_CLIENT_SECRET=your-google-client-secret |
215 | | -``` |
216 | | - |
217 | | -## 🐛 문제 해결 |
218 | | - |
219 | | -### 빌드 시간 단축 팁 |
220 | | -1. **DB/Redis 분리**: 한 번 시작하면 재시작 불필요 |
221 | | -2. **캐시 활용**: Docker 레이어 캐시 사용 |
222 | | -3. **선택적 빌드**: API만 재빌드 |
223 | | - |
224 | | -### 일반적인 문제 |
225 | | -- **포트 충돌**: 다른 서비스가 7910, 1433, 6380 포트 사용 중 |
226 | | -- **DB 연결 실패**: DB 초기화 대기 시간 필요 (30초) |
227 | | -- **Redis 연결 실패**: Redis 컨테이너 상태 확인 |
228 | | - |
229 | | -## 📚 추가 문서 |
230 | | - |
231 | | -- [API 참조](docs/api_reference.md) |
232 | | -- [아키텍처 가이드](docs/architecture/) |
233 | | -- [개발 가이드](docs/development/) |
234 | | -- [코딩 컨벤션](docs/coding_conventions.md) |
| 110 | +ProjectVG.Api/ # Presentation Layer |
| 111 | +├── Controllers/ # REST API 컨트롤러 |
| 112 | +├── Middleware/ # 전역 예외 처리, WebSocket |
| 113 | +├── Filters/ # JWT 인증 필터 |
| 114 | +└── Models/ # Request/Response DTO |
| 115 | +
|
| 116 | +ProjectVG.Application/ # Application Layer |
| 117 | +├── Services/ # 비즈니스 로직 서비스 |
| 118 | +├── Models/ # 애플리케이션 DTO |
| 119 | +└── Commands/ # 명령 객체 |
| 120 | +
|
| 121 | +ProjectVG.Domain/ # Domain Layer |
| 122 | +├── Entities/ # 도메인 엔티티 |
| 123 | +├── Repositories/ # 리포지토리 인터페이스 |
| 124 | +└── Common/ # 기본 엔티티, 값 객체 |
| 125 | +
|
| 126 | +ProjectVG.Infrastructure/ # Infrastructure Layer |
| 127 | +├── Persistence/ # EF Core DbContext |
| 128 | +├── Auth/ # JWT, OAuth2 구현 |
| 129 | +├── Integrations/ # 외부 서비스 클라이언트 |
| 130 | +└── Services/ # 인프라 서비스 |
| 131 | +
|
| 132 | +ProjectVG.Tests/ # Test Suite |
| 133 | +├── Api/ # 컨트롤러, 필터 테스트 |
| 134 | +├── Application/ # 서비스 통합 테스트 |
| 135 | +├── Auth/ # 인증 시스템 테스트 |
| 136 | +└── Infrastructure/ # 리포지토리, 외부 서비스 테스트 |
| 137 | +``` |
| 138 | + |
| 139 | +## 🔄 외부 서비스 연동 |
| 140 | + |
| 141 | +### 연동 서비스 |
| 142 | +- **LLM Service**: AI 모델 추론 처리 |
| 143 | +- **Memory Service**: 대화 컨텍스트 관리 |
| 144 | +- **TTS Service**: 텍스트 음성 변환 |
| 145 | + |
| 146 | +### 데이터 저장소 |
| 147 | +- **SQL Server**: 주 데이터베이스 (사용자, 캐릭터, 대화) |
| 148 | +- **Redis**: 세션 관리, 토큰 캐시 |
| 149 | + |
| 150 | +## 💡 아키텍처 설계 원칙 |
| 151 | + |
| 152 | +### Clean Architecture 적용 |
| 153 | +- **의존성 역전**: Domain ← Application ← Infrastructure |
| 154 | +- **관심사 분리**: 각 레이어별 명확한 책임 |
| 155 | +- **테스트 가능성**: Mock 기반 단위 테스트 |
| 156 | +- **기술 독립성**: 프레임워크에 종속되지 않는 비즈니스 로직 |
| 157 | + |
| 158 | +### 도메인 중심 설계 |
| 159 | +- **Rich Domain Model**: 엔티티에 비즈니스 로직 캡슐화 |
| 160 | +- **Repository Pattern**: 데이터 접근 추상화 |
| 161 | +- **Value Objects**: 불변 도메인 개념 |
| 162 | +- **Aggregate Root**: 일관성 경계 정의 |
| 163 | + |
| 164 | +### 성능 고려사항 |
| 165 | +- **비동기 처리**: I/O 바운드 작업 최적화 |
| 166 | +- **메모리 효율성**: 대용량 데이터 스트리밍 처리 |
| 167 | +- **연결 풀링**: 데이터베이스 연결 최적화 |
| 168 | +- **캐싱 전략**: Redis 기반 세션/데이터 캐시 |
0 commit comments