๐Ÿ” 7. Next.js App Router ์™„์ „ ์ •๋ณต โ€” ์™œ ๋ฐ”๋€Œ์—ˆ๊ณ  ๋ญ๊ฐ€ ๋‹ฌ๋ผ์กŒ๋Š”์ง€ ์ •๋ฆฌํ•ด๋ดค๋‹ค

JM_Devยท2025๋…„ 4์›” 21์ผ
1
post-thumbnail

Next.js 13 ์ดํ›„์— ๋„์ž…๋œ App Router๋Š” ์‚ฌ์‹ค์ƒ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.
๊ธฐ์กด์— ์ต์ˆ™ํ–ˆ๋˜ Pages Router ๋ฐฉ์‹๊ณผ๋Š” ๋งŽ์ด ๋‹ฌ๋ผ์„œ, ์ฒ˜์Œ ๋ณด๋ฉด ๋‹นํ™ฉ์Šค๋Ÿฝ์ง€๋งŒ,
์“ฐ๋‹ค ๋ณด๋ฉด ์ง„์งœ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•˜๋‹ค๋Š” ๊ฑธ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


โœ… App Router vs Pages Router ์ฐจ์ด

ํ•ญ๋ชฉPages RouterApp Router
๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐpages/ ํด๋” ๊ธฐ๋ฐ˜app/ ํด๋” ๊ธฐ๋ฐ˜
์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธโŒ ๋ถˆ๊ฐ€๋Šฅโœ… ๊ธฐ๋ณธ ์ง€์› (Server Components)
๋ ˆ์ด์•„์›ƒํŽ˜์ด์ง€๋งˆ๋‹ค ๋”ฐ๋กœ ๊ตฌ์„ฑโœ… ์ค‘์ฒฉ ๋ ˆ์ด์•„์›ƒ ์ž๋™ ์ ์šฉ (layout.tsx)
๋ฐ์ดํ„ฐ ํŒจ์นญgetServerSideProps ๋“ฑ ์‚ฌ์šฉโœ… fetch, cache, use ๋“ฑ ์ž์œ ๋กœ์šด ๋ฐฉ์‹
๋ผ์šฐํŒ… ๋ฐฉ์‹ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์—ฌ์ „ํžˆ ํŒŒ์ผ ๊ธฐ๋ฐ˜์ด์ง€๋งŒ Link, useRouter ๋“ฑ์ด ๊ฐœ์„ ๋จ

โœ… ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์˜ˆ์‹œ

app/
โ”œโ”€โ”€ layout.tsx        // ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ
โ”œโ”€โ”€ page.tsx          // ๋ฃจํŠธ ํŽ˜์ด์ง€
โ”œโ”€โ”€ about/
โ”‚   โ””โ”€โ”€ page.tsx      // /about ๊ฒฝ๋กœ
โ”œโ”€โ”€ dashboard/
โ”‚   โ”œโ”€โ”€ layout.tsx    // /dashboard ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ
โ”‚   โ””โ”€โ”€ page.tsx

โœ… Server Components?

App Router์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋œ๋‹ค.
์ฆ‰, ํด๋ผ์ด์–ธํŠธ์— ๋ถˆํ•„์š”ํ•œ JS๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
ํ•„์š”ํ•  ๋•Œ๋งŒ use client ์ง€์‹œ์–ด๋ฅผ ํ†ตํ•ด Client Components๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

// ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ (๊ธฐ๋ณธ)
export default function Page() {
  const data = await fetch(...);
  return <div>{data}</div>;
}

// ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ
'use client'
import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}

โœ… ๋‚˜๋งŒ์˜ ์ •๋ฆฌ ํฌ์ธํŠธ

  • layout.tsx๋Š” ์ง„์งœ ๊ฐ•๋ ฅํ•˜๋‹ค. ํŽ˜์ด์ง€ ์ „ํ™˜ํ•ด๋„ layout์ด ์œ ์ง€๋ผ์„œ ์œ ์ € ๊ฒฝํ—˜์ด ํ›จ์”ฌ ๋ถ€๋“œ๋Ÿฌ์›€.
  • ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์“ฐ๋ฉด ๋ผ์„œ ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ๋” ๋ช…ํ™•ํ•จ
  • metadata, loading.tsx, error.tsx, not-found.tsx ๋“ฑ ๋ผ์šฐํŠธ๋ณ„ ์ „์šฉ ํŒŒ์ผ์„ ํ™œ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

App Router๋Š” ํ•™์Šต ๊ณก์„ ์ด ๋ถ„๋ช… ์žˆ์ง€๋งŒ,
์ „์ฒด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋“ˆํ™”, ์ตœ์ ํ™”, UX ๊ด€์ ์—์„œ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ๋ผ๋Š” ๋А๋‚Œ์ด ๋“ค์—ˆ๋‹ค.
ํŠนํžˆ SSR/CSR ํ˜ผํ•ฉ์ด๋‚˜ ์ค‘์ฒฉ ๋ ˆ์ด์•„์›ƒ์ด ๋„ˆ๋ฌด ํŽธํ•ด์„œ, ์•ž์œผ๋กœ ํ”„๋กœ์ ํŠธ์— ๊ธฐ๋ณธ์œผ๋กœ ์“ฐ๊ฒŒ ๋  ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿš€ โ€œApp Router๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ์•„๋‹ˆ๋ผ, ์›น์•ฑ ์„ค๊ณ„ ๋ฐฉ์‹ ์ž์ฒด๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ํ๋ฆ„์ด๋‹ค.โ€


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€