# [[Next.js App Router|Next.js App Router]] ## ๐Ÿ“Œ Brief Summary Next.js App Router๋Š” Next.js(๋ฒ„์ „ 13 ์ดํ›„)์—์„œ ๋„์ž…๋œ ์ตœ์‹  ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์‹œ์Šคํ…œ์œผ๋กœ, React Server Components(RSC)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์†ก๋Ÿ‰์„ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1, 2]. ์ด ์‹œ์Šคํ…œ์€ `app` ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, `page.js`, `layout.js`์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํŒŒ์ผ๋“ค์„ ํ†ตํ•ด ์ง๊ด€์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ๋ผ์šฐํŒ…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3, 4]. ## ๐Ÿ“– Core Content * **ํŠน์ˆ˜ ํŒŒ์ผ์„ ํ™œ์šฉํ•œ ๊ตฌ์กฐ์  ๋ผ์šฐํŒ…**: Next.js App Router๋Š” ๋ผ์šฐํŠธ ๊ตฌ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํŠน์ˆ˜ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ๋Š” `page.js`๋กœ, ๊ณต์œ  ๋ ˆ์ด์•„์›ƒ์€ `layout.js`๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์—๋Ÿฌ๋Š” `error.js`๋กœ, ๋กœ๋”ฉ ์ƒํƒœ๋Š” `loading.js`๋กœ ์ •์˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [3]. * **๋™์  ๋ผ์šฐํŠธ ๋ฐ ๋ผ์šฐํŠธ ๊ทธ๋ฃน**: ๋™์ ์ธ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[param]`์„ ์‚ฌ์šฉํ•˜๊ณ , ํฌ๊ด„์ (catch-all) ๋ผ์šฐํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[...param]`์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. ๋˜ํ•œ URL ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ผ์šฐํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํŠธ ๊ทธ๋ฃน(์˜ˆ: `(folderName)`) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ํŒ€๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์กฐ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. * **React Server Components (RSC) ํ†ตํ•ฉ**: App Router๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ •์ ์ด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์ฃผ๋„์ ์ธ(read-only) UI๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—†์ด ์„œ๋ฒ„์—์„œ๋งŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ Hydration ์†Œ์š” ์‹œ๊ฐ„์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [2, 6, 7]. * **ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ญํ•  ๋ถ„๋ฆฌ**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ƒํƒœ(state), `useEffect`, ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [8]. ๋”ฐ๋ผ์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํ•„์š”ํ•œ UI(๋ชจ๋‹ฌ, ์ž…๋ ฅ์ฐฝ ๋“ฑ)์—๋งŒ ํŒŒ์ผ ์ƒ๋‹จ์— `use client` ์ง€์‹œ์–ด๋ฅผ ์„ ์–ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ , ๋‚˜๋จธ์ง€๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [7, 9]. * **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ์™„๋ฒฝ ์ง€์›**: App Router๋Š” React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. `useTransition` ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‘๋‹ต์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts - [[React Server Components|React Server Components]] - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ์™€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ ๊ฐ„์˜ ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„ ๊ตฌ๋ถ„ ๋ฐ Hydration ์ตœ์†Œํ™” ์ „๋žต [6, 7, 9]. - Route Groups - ์—ฐ๊ฒฐ ์ด์œ : App Router ๋‚ด์—์„œ URL ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์กฐ์งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ํด๋” ๋ผ์šฐํŒ… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [5, 11]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ„๋„์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ ์„น์…˜(์˜ˆ: ๋งˆ์ผ€ํŒ… ํŽ˜์ด์ง€์™€ ์ƒ์  ํŽ˜์ด์ง€)์„ ์ถฉ๋Œ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• [5, 11]. - [[Concurrent Rendering|Concurrent Rendering]] - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” React์˜ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [10, 12]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ(UX)์„ ๋†’๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์›๋ฆฌ [13, 14]. ### Deeper Research Questions - ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ Route Groups ํ™˜๊ฒฝ์—์„œ ์ตœ์ƒ์œ„ `layout.js`๊ฐ€ ์—†์„ ๋•Œ, ๋‹ค๋ฅธ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ „์ฒด ํŽ˜์ด์ง€ ๋กœ๋“œ(full page load)์˜ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? [11] - App Router์—์„œ `[param]` ํ˜•ํƒœ์˜ ๋™์  ๋ผ์šฐํŠธ์™€ Route Group ๊ฐ„์˜ ๊ฒฝ๋กœ ์ค‘๋ณต(์˜ˆ: `(marketing)/about/page.tsx`์™€ `(shop)/about/page.tsx`) ์ถฉ๋Œ ์‹œ, Next.js์˜ ๋ผ์šฐํŠธ ํ•ด์„ ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š”๊ฐ€? [11] - ๊ธฐ์กด Pages Router ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ App Router์˜ React Server Components๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์‹œ ์–ด๋–ป๊ฒŒ 'Double Fetching' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š”๊ฐ€? [7, 8] - ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ(`use client`)์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ `children`์œผ๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ž„ํฌํŠธํ•  ๋•Œ ์ ์šฉ๋˜๋Š” ์ง๋ ฌํ™” ๊ทœ์น™ ๋ฐ ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [6, 7, 9] - ํŠน์ˆ˜ ๋ผ์šฐํŒ… ํŒŒ์ผ ์ค‘ `error.js`๊ฐ€ React Error Boundary๋กœ์„œ ๋™์ž‘ํ•  ๋•Œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ๊ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ํ๋ฆ„์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„๋˜๋Š”๊ฐ€? [3] ### Practical Application Contexts - **Implementation:** ๋ผ์šฐํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” `kebab-case` ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•œ ํด๋”(์˜ˆ: `auth-provider.tsx`)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ผ์šฐํŒ…ํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ์ฒ˜๋Ÿผ ์ •์ ์ธ ๋ ˆ์ด์•„์›ƒ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‘๋ฉด์„œ `AddToCartButton` ๊ฐ™์ด ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์œ„์ ฏ๋งŒ `use client` ์ปดํฌ๋„ŒํŠธ๋กœ ์ž„ํฌํŠธํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 7, 15]. - **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์กฐ์งํ•  ๋•Œ, ๊ธฐ๋Šฅ๋ณ„(Feature-Based) ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ, ํŽ˜์ด์ง€, ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ•œ ๊ธฐ๋Šฅ ํด๋”(์˜ˆ: `features/auth/`)์— ๋ชจ์œผ๊ณ , ์ด๋ฅผ ๋‹ค์‹œ `Route Groups`๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 16, 17]. - **Operation / Maintenance:** ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ์ปค์ ธ INP(Interaction to Next Paint)์™€ TTI(Time to Interactive) ๋“ฑ ์ฝ”์–ด ์›น ๋ฐ”์ดํƒˆ ์ˆ˜์น˜๊ฐ€ ์ €ํ•˜๋  ๋•Œ, ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋กœ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์—ฌ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [6, 18]. - **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ๋ชจ๋ธ ํŠธ๋ฆฌ๊ฑฐ ์š”์ธ๊ณผ ์ƒํƒœ ๋ณ€ํ™” ์›๋ฆฌ๋ฅผ ์ˆ™์ง€ํ•˜๊ณ  [19], ์ดํ›„ React 18์˜ ๋™์‹œ์„ฑ ํ›…(`useTransition`) ๋™์ž‘์„ ์‹ค์Šตํ•œ ๋’ค [12, 13], Next.js App Router์˜ Server Components๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๋Š” ์ˆœ์„œ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7]. - **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ### Adjacent Topics - Code Splitting & Lazy Loading - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router์˜ Server Components๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `React.lazy`์™€ `Suspense`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ผ์šฐํŠธ ๋ฐ ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ(์ฐจํŠธ, ์—๋””ํ„ฐ ๋“ฑ)๋ฅผ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ [20, 21]. - React Context API Optimization - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router ํ™˜๊ฒฝ ํ•˜์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์ „์—ญ ์ƒํƒœ๋ฅผ ์“ธ ๋•Œ, Context์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต ํ™•์žฅ [22-24]. --- *Last updated: 2026-04-30*