Next.js App Router ๊ธฐ๋ฐ Kanban ์์คํ ์ ์ํ ๋๊ธฐํ ๋ฐ Hydration ์ด์ ํด๊ฒฐ
I Built a Job Tracker and These Bugs Nearly Finished Me โ Advice Welcome ๐
AI ์์ฝ
Context
Next.js 16, MongoDB, DnD Kit๋ฅผ ํ์ฉํ Kanban ์คํ์ผ์ Job Tracker ๊ตฌ์ถ ๊ณผ์ ์์ ๋ฐ์ํ ์ํ ๊ด๋ฆฌ ๋ฐ ๋ ๋๋ง ๋ถ์ผ์น ๋ฌธ์ ๋ถ์. Server Actions์ Client State ๊ฐ์ ๋๊ธฐํ ๋ถ์ฌ๋ก ์ธํ UI ์ ๋ฐ์ดํธ ์ง์ฐ ๋ฐ Next.js์ ๊ณต๊ฒฉ์ ์ธ Caching ์ ๋ต์ผ๋ก ์ธํ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๊ฒฐ์ฌ๊ฐ ์ฃผ์ ๋ณ๋ชฉ์ผ๋ก ์์ฉ.
Technical Solution
- useEffect ๋ด setState ์ง์ ํธ์ถ๋ก ์ธํ ๋ฌดํ re-render ๋ฐ์์ useState ์ด๊ธฐ๊ฐ ์ค์ ์ ํตํ ๋ถํ์ํ Side Effect ์ ๊ฑฐ๋ก ํด๊ฒฐ
- Type Narrowing ๋ถ์ฌ๋ก ์ธํ TypeScript ํ์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ Optional Chaining ๊ธฐ๋ฐ์ ์กฐ๊ฑด๋ถ ์ฒดํฌ๋ฅผ ํตํด ์ ์ ํ์ ์์ ์ฑ ํ๋ณด
- Server Action ์๋ฃ ํ UI ๋ฏธ๋ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด useBoard๋ถํฐ ํ์ ์ปดํฌ๋ํธ๊น์ง ์ด์ด์ง๋ Callback Chain ๊ตฌ์กฐ ์ค๊ณ
- revalidatePath ํธ์ถ ์ ๋ฐ์ํ๋ Callback ํจ์ ์์ค ๋ฌธ์ ๋ฅผ ํ์ ํ์ฌ ์๋ State Update ๋ฐฉ์์ผ๋ก ์ ํํ์ฌ UI ๋ฐ์์ฑ ์ ์ง
- "use cache" ์ง์์ด๋ก ์ธํ Stale Data ๋ ธ์ถ ๋ฌธ์ ๋ฅผ ์บ์ฑ ์ ๋ต ์ ๊ฑฐ๋ฅผ ํตํด ์ค์๊ฐ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ณด์ฅ
- Server-Client ๊ฐ ID ์์ฑ ๋ถ์ผ์น๋ก ์ธํ Hydration Mismatch ํ์์ isMounted ํจํด์ ์ ์ฉํ Client-only Rendering์ผ๋ก ํด๊ฒฐ
์ค์ฒ ํฌ์ธํธ
- Next.js App Router ์ฌ์ฉ ์ Server Action๊ณผ Client State ๊ฐ์ ๋๊ธฐํ ์ ๋ต(React Query, Zustand ๋ฑ) ๊ฒํ - DnD Kit์ ๊ฐ์ Client-side ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ์ isMounted ํจํด์ ํตํ Hydration Warning ๋ฐฉ์ง - useEffect ์ฌ์ฉ ์ useState์ ์ด๊ธฐ๊ฐ ์ค์ ์ด๋ Derived State๋ก ๋์ฒด ๊ฐ๋ฅํ์ง ์ฐ์ ํ์ธ - Next.js์ Caching ๋ฉ์ปค๋์ฆ์ด ์ค์๊ฐ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ์๊ตฌ์ฌํญ๊ณผ ์ถฉ๋ํ๋์ง ๊ฒ์ฆ