# 로빙 상태(Stats) 표시 안됨 문제 트러블슈팅 ## 작성일: 2025-08-25 ## 작성자: 서버 관리자 ## 상태: 미해결 (51124 서버 코드 수정 필요) --- ## 문제 요약 사용자가 로그인 후 프론트엔드에서 로빙의 실제 상태(레벨, 경험치, 스탯)가 표시되지 않고 하드코딩된 기본값만 표시됨 --- ## 증상 - 프론트엔드에서 항상 "LV.12", "350 코인", "75% 경험치" 표시 (하드코딩) - 실제 DB에는 rb8001이 레벨 20이지만 UI에 반영 안됨 - 게이트웨이 로그: `/api/stats/undefined` 호출 (robeing_id 미전달) --- ## 문제 분석 ### 1. 프론트엔드 문제 (51123 서버) #### 1.1 하드코딩된 UI **위치**: `/home/admin/frontend-customer/src/components/game-layout.tsx:97-101` ```jsx
LV.12 // 하드코딩
💎 350 // 하드코딩
``` #### 1.2 Stats API 호출 누락 - 프론트엔드에서 `/api/stats/{robeing_id}` 호출 로직 없음 - useEffect나 데이터 fetching 코드 부재 - SimpleStatsPanel도 props 기본값만 사용 #### 1.3 Robeing ID 미전달 - 게이트웨이 로그 확인: ``` GET /api/stats/undefined HTTP/1.0" 200 OK Stats request from user: happybell80 for robeing: undefined ``` - 프론트엔드가 사용자의 robeing_id를 가져오지 못함 ### 2. 게이트웨이 동작 (51123 서버) - 정상 #### 2.1 사용자-로빙 매핑 정상 ```sql -- DB 확인 결과 happybell80 (goeun2dc@gmail.com) → rb8001 정상 매핑 ``` #### 2.2 프록시 정상 작동 ```bash # 직접 테스트 시 정상 응답 curl http://localhost:8100/api/stats/rb8001 → 51124 서버로 정상 프록시 ``` ### 3. 51124 서버 문제 (rb8001 서비스) #### 3.1 하드코딩된 응답 **문제 위치**: `rb8001/main.py:116` ```python @app.get("/stats") async def get_stats(): # DB 조회 없이 하드코딩된 값 반환 return { "level": 1, # 항상 1 "experience": 0, "stats": { "memory": 10, "compute": 10, "empathy": 10, "leadership": 10, "ethics": 0 } } ``` #### 3.2 State Service 미연결 - `state_service.py`에 `/api/stats/{robeing_id}` 정의됨 - 하지만 `main.py`에서 import/mount 안함 - 결과: 엔드포인트 접근 불가 (404) #### 3.3 DB 값과 불일치 ```sql -- DB의 실제 값 robeing_stats 테이블: - robeing_id: rb8001 - level: 20 - experience: 2000 -- API 응답값 - level: 1 - experience: 0 ``` --- ## 문제 플로우 다이어그램 ```mermaid sequenceDiagram participant User as 사용자
(goeun2dc) participant Frontend as 프론트엔드
(51123) participant Gateway as 게이트웨이
(51123:8100) participant RB8001 as rb8001
(51124:8001) participant DB as PostgreSQL
(51123:5432) User->>Frontend: 로그인 Frontend->>Frontend: auth_token 저장 Note over Frontend: ❌ robeing_id 가져오기 누락 Frontend->>Frontend: game-layout 렌더링 Note over Frontend: ❌ 하드코딩된 값 표시
LV.12, 350코인, 75% Frontend->>Gateway: GET /api/stats/undefined ❌ Note over Gateway: robeing_id가 undefined Gateway->>Gateway: 캐시에서 사용자 조회
happybell80 → rb8001 Gateway->>RB8001: GET /stats (rb8001로 프록시) RB8001->>RB8001: ❌ DB 조회 없음 RB8001-->>Gateway: 하드코딩된 응답
level: 1, 모든 스탯: 10 Gateway-->>Frontend: 응답 전달 Frontend->>Frontend: ❌ 응답 무시
여전히 하드코딩 표시 Note over DB: 실제 값 (미사용):
level: 20
experience: 2000 ``` --- ## 해결 방안 ### 단기 (즉시 적용 가능) - 51123 서버 #### 1. 프론트엔드 수정 필요 ```typescript // game-layout.tsx 수정 예시 const [stats, setStats] = useState(null); useEffect(() => { const fetchStats = async () => { const userId = localStorage.getItem('user_id'); // 1. 먼저 사용자의 robeing_id 가져오기 const robeingResponse = await fetch(`/api/user/${userId}/robeing`); const { robeing_id } = await robeingResponse.json(); // 2. stats 가져오기 const statsResponse = await fetch(`/api/stats/${robeing_id}`); const statsData = await statsResponse.json(); setStats(statsData); }; fetchStats(); }, []); // 하드코딩 대신 동적 표시
LV.{stats?.level || 1}
💎 {stats?.coins || 0}
``` ### 중기 (51124 서버 수정 필요) #### 1. rb8001 서비스 수정 - `main.py`에서 `state_service` import 및 mount - `/stats` 엔드포인트가 DB 조회하도록 수정 - `robeing_stats` 테이블과 동기화 #### 2. State Service 활성화 ```python # main.py 수정 필요 from app.services import state_service # 라우터 마운트 app.include_router(state_service.router, prefix="/api") ``` --- ## 임시 해결책 (권장하지 않음) ### DB 직접 수정 ```sql -- rb8001의 레벨을 1로 낮추기 (비추천) UPDATE robeing_stats SET level = 1, experience = 0 WHERE robeing_id = 'rb8001'; ``` → 근본 해결 아님, API가 여전히 DB 무시 --- ## 관련 파일 - **프론트엔드**: - `/home/admin/frontend-customer/src/components/game-layout.tsx` - `/home/admin/frontend-customer/src/components/simple-stats-panel.tsx` - `/home/admin/frontend-customer/src/contexts/auth-context.tsx` - **게이트웨이**: - `/home/admin/robeing-gateway/app/main.py` (정상) - **51124 서버** (수정 필요): - `rb8001/main.py:116` - 하드코딩된 /stats - `rb8001/app/services/state_service.py` - 미연결 - **DB 테이블**: - `robeing_stats` - 실제 스탯 저장 - `workspace_members` - 사용자-로빙 매핑 --- ## 모니터링 명령어 ```bash # 게이트웨이 로그 확인 docker logs robeing-gateway --tail 50 | grep stats # DB 상태 확인 PGPASSWORD=robeings psql -h localhost -U robeings -d main_db \ -c "SELECT * FROM robeing_stats WHERE robeing_id = 'rb8001';" # API 직접 테스트 curl http://localhost:8100/api/stats/rb8001 ``` --- ## 참고 문서 - [일일 브리핑 시퀀스](/home/admin/DOCS/300_architecture/sequences/daily_briefing_sequences.md) - 비슷한 DB 연동 문제 - [OAuth 스코프 문제](/home/admin/DOCS/troubleshooting/250824_gmail_oauth_scope_issue.md) --- ## 추가 확인 사항 1. 프론트엔드에서 사용자의 robeing_id를 어떻게 가져올지 결정 필요 2. stats 업데이트 주기 (실시간 vs 폴링) 3. 캐싱 전략 (게이트웨이 캐시 활용)