framework/NextJS

πŸš€ Next.js App Router: λ ˆμ΄μ•„μ›ƒκ³Ό νŽ˜μ΄μ§€ ꡬ쑰 μ™„λ²½ κ°€μ΄λ“œ

octo54 2025. 4. 14. 11:38
λ°˜μ‘ν˜•

πŸš€ Next.js App Router: λ ˆμ΄μ•„μ›ƒκ³Ό νŽ˜μ΄μ§€ ꡬ쑰 μ™„λ²½ κ°€μ΄λ“œ

Next.js의 App RouterλŠ” React 기반 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ νŽ˜μ΄μ§€ ꡬ쑰와 UI λ ˆμ΄μ•„μ›ƒμ„ 파일 μ‹œμŠ€ν…œ 기반으둜 ꡬ성할 수 있게 ν•΄μ€λ‹ˆλ‹€. app/ 디렉토리 λ‚΄λΆ€μ˜ 폴더와 파일 이름이 κ³§ λΌμš°νŒ… κ²½λ‘œκ°€ 되며, 쀑첩 λΌμš°νŒ…κ³Ό λ ˆμ΄μ•„μ›ƒ κ³΅μœ κ°€ 맀우 μžμ—°μŠ€λŸ½κ³  μ§κ΄€μ μœΌλ‘œ κ΅¬ν˜„λ©λ‹ˆλ‹€.


πŸ“„ νŽ˜μ΄μ§€(Page)λž€?

page.tsx λ˜λŠ” page.js νŒŒμΌμ€ νŠΉμ • κ²½λ‘œμ— ν‘œμ‹œλ  μ½˜ν…μΈ λ₯Ό λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ 1 – 루트 경둜

// app/page.tsx
export default function Home() {
  return <h1>ν™ˆ νŽ˜μ΄μ§€</h1>;
}

→ / κ²½λ‘œμ— λŒ€μ‘λ©λ‹ˆλ‹€.

μ˜ˆμ‹œ 2 – μ„œλΈŒ 경둜

// app/dashboard/page.tsx
export default function Dashboard() {
  return <h1>λŒ€μ‹œλ³΄λ“œ</h1>;
}

→ /dashboard κ²½λ‘œμ— λŒ€μ‘λ©λ‹ˆλ‹€.


🧱 λ ˆμ΄μ•„μ›ƒ(Layout)μ΄λž€?

λ°˜μ‘ν˜•

layout.tsxλŠ” ν•΄λ‹Ή 경둜 및 λͺ¨λ“  ν•˜μœ„ 경둜의 νŽ˜μ΄μ§€λ₯Ό κ°μ‹ΈλŠ” 곡톡 UIμž…λ‹ˆλ‹€.
children prop을 톡해 ν•˜μœ„ νŽ˜μ΄μ§€λ₯Ό λ Œλ”λ§ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ – 전체 μ‚¬μ΄νŠΈμ— 곡톡 적용

// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="ko">
      <body>
        <header>곡톡 헀더</header>
        {children}
      </body>
    </html>
  );
}

→ /, /dashboard, /about λ“± λͺ¨λ“  κ²½λ‘œμ— μ μš©λ©λ‹ˆλ‹€.

μ˜ˆμ‹œ – νŠΉμ • 경둜 μ „μš© λ ˆμ΄μ•„μ›ƒ

// app/dashboard/layout.tsx
export default function DashboardLayout({ children }: { children: React.ReactNode }) {
  return (
    <div className="dashboard">
      <aside>μ‚¬μ΄λ“œλ°”</aside>
      <main>{children}</main>
    </div>
  );
}

→ /dashboard μ΄ν•˜μ˜ νŽ˜μ΄μ§€λ“€μ—λ§Œ μ μš©λ©λ‹ˆλ‹€.


🧭 쀑첩 λΌμš°νŒ…(Nested Routing)

App Routerμ—μ„œλŠ” 폴더 ꡬ쑰 = URL κ²½λ‘œμž…λ‹ˆλ‹€.

