# 사용자별 로빙 연결 및 레벨 표시 문제 해결
## 작성일: 2025-08-25
## 작성자: happybell80
## 관련 서비스: auth-server, frontend-customer, robeing-gateway, rb8001
---
## 오후 1시 30분
### 문제 상황 1: 사용자별 로빙 연결 안됨
**증상**:
- `goeun2dc@gmail.com`으로 로그인 시 `rb10508_micro`로 연결됨
- 실제로는 `happybell80` → `rb8001`로 연결되어야 함
- DB에는 올바른 매핑이 있지만 실제 동작하지 않음
**DB 확인 결과**:
```sql
-- users 테이블
username: happybell80
email: goeun2dc@gmail.com
UUID: 1e16e9d5-59f3-54da-a661-8abeabff4230
-- workspace_member 테이블
happybell80 → rb8001 (포트 8001)
eagle0914 → rb10508_micro (포트 10508)
```
**원인 분석**:
auth-server의 gmail.py가 DB의 username을 사용하지 않고 이메일 기반 매핑 또는 이메일 앞부분 사용
---
## 오후 1시 45분
### 해결 1: auth-server JWT 토큰 수정
#### 수정 파일: auth-server/app/providers/gmail.py
**변경 전** (line 182-191):
```python
else:
# 기존 사용자 정보 업데이트
user.name = user_name
user.oauth_provider = 'google'
user.oauth_id = user_info.get('id', '')
db.commit()
logger.info(f"Existing user updated: {username} ({user_email})")
# 사용자 ID 사용 (UUID string)
user_id_str = str(user.id)
username = user.username # 문제: 새 사용자는 username이 없음
```
**변경 후**:
```python
else:
# 기존 사용자 정보 업데이트 및 username 가져오기
username = user.username if user.username else username # DB의 username 우선 사용
user.name = user_name
user.oauth_provider = 'google'
user.oauth_id = user_info.get('id', '')
db.commit()
logger.info(f"Existing user updated: {username} ({user_email})")
# 사용자 ID 사용 (UUID string)
user_id_str = str(user.id)
# username은 이미 설정됨 (신규: 매핑/생성, 기존: DB 값)
```
**결과**:
- JWT 토큰에 DB의 실제 username(`happybell80`) 포함
- Gateway가 올바른 로빙으로 라우팅
---
## 오후 2시 00분
### 문제 상황 2: 프론트엔드 사용자 표시
**증상**:
- UserMenu에서 email 앞부분만 표시
- ChatInterface에서 사용자 이름이 제대로 표시 안됨
**원인**:
- User 인터페이스에 username 필드 없음
- 표시 우선순위에서 username 누락
**해결 검토** (구현 예정):
```typescript
// auth-context.tsx
interface User {
id: string;
username?: string; // 추가 필요
email: string;
name?: string;
picture?: string;
}
// user-menu.tsx
const displayName = user?.username || user?.name || user?.id || user?.email?.split('@')[0];
```
---
## 오후 2시 30분
### 문제 상황 3: ChatInterface 하드코딩된 로빙 ID
**증상**:
- 모든 사용자에게 "RO-BEING #10508" 표시
- 실제 할당된 로빙 ID가 표시되지 않음
**원인**:
```tsx
// chat-interface.tsx line 441
RO-BEING #10508
// 하드코딩
```
**해결**:
1. ChatInterface에 robeingId prop 추가
2. GameLayout에서 userRobeingId 전달
3. 동적 표시로 변경
```tsx
// game-layout.tsx
{React.cloneElement(centerPanel, { robeingId: userRobeingId })}
// chat-interface.tsx
interface ChatInterfaceProps {
robeingId?: string;
}
RO-BEING #{robeingId.replace('rb', '').replace('_micro', '')}
```
**결과**:
- 로그인 사용자별 올바른 로빙 ID 표시
- `happybell80` → "RO-BEING #8001"
- `eagle0914` → "RO-BEING #10508"
---
## 오후 2시 45분
### 문제 상황 4: 레벨 표시 문제
**증상**:
- 헤더에 레벨 1로 표시
- DB에는 레벨 20으로 저장되어 있음
- rb8001 서비스가 하드코딩된 레벨 1 반환
**분석**:
```python
# rb8001/main.py:116-130
@app.get("/stats")
async def get_stats():
return {
"robeing_id": "rb8001",
"stats": {
"memory": 10, # 하드코딩
"compute": 10, # 하드코딩
# ...
},
"level": 1 # 하드코딩
}
```
**API 호출 경로**:
1. Frontend: `getRobeingStats('rb8001')`
2. Gateway: `https://ro-being.com/gateway/api/stats/rb8001`
3. rb8001: 하드코딩된 레벨 1 반환
---
## 오후 3시 00분
### 레벨 문제 해결 방안
#### 옵션 1: rb8001 수정 (비권장)
- rb8001에 PostgreSQL 연결 추가
- 51123 서버 DB 조회 구현
- 프로덕션 서비스 수정 위험
#### 옵션 2: Gateway에서 DB 직접 조회 (권장)
- Gateway가 이미 51123 서버에 있음
- DB 접근 가능
- 중앙집중식 관리
- 모든 로빙 통합 처리
**Gateway 수정 계획**:
```python
@app.get("/api/stats/{robeing_id}")
async def get_stats(robeing_id: str):
# DB에서 직접 조회
conn = await asyncpg.connect(...)
row = await conn.fetchrow("""
SELECT * FROM robeing_stats
WHERE robeing_id = $1
""", robeing_id)
if row:
return {
"level": row['level'], # 실제 DB 값
"experience": row['experience'],
# ...
}
```
---
## 성과
### ✅ 완료된 작업
1. **auth-server 수정**
- DB username을 JWT에 포함
- 사용자별 올바른 로빙 연결
2. **frontend-customer 수정**
- ChatInterface 동적 로빙 ID 표시
- GameLayout에서 robeingId prop 전달
### 🔄 진행 중인 작업
1. **Gateway 레벨 조회**
- DB 직접 조회로 변경 필요
- rb8001 하드코딩 문제 해결
### 📋 추가 작업 필요
1. **Frontend User 타입 개선**
- username 필드 추가
- 표시 우선순위 조정
---
## 교훈
### 1. 시스템 전체 데이터 흐름 파악 중요
- Auth → Gateway → Robeing → Frontend
- 각 단계에서 데이터 변환 확인 필요
### 2. 하드코딩 제거 필수
- rb8001의 하드코딩된 stats
- ChatInterface의 하드코딩된 ID
- 동적 데이터 사용 원칙
### 3. DB와 서비스 동기화
- DB 데이터와 서비스 응답 불일치
- 단일 진실 소스(DB) 원칙 준수
### 4. JWT 토큰 설계
- username을 primary identifier로 사용
- UUID는 내부적으로만 사용
- 일관된 사용자 식별 체계
---
## 다음 단계
1. **Gateway 수정 완료**
- `/api/stats/{robeing_id}` DB 조회 구현
- 테스트 및 배포
2. **Frontend 사용자 정보 개선**
- User 인터페이스 확장
- username 우선 표시
3. **서버 배포**
- auth-server 재시작
- Gateway 재시작
- 사용자 재로그인 유도
---
**문서 끝**