docs: 사용자별 로빙 동적 할당 구현 트러블슈팅 문서 추가
- 문제 상황: 하드코딩된 레벨 표시 - 해결 방안: 사용자별 로빙 매핑 구조 활용 - 구현 내용: getUserRobing(), getRobingStats() 함수 추가 - 교훈: 시스템 구조 이해, 하드코딩 제거, API 일관성
This commit is contained in:
parent
67f9d45547
commit
2c8e99fbda
225
troubleshooting/250820_happybell80_사용자별로빙동적할당구현.md
Normal file
225
troubleshooting/250820_happybell80_사용자별로빙동적할당구현.md
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
# 사용자별 로빙 동적 할당 및 레벨 표시 구현
|
||||||
|
|
||||||
|
## 작성일: 2025-08-20
|
||||||
|
## 작성자: happybell80
|
||||||
|
## 관련 서비스: frontend-customer, rb10508_micro, robeing-monitor
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 오후 4시 30분
|
||||||
|
|
||||||
|
### 문제 상황
|
||||||
|
|
||||||
|
프론트엔드 헤더에 로빙 레벨이 하드코딩되어 있어 실제 DB 값과 불일치:
|
||||||
|
- game-layout.tsx: "LV.12" 하드코딩
|
||||||
|
- skills-items-panel.tsx: 기본값 20으로 설정
|
||||||
|
- 모든 사용자가 동일한 로빙(rb10508_micro) 사용
|
||||||
|
|
||||||
|
### 시스템 구조 파악
|
||||||
|
|
||||||
|
#### 로빙 시스템 아키텍처
|
||||||
|
```
|
||||||
|
사용자 로그인 (Google OAuth)
|
||||||
|
↓
|
||||||
|
users 테이블 (UUID)
|
||||||
|
↓
|
||||||
|
workspace_members 테이블
|
||||||
|
(robing_id 할당)
|
||||||
|
↓
|
||||||
|
로빙 컨테이너
|
||||||
|
(rb8001, rb10508_micro 등)
|
||||||
|
↓
|
||||||
|
robeing-monitor (9024)
|
||||||
|
(통합 상태 관리)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 핵심 테이블 관계
|
||||||
|
- **users**: 사용자 UUID 저장
|
||||||
|
- **workspace_members**: user_id → robing_id 매핑
|
||||||
|
- **robing_stats**: 각 로빙의 레벨, 경험치, 스탯
|
||||||
|
|
||||||
|
#### 서비스 구조
|
||||||
|
- **51123 서버**: nginx, frontend-customer, auth-server
|
||||||
|
- **51124 서버**: 로빙 컨테이너들 (rb8001:8001, rb10508_micro:10508)
|
||||||
|
- **robeing-monitor**: 통합 상태 관리 (포트 9024)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 오후 4시 45분
|
||||||
|
|
||||||
|
### 해결 방안 설계
|
||||||
|
|
||||||
|
#### 1. API 구조 설계
|
||||||
|
```typescript
|
||||||
|
// 필요한 API 엔드포인트
|
||||||
|
1. GET /api/user/robing - 사용자에게 할당된 로빙 정보
|
||||||
|
2. GET /api/stats/{robing_id} - 특정 로빙의 스탯 조회
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. 프론트엔드 수정 계획
|
||||||
|
- 하드코딩된 로빙 ID를 동적으로 변경
|
||||||
|
- 사용자별 로빙 정보 조회 로직 추가
|
||||||
|
- 실시간 레벨 정보 표시
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 오후 4시 50분
|
||||||
|
|
||||||
|
### 구현 작업
|
||||||
|
|
||||||
|
#### 1. robing-api.ts 수정
|
||||||
|
```typescript
|
||||||
|
// 새로운 함수 추가
|
||||||
|
export async function getUserRobing(): Promise<{
|
||||||
|
robing_id: string;
|
||||||
|
robing_url: string;
|
||||||
|
} | null> {
|
||||||
|
// workspace_members에서 사용자의 로빙 조회
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getRobingStats(robingId: string): Promise<{
|
||||||
|
level: number;
|
||||||
|
experience: number;
|
||||||
|
// ...
|
||||||
|
}> {
|
||||||
|
// 특정 로빙의 스탯 조회
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. game-layout.tsx 수정
|
||||||
|
```typescript
|
||||||
|
// 변경 전
|
||||||
|
const [robingLevel, setRobingLevel] = useState<number>(1);
|
||||||
|
// 하드코딩: LV.12
|
||||||
|
|
||||||
|
// 변경 후
|
||||||
|
const [userRobingId, setUserRobingId] = useState<string>('rb10508_micro');
|
||||||
|
// 동적 할당: LV.{robingLevel}
|
||||||
|
|
||||||
|
// useEffect로 사용자별 로빙 정보 조회
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchUserRobing = async () => {
|
||||||
|
const robingInfo = await getUserRobing();
|
||||||
|
if (robingInfo) {
|
||||||
|
setUserRobingId(robingInfo.robing_id);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fetchUserRobing();
|
||||||
|
}, [user]);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. rb10508_micro endpoints.py 수정
|
||||||
|
```python
|
||||||
|
@router.get("/api/stats/{robing_id}")
|
||||||
|
async def get_stats(robing_id: str):
|
||||||
|
# PostgreSQL 직접 연결
|
||||||
|
conn = await asyncpg.connect(
|
||||||
|
host='192.168.219.45',
|
||||||
|
port=5432,
|
||||||
|
user='robeings',
|
||||||
|
password='robeings',
|
||||||
|
database='auth_db'
|
||||||
|
)
|
||||||
|
|
||||||
|
# robing_stats 테이블 조회
|
||||||
|
query = """
|
||||||
|
SELECT level, experience, stat_points,
|
||||||
|
memory, compute, empathy, leadership, ethics
|
||||||
|
FROM robing_stats
|
||||||
|
WHERE robeing_id = $1
|
||||||
|
"""
|
||||||
|
row = await conn.fetchrow(query, robing_id)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 오후 4시 55분
|
||||||
|
|
||||||
|
### 추가 발견 사항
|
||||||
|
|
||||||
|
#### 포트 번호 불일치 문제
|
||||||
|
- skill-embedding 서비스 포트가 문서마다 다름
|
||||||
|
- 8015 → 8515로 통일 필요
|
||||||
|
- 영향받는 파일:
|
||||||
|
- DOCS/300_architecture/360_로빙_컨테이너_경량화_전략.md
|
||||||
|
- robeing-monitor/README.md
|
||||||
|
- robeing-monitor/docker-compose.yml
|
||||||
|
- skill-embedding/.env.example
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 오후 5시 00분
|
||||||
|
|
||||||
|
### Git 푸시 작업
|
||||||
|
|
||||||
|
#### 푸시된 저장소들
|
||||||
|
1. **frontend-customer** ✅
|
||||||
|
- 사용자별 로빙 동적 할당 구현
|
||||||
|
- getUserRobing(), getRobingStats() 함수 추가
|
||||||
|
|
||||||
|
2. **rb10508_micro** ✅
|
||||||
|
- /api/stats/{robing_id} DB 조회 구현
|
||||||
|
- PostgreSQL 직접 연결 로직 추가
|
||||||
|
|
||||||
|
3. **DOCS** ✅
|
||||||
|
- 포트 번호 수정 (8015 → 8515)
|
||||||
|
- 각종 문서 업데이트
|
||||||
|
|
||||||
|
4. **skill-embedding** ✅
|
||||||
|
- .env.example 포트 번호 수정
|
||||||
|
|
||||||
|
5. **robeing-monitor** ✅
|
||||||
|
- README.md, docker-compose.yml 포트 수정
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 교훈
|
||||||
|
|
||||||
|
### 1. 시스템 구조 이해의 중요성
|
||||||
|
- 단순한 레벨 표시 문제가 아닌 전체 아키텍처 이해 필요
|
||||||
|
- users → workspace_members → robing_stats 관계 파악 필수
|
||||||
|
- 다중 로빙 체계와 사용자 매핑 구조 이해
|
||||||
|
|
||||||
|
### 2. 하드코딩 제거의 필요성
|
||||||
|
- 기존: 모든 사용자가 rb10508_micro 사용
|
||||||
|
- 개선: 사용자별 동적 로빙 할당
|
||||||
|
- 원칙: FUNCTIONAL PROGRAMMING 100%, NO HARDCODING 0%
|
||||||
|
|
||||||
|
### 3. API 설계 일관성
|
||||||
|
- RESTful 패턴 준수
|
||||||
|
- 명확한 엔드포인트 네이밍
|
||||||
|
- 에러 처리 및 기본값 제공
|
||||||
|
|
||||||
|
### 4. 문서와 코드 동기화
|
||||||
|
- 포트 번호 등 설정값 일관성 유지
|
||||||
|
- 여러 파일에 분산된 설정 통일
|
||||||
|
- 변경사항 발생 시 관련 문서 모두 업데이트
|
||||||
|
|
||||||
|
### 5. 점진적 마이그레이션
|
||||||
|
- 기본값 제공으로 하위 호환성 보장
|
||||||
|
- API 실패 시 fallback 처리
|
||||||
|
- 사용자 경험 중단 없이 개선
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 향후 개선 사항
|
||||||
|
|
||||||
|
1. **Gateway API 통합**
|
||||||
|
- 현재: 프론트엔드가 직접 로빙 호출
|
||||||
|
- 개선: Gateway를 통한 라우팅
|
||||||
|
|
||||||
|
2. **캐싱 추가**
|
||||||
|
- 로빙 정보는 자주 변경되지 않음
|
||||||
|
- localStorage 또는 메모리 캐싱 활용
|
||||||
|
|
||||||
|
3. **실시간 업데이트**
|
||||||
|
- 현재: 30초마다 폴링
|
||||||
|
- 개선: WebSocket으로 실시간 동기화
|
||||||
|
|
||||||
|
4. **로빙 상태 모니터링**
|
||||||
|
- robeing-monitor 활용도 증대
|
||||||
|
- 중앙집중식 상태 관리 강화
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**문서 끝**
|
||||||
Loading…
x
Reference in New Issue
Block a user