app/
β”œβ”€β”€ layout.tsx         → 전체 μ•± 곡톡 λ ˆμ΄μ•„μ›ƒ
β”œβ”€β”€ page.tsx           → /
└── dashboard/
    β”œβ”€β”€ layout.tsx     → /dashboard μ „μš© λ ˆμ΄μ•„μ›ƒ
    β”œβ”€β”€ page.tsx       → /dashboard
    └── settings/
        └── page.tsx   → /dashboard/settings
  • /: 루트 νŽ˜μ΄μ§€ (app/page.tsx)
  • /dashboard: λŒ€μ‹œλ³΄λ“œ 메인 νŽ˜μ΄μ§€
  • /dashboard/settings: μ„€μ • νŽ˜μ΄μ§€

→ μƒμœ„ λ ˆμ΄μ•„μ›ƒμ΄ ν•˜μœ„ λ ˆμ΄μ•„μ›ƒμ„ κ°μ‹ΈλŠ” 계측적 UI ꡬ쑰가 μ™„μ„±λ©λ‹ˆλ‹€.


πŸ”„ λ ˆμ΄μ•„μ›ƒ vs νŽ˜μ΄μ§€: 차이점 정리

ν•­λͺ© λ ˆμ΄μ•„μ›ƒ νŽ˜μ΄μ§€

파일λͺ… layout.tsx page.tsx
μ—­ν•  곡톡 UI (헀더, λ„€λΉ„κ²Œμ΄μ…˜ λ“±) κ°œλ³„ 경둜의 μ½˜ν…μΈ 
쀑첩 μ—¬λΆ€ κ°€λŠ₯ (μƒμœ„ → ν•˜μœ„λ‘œ 계측적 적용) κ²½λ‘œλ³„ 1:1 λŒ€μ‘
μƒνƒœ μœ μ§€ μœ μ§€λ¨ (νŽ˜μ΄μ§€ 이동 μ‹œ λ¦¬λ Œλ”λ§λ˜μ§€ μ•ŠμŒ) νŽ˜μ΄μ§€ 이동 μ‹œ λ³€κ²½

πŸ” λ ˆμ΄μ•„μ›ƒ μƒνƒœ μœ μ§€μ˜ μž₯점

  • μ„±λŠ₯ μ΅œμ ν™”: λ ˆμ΄μ•„μ›ƒμ€ νŽ˜μ΄μ§€ κ°„ μ „ν™˜ μ‹œ λ¦¬λ Œλ”λ§λ˜μ§€ μ•ŠμŒ
  • UX κ°œμ„ : μ‚¬μ΄λ“œλ°”, νƒ­ UI λ“± μƒνƒœ μœ μ§€κ°€ ν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈ ꡬ성에 적합
  • ꡬ쑰적 λͺ…ν™•μ„±: 쀑첩 λ ˆμ΄μ•„μ›ƒ → 쀑첩 UI 섀계가 쉬움

βœ… μš”μ•½

  • app/ 내뢀에 폴더λ₯Ό λ§Œλ“€κ³  page.tsxλ₯Ό μΆ”κ°€ν•˜λ©΄ ν•΄λ‹Ή κ²½λ‘œκ°€ μžλ™ μƒμ„±λ©λ‹ˆλ‹€.
  • layout.tsxλ₯Ό ν™œμš©ν•˜λ©΄ 곡톡 UIλ₯Ό μ„€μ •ν•  수 있고, 쀑첩 ꡬ성이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • νŽ˜μ΄μ§€μ™€ λ ˆμ΄μ•„μ›ƒμ€ React μ»΄ν¬λ„ŒνŠΈμ΄λ©°, children을 톡해 μƒν•˜μœ„ 관계λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.
  • λ ˆμ΄μ•„μ›ƒμ€ μƒνƒœλ₯Ό μœ μ§€ν•˜μ—¬ UI/UX에 큰 이점을 μ œκ³΅ν•©λ‹ˆλ‹€.

 

Next.js, App Router, λ ˆμ΄μ•„μ›ƒ ꡬ성, νŽ˜μ΄μ§€ ꡬ쑰, 쀑첩 λΌμš°νŒ…, 폴더 기반 λΌμš°νŒ…, React, ν”„λ‘ νŠΈμ—”λ“œ ꡬ쑰, SSR, SEO μ΅œμ ν™” 10개