From e3fdc36f2d49475917a1eb5674799fe7668f0806 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Mon, 25 Aug 2025 15:13:05 +0900 Subject: [PATCH] docs: Add troubleshooting for user-specific robeing connection and level display issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Document auth-server JWT username fix - Document frontend dynamic robeing ID implementation - Analyze rb8001 hardcoded stats problem - Propose Gateway DB query solution - Include API call flow analysis ๐Ÿค– Generated with Claude Code Co-Authored-By: Claude --- ...์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md | 275 ++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 troubleshooting/250825_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md diff --git a/troubleshooting/250825_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md b/troubleshooting/250825_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md new file mode 100644 index 0000000..e4f6661 --- /dev/null +++ b/troubleshooting/250825_happybell80_์‚ฌ์šฉ์ž๋ณ„๋กœ๋น™์—ฐ๊ฒฐ๋ฐ๋ ˆ๋ฒจํ‘œ์‹œ๋ฌธ์ œ.md @@ -0,0 +1,275 @@ +# ์‚ฌ์šฉ์ž๋ณ„ ๋กœ๋น™ ์—ฐ๊ฒฐ ๋ฐ ๋ ˆ๋ฒจ ํ‘œ์‹œ ๋ฌธ์ œ ํ•ด๊ฒฐ + +## ์ž‘์„ฑ์ผ: 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_members ํ…Œ์ด๋ธ” +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 ์žฌ์‹œ์ž‘ + - ์‚ฌ์šฉ์ž ์žฌ๋กœ๊ทธ์ธ ์œ ๋„ + +--- + +**๋ฌธ์„œ ๋** \ No newline at end of file