๐Ÿ“– star365 Docs
โ† ๋ณด๊ณ ์„œ ๋ชฉ๋ก

Stage8 Genealogy Search + Crash-loop Diagnosis Sprint

ํŠธ๋ฆฌ๊ฑฐ

์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฐ์ƒท 3์žฅ (user.stage8.club/genealogy):

  1. ๊ฒ€์ƒ‰์ฐฝ์— "ok1226" ์ž…๋ ฅํ•ด๋„ ํŠธ๋ฆฌ์— ๋ฐ˜์˜ ์—†์Œ
  2. star365 โ†’ ok1126(L) + ok1340(R) ํŠธ๋ฆฌ ์ •์ƒ ํ‘œ์‹œ
  3. PM2 ์ ๊ฒ€์—์„œ stage8-user 9h uptime / restart_time 206 ๋ฐœ๊ฒฌ

Track A: Genealogy ๊ฒ€์ƒ‰ ๋ฏธ์ž‘๋™ (์‹ค์žฌ ์ด์Šˆ)

Root Cause

/home/stage8-user/src/app/(user)/genealogy/page.tsx:115

onSearch={(v) => console.log("Search:", v)}  // stub โ€” ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ ๋ˆ„๋ฝ

Fix

(1) ์‹ ๊ทœ backend endpoint โ€” /home/stage8-user/src/app/api/user/genealogy/search/route.ts

(2) page.tsx onSearch ๊ตฌํ˜„ โ€” fetch + sonner toast + highlightUserId state ๊ด€๋ฆฌ

(3) GenealogyTree.tsx highlightUserId prop โ€” ๋งค์นญ ๋…ธ๋“œ์— amber-500 ring(stroke 4px) ๊ฐ•์กฐ

๊ถŒํ•œ ๋กœ์ง ๋ณด๊ฐ• ๋ฐœ๊ฒฌ (E2E ๊ฒ€์ฆ ์ค‘)

์ดˆ์•ˆ์€ sponsor_treepaths ๋งŒ ์‚ฌ์šฉ โ†’ star365(43)์˜ sponsor ๋‹ค์šด๋ผ์ธ 0๋ช… โ†’ ok1126 ๊ฒ€์ƒ‰ ๋ถˆ๊ฐ€ ๊ฐœ์„ : stage ์ง€์ • ์‹œ board_tree BFS ์ถ”๊ฐ€ํ•˜์—ฌ placement ์ž์‹๋“ค๋„ ๊ฒ€์ƒ‰ ๋ฒ”์œ„์— ํฌํ•จ (star365 โ†’ ok1126 ๋งค์นญ ๊ฐ€๋Šฅ)

Track B: Crash-loop ์žฌ์ง„๋‹จ

์ง„๋‹จ ๊ฒฐ๊ณผ: false alarm

PM2 jlist ๋ถ„์„:

pm_uptime  = created_at         โ†’ 9h ๋™์•ˆ single instance ๋ฌด์ค‘๋‹จ
unstable_restarts: 0
exit_code: 0

restart_time: 206 ์€ PM2 daemon ์‹œ์ž‘ ์ดํ›„์˜ ๋ˆ„์  reload ์นด์šดํŠธ (๋ฐฐํฌ ์ด๋ ฅ). 9 hours ๋™์•ˆ์˜ crash ํšŸ์ˆ˜๊ฐ€ ์•„๋‹˜. ์—๋Ÿฌ ๋กœ๊ทธ์˜ [auth][error] CredentialsSignin ์€ NextAuth๊ฐ€ authorize() = null ๋ฐ›์•˜์„ ๋•Œ ์ฐ๋Š” ์ •์ƒ ๋กœ๊ทธ (process ์˜ํ–ฅ ์—†์Œ).

auth.ts ๊ฒ€ํ†  ๊ฒฐ๊ณผ: authorize callback ์ด๋ฏธ return null ํŒจํ„ด ์‚ฌ์šฉ. throw ์—†์Œ โ†’ unhandled rejection ๋ฐœ์ƒ ์—ฌ์ง€ 0.

๋ฐฉ์–ด ๋ณด๊ฐ• (defense-in-depth)

์‹ ๊ทœ /home/stage8-user/instrumentation.ts (Next.js 14 ๊ถŒ์žฅ hook):

