- daily_briefing_sequences.md: rb8001 매일 9시 브리핑 시스템 완전 문서화 - 정상 작동 시퀀스, 현재 실패 시퀀스, 토큰 갱신 플로우 포함 - Gmail 토큰 NULL 문제로 이메일 수집 실패 상황 명시 - 250825_robeing_stats_display_issue.md: 프론트엔드 로빙 상태 미표시 문제 - 프론트엔드 하드코딩, 51124 서버 DB 미조회 문제 분석 - 문제 플로우 다이어그램 및 해결 방안 제시
6.6 KiB
6.6 KiB
로빙 상태(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
<div className="bg-amber-400 text-black px-1.5 py-0.5 rounded text-xs font-bold">
LV.12 // 하드코딩
</div>
<div className="bg-violet-600 text-white px-1.5 py-0.5 rounded text-xs font-bold">
<span>💎</span> 350 // 하드코딩
</div>
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 사용자-로빙 매핑 정상
-- DB 확인 결과
happybell80 (goeun2dc@gmail.com) → rb8001 정상 매핑
2.2 프록시 정상 작동
# 직접 테스트 시 정상 응답
curl http://localhost:8100/api/stats/rb8001
→ 51124 서버로 정상 프록시
3. 51124 서버 문제 (rb8001 서비스)
3.1 하드코딩된 응답
문제 위치: rb8001/main.py:116
@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 값과 불일치
-- DB의 실제 값
robeing_stats 테이블:
- robeing_id: rb8001
- level: 20
- experience: 2000
-- API 응답값
- level: 1
- experience: 0
문제 플로우 다이어그램
sequenceDiagram
participant User as 사용자<br/>(goeun2dc)
participant Frontend as 프론트엔드<br/>(51123)
participant Gateway as 게이트웨이<br/>(51123:8100)
participant RB8001 as rb8001<br/>(51124:8001)
participant DB as PostgreSQL<br/>(51123:5432)
User->>Frontend: 로그인
Frontend->>Frontend: auth_token 저장
Note over Frontend: ❌ robeing_id 가져오기 누락
Frontend->>Frontend: game-layout 렌더링
Note over Frontend: ❌ 하드코딩된 값 표시<br/>LV.12, 350코인, 75%
Frontend->>Gateway: GET /api/stats/undefined ❌
Note over Gateway: robeing_id가 undefined
Gateway->>Gateway: 캐시에서 사용자 조회<br/>happybell80 → rb8001
Gateway->>RB8001: GET /stats (rb8001로 프록시)
RB8001->>RB8001: ❌ DB 조회 없음
RB8001-->>Gateway: 하드코딩된 응답<br/>level: 1, 모든 스탯: 10
Gateway-->>Frontend: 응답 전달
Frontend->>Frontend: ❌ 응답 무시<br/>여전히 하드코딩 표시
Note over DB: 실제 값 (미사용):<br/>level: 20<br/>experience: 2000
해결 방안
단기 (즉시 적용 가능) - 51123 서버
1. 프론트엔드 수정 필요
// 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();
}, []);
// 하드코딩 대신 동적 표시
<div>LV.{stats?.level || 1}</div>
<div>💎 {stats?.coins || 0}</div>
중기 (51124 서버 수정 필요)
1. rb8001 서비스 수정
main.py에서state_serviceimport 및 mount/stats엔드포인트가 DB 조회하도록 수정robeing_stats테이블과 동기화
2. State Service 활성화
# main.py 수정 필요
from app.services import state_service
# 라우터 마운트
app.include_router(state_service.router, prefix="/api")
임시 해결책 (권장하지 않음)
DB 직접 수정
-- 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- 하드코딩된 /statsrb8001/app/services/state_service.py- 미연결
-
DB 테이블:
robeing_stats- 실제 스탯 저장workspace_members- 사용자-로빙 매핑
모니터링 명령어
# 게이트웨이 로그 확인
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
참고 문서
- 일일 브리핑 시퀀스 - 비슷한 DB 연동 문제
- OAuth 스코프 문제
추가 확인 사항
- 프론트엔드에서 사용자의 robeing_id를 어떻게 가져올지 결정 필요
- stats 업데이트 주기 (실시간 vs 폴링)
- 캐싱 전략 (게이트웨이 캐시 활용)