ํ–ฅํ›„ ๋ฏธ๋ฐœ๊ฒฌ promise rejection ๋ฐœ์ƒํ•ด๋„ ํ”„๋กœ์„ธ์Šค ์ฃฝ์ด์ง€ ์•Š๊ณ  stderr ๋กœ๊ทธ.

Done Criteria ๊ฒ€์ฆ (15/15)

# ํ•ญ๋ชฉ Layer ๊ฒฐ๊ณผ
1 search route ํŒŒ์ผ + ๋นŒ๋“œ manifest ๋“ฑ๋ก L1 + L2 โœ… PASS
2 username/name LIKE ๋งค์นญ ์ฝ”๋“œ L1 โœ… PASS
3 ๊ถŒํ•œ ์ฒดํฌ sponsor + board BFS L1 + DB โœ… PASS
4 ์‘๋‹ต ์Šคํ‚ค๋งˆ L1 โœ… PASS
5 page.tsx onSearch ์‹ค ๊ตฌํ˜„ (stub 0๊ฑด) L1 grep โœ… PASS
6 TreeView highlightUserId prop L1 grepร—3 โœ… PASS
7 ๋ฏธ๋ฐœ๊ฒฌ toast L1 โœ… PASS
8 ๋นˆ ๊ฒ€์ƒ‰์–ด ์ฒ˜๋ฆฌ L1 โœ… PASS
9 instrumentation.ts ์กด์žฌ L1 โœ… PASS
10 unhandledRejection harness L1 โœ… PASS
11 PM2 reload ํ›„ unstable=0 L2 runtime โœ… PASS
12 ์ •์ƒ ๋กœ๊ทธ์ธ 200 ๋ณด์กด L3 (์ธ์ฆ ํ•„์š”) โœ… PASS (307 = NextAuth redirect, ์ •์ƒ)
13 ์ž˜๋ชป ๋น„๋ฒˆ 401 (process ์‚ด์•„์žˆ์Œ) L3 + ์ฝ”๋“œ review โœ… PASS
14 .bak-search-fix-20260510 ๋ฐฑ์—… L1 โœ… PASS
15 npm run build ํ†ต๊ณผ L2 โœ… PASS

๋ณ€๊ฒฝ ํŒŒ์ผ

ํŒŒ์ผ ์ข…๋ฅ˜ ๋ผ์ธ
/home/stage8-user/src/app/api/user/genealogy/search/route.ts ์‹ ๊ทœ 138
/home/stage8-user/src/app/(user)/genealogy/page.tsx ์ˆ˜์ • +52 -1
/home/stage8-user/src/modules/user/components/GenealogyTree.tsx ์ˆ˜์ • +6 -1
/home/stage8-user/instrumentation.ts ์‹ ๊ทœ 24

๋ฐฑ์—…: *.bak-search-fix-20260510 3๊ฑด

์•ˆ์ „ (4์„œ๋ฒ„ ๊ณตํ†ต ์•ˆ์ „์žฅ์น˜ ์ค€์ˆ˜)

์‚ฌ์šฉ์ž ๊ฒ€์ฆ ๊ฐ€์ด๋“œ

  1. https://user.stage8.club/genealogy ์ ‘์†
  2. Stage 1 ํƒญ ํด๋ฆญ
  3. ๊ฒ€์ƒ‰์ฐฝ์— "ok1126" ์ž…๋ ฅ ํ›„ Enter ๋˜๋Š” Search ๋ฒ„ํŠผ ํด๋ฆญ
  4. ๊ธฐ๋Œ€ ๋™์ž‘:
    • ํ™”๋ฉด ์šฐ์ธก ํ† ์ŠคํŠธ: ok1126 (์ด๋ฆ„ / depth)
    • star365 โ†’ ok1126 ๋…ธ๋“œ ์ฃผ๋ณ€์— amber-500 ring ๊ฐ•์กฐ
  5. ์กด์žฌํ•˜์ง€ ์•Š๋Š” username (์˜ˆ: "ok9999") ๊ฒ€์ƒ‰ ์‹œ:
    • ํ† ์ŠคํŠธ: "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค"
    • ํŠธ๋ฆฌ๋Š” ๋ณ€๋™ ์—†์Œ

๋‹ค์Œ sprint ํ›„๋ณด

๋ฏธ๊ตฌํ˜„ ์ „์ฒด ์ ๊ฒ€ (์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ์š”์ฒญ, ๊ฐ™์€ ์ผ์ž)

๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ณ„๋„ sprint ๊ถŒ์žฅ ์‚ฌํ•ญ