Pages and Layouts
κ³μνκΈ° μ μ λΌμ°ν κΈ°λ³Έ μ¬ν λ° λΌμ°ν μ μ νμ΄μ§λ₯Ό μ½μ΄λ³΄λ κ²μ μΆμ²ν©λλ€.
Next.js 13μ μ± λΌμ°ν°μλ νμ΄μ§, 곡μ λ μ΄μμ λ° ν νλ¦Ώμ μ½κ² λ§λ€ μ μλ μλ‘μ΄ νμΌ μ»¨λ²€μ μ΄ λμ λμμ΅λλ€. μ΄ νμ΄μ§μμλ Next.js μ ν리μΌμ΄μ μμ μ΄λ¬ν νΉλ³ν νμΌλ€μ μ¬μ©νλ λ°©λ²μ μλ΄ν©λλ€.
1. Pages
pageλ κ²½λ‘μ κ³ μ ν UIμ
λλ€. κΈ°λ³Έμ μΌλ‘ page.js νμΌμμ μ»΄ν¬λνΈλ₯Ό λ΄λ³΄λ΄μ νμ΄μ§λ₯Ό μ μν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, index νμ΄μ§λ₯Ό λ§λ€λ €λ©΄, app λλ ν 리μ page.js νμΌμ μΆκ°ν©λλ€:

1// `app/page.tsx`λ `/` URLμ UIμ λλ€.2export default function Page() {3return <h1>Hello, Home page!</h1>4}
1// `app/dashboard/page.tsx` λ`/dashboard` URLμ UIμ λλ€.2export default function Page() {3return <h1>Hello, Dashboard Page!</h1>4}
μμλ λ§ν μ (Good to know):
- νμ΄μ§λ νμ λΌμ°νΈ νμ νΈλ¦¬μ 리νμ λλ€.
- νμ΄μ§μμ
.js,.jsxλλ.tsxνμΌ νμ₯μλ₯Ό μ¬μ©ν μ μμ΅λλ€.- λΌμ°νΈ μΈκ·Έλ¨ΌνΈμ 곡κ°μ μΌλ‘ μ κ·Όνλ €λ©΄
page.jsνμΌμ΄ νμν©λλ€.- νμ΄μ§λ κΈ°λ³Έμ μΌλ‘ μλ² μ»΄ν¬λνΈμ΄μ§λ§ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ‘ μ€μ ν μ μμ΅λλ€.
- νμ΄μ§λ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μμ΅λλ€. μμΈν λ΄μ©μ Data-Fetching μΉμ μ μ°Έμ‘°νμΈμ.
2. Layouts
λ μ΄μμμ μ¬λ¬ κ²½λ‘ κ°μ 곡μ λλ UIμ λλ€. κ²½λ‘λ₯Ό νμν λ, λ μ΄μμμ stateλ₯Ό 보쑴νκ³ μνΈμμ©νλ stateλ₯Ό μ μ§νλ©° μ¬ λ λλ§μ νμ§ μμ΅λλ€. λ μ΄μμμ μ€μ²©λ μλ μμ΅λλ€.
λ μ΄μμμ μ μνλ €λ©΄ κΈ°λ³Έμ μΌλ‘ layout.js νμΌμμ React μ»΄ν¬λνΈλ₯Ό λ΄λ³΄λ΄λ λ°©μμΌλ‘ λ μ΄μμμ μ μν μ μμ΅λλ€.
μ»΄ν¬λνΈλ λ λλ§ μ€μ μμ λ μ΄μμ(μλ κ²½μ°) λλ νμ΄μ§λ‘ μ±μμ§ μμ νλ‘νΌν°λ₯Ό λ°μλ€μ¬μΌ ν©λλ€.

1export default function DashboardLayout({2children, // will be a page or nested layout3}: {4children: React.ReactNode5}) {6return (7<section>8{/* Include shared UI here e.g. a header or sidebar */}9<nav></nav>1011{children}12</section>13)14}
μμλ λ§ν μ :
- κ°μ₯ μμ μλ λ μ΄μμμ λ£¨νΈ λ μ΄μμμ΄λΌκ³ ν©λλ€. μ΄ νμ λ μ΄μμμ μ ν리μΌμ΄μ μ λͺ¨λ νμ΄μ§μμ 곡μ λ©λλ€. λ£¨νΈ λ μ΄μμμλ
htmlκ³Όbodyνκ·Έκ° λ°λμ ν¬ν¨λμ΄μΌ ν©λλ€.- λͺ¨λ μΈκ·Έλ¨ΌνΈ λΌμ°νΈλ μ νμ μΌλ‘ μ체 λ μ΄μμμ μ μν μ μμ΅λλ€. μ΄λ¬ν λ μ΄μμμ ν΄λΉ μΈκ·Έλ¨ΌνΈ λͺ¨λ νμ΄μ§μμ 곡μ λ©λλ€.
- λΌμ°νΈμ λ μ΄μμμ κΈ°λ³Έμ μΌλ‘ μ€μ²©λ©λλ€. κ° λΆλͺ¨ λ μ΄μμμ React
childrenνλ‘νΌν°λ₯Ό μ¬μ©ν΄ νμμ μμ λ μ΄μμμ κ°μΈμ€λλ€.- λΌμ°νΈ κ·Έλ£Ήμ μ¬μ©νμ¬ κ³΅μ λ μ΄μμ μνμμ νΉμ ν λΌμ°νΈ μΈκ·Έλ¨ΌνΈλ₯Ό μ νν μ μμ΅λλ€.
- λ μ΄μμμ κΈ°λ³Έμ μΌλ‘ μλ² μ»΄ν¬λνΈμ΄μ§λ§ ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ‘ μ€μ ν μ μμ΅λλ€.
- λ μ΄μμμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μμ΅λλ€. μμΈν λ΄μ©μ Data-FetchingμΉμ μ μ°Έμ‘°νμΈμ.
- λΆλͺ¨ λ μ΄μμκ³Ό μμ λ μ΄μμ κ°μ λ°μ΄ν°λ₯Ό μ λ¬ν μ μμ΅λλ€. νμ§λ§ λΌμ°νΈμμ λμΌν λ°μ΄ν°λ₯Ό ν λ² μ΄μ κ°μ Έμ¬ μ μμΌλ©°, Reactλ μ±λ₯μ μν₯μ μ£Όμ§ μκ³ μμ²μ μλμΌλ‘ μ€λ³΅ μ κ±°ν©λλ€.
- λ μ΄μμμ νμ¬ λΌμ°νΈμ μΈκ·Έλ¨ΌνΈμ μ κ·Όν μ μμ΅λλ€. λΌμ°νΈ μΈκ·Έλ¨ΌνΈμ μ κ·Όνλ €λ©΄, ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈμ
useSelectedLayoutSegmentνΉμuseSelectedLayoutSegmentsμ μ¬μ©ν μ μμ΅λλ€.- λ μ΄μμμμλ
.js,.jsx, νΉμ.tsxνμΌ νμ₯μλ₯Ό μ¬μ©ν μ μμ΅λλ€.layout.jsμpage.jsνμΌμ κ°μ ν΄λμ μ μν μ μμ΅λλ€. λ μ΄μμμ΄ νμ΄μ§λ₯Ό κ°μΈκ² λ©λλ€.
2.1 Root Layout (νμ)
λ£¨νΈ λ μ΄μμμ app λλ ν 리μ μ΅μμ λ 벨μ μ μλλ©° λͺ¨λ κ²½λ‘μ μ μ©λ©λλ€.
μ΄ λ μ΄μμμ νμμ΄λ©°, μλ²μμ λ°νλ μ΄κΈ° HTMLμ μμ ν μ μλλ‘ html λ° body νκ·Έλ₯Ό ν¬ν¨ν΄μΌ ν©λλ€.
1export default function RootLayout({ children }: { children: React.ReactNode }) {2return (3<html lang="en">4<body>{children}</body>5</html>6)7}
2.2 Nesting Layouts
κΈ°λ³Έμ μΌλ‘, ν΄λ κ³μΈ΅ ꡬ쑰μ λ μ΄μμμ μ€μ²©λμ΄ μμΌλ―λ‘, children νλ‘νΌν°λ₯Ό ν΅ν΄ μμ λ μ΄μμμ κ°μΈκ² λ©λλ€.
νΉμ κ²½λ‘ μΈκ·Έλ¨ΌνΈ(ν΄λ) μμ layout.jsλ₯Ό μΆκ°νμ¬ λ μ΄μμμ μ€μ²©ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, /dashboard κ²½λ‘μ λν λ μ΄μμμ λ§λ€λ €λ©΄, λμ보λ ν΄λμ μ layout.js νμΌμ μΆκ°ν©λλ€:

1export default function DashboardLayout({ children }: { children: React.ReactNode }) {2return <section>{children}</section>3}
μμ λ λ μ΄μμμ κ²°ν©νλ©΄ λ£¨νΈ λ μ΄μμ(app/layout.js)μ΄ λμ보λ λ μ΄μμ(app/dashboard/layout.js)μ κ°μΈκ³ ,
λ£¨νΈ λ μ΄μμμ app/dashboard/* μμ μλ κ²½λ‘ μΈκ·Έλ¨ΌνΈλ₯Ό κ°μΈκ² λ©λλ€.
λ λ μ΄μμμ μ΄λ κ² μ€μ²©λ©λλ€:

μμλ λ§ν μ :
.js,.jsxλλ.tsxνμΌ νμ₯μλ₯Ό λ μ΄μμμ μ¬μ©ν μ μμ΅λλ€.- λ£¨νΈ λ μ΄μμμλ§
<html>λ°<body>νκ·Έλ₯Ό ν¬ν¨ν μ μμ΅λλ€.layout.jsνμΌκ³Όpage.jsνμΌμ΄ κ°μ ν΄λμ μ μλμ΄ μλ κ²½μ°. layoutμ΄ pageλ₯Ό κ°μΈκ² λ©λλ€.- layoutμ κΈ°λ³Έμ μΌλ‘ μλ² μ»΄ν¬λνΈμ΄μ§λ§, ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈλ‘ μ€μ ν μ μμ΅λλ€.
- layoutμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μμ΅λλ€. μμΈν λ΄μ©μ λ°μ΄ν° κ°μ Έμ€κΈ° μΉμ μ μ°Έμ‘°νμΈμ.
- μμ λ μ΄μμκ³Ό νμ λ μ΄μμ κ°μ λ°μ΄ν°λ₯Ό μ λ¬ν μ μμ΅λλ€.
- κ·Έλ¬λ κ²½λ‘μμ λμΌν λ°μ΄ν°λ₯Ό λ λ² μ΄μ κ°μ Έμ¬ μ μμΌλ©°,
- Reactλ μ±λ₯μ μν₯μ μ£Όμ§ μκ³ μμ²μ μλμΌλ‘ μ€λ³΅ μ κ±°ν©λλ€.
- layoutμ κ·Έ μλμ κ²½λ‘ μΈκ·Έλ¨ΌνΈμ μ‘μΈμ€ν μ μμ΅λλ€.
- λͺ¨λ κ²½λ‘ μΈκ·Έλ¨ΌνΈμ μ‘μΈμ€νλ €λ©΄,
- ν΄λΌμ΄μΈνΈ μ»΄ν¬λνΈμμ
useSelectedLayoutSegmentλλuseSelectedLayoutSegmentsλ₯Ό μ¬μ©ν μ μμ΅λλ€.- κ²½λ‘ κ·Έλ£Ήμ μ¬μ©νμ¬ κ³΅μ λ μ΄μμ μνμμ νΉμ κ²½λ‘ μΈκ·Έλ¨ΌνΈλ₯Ό μ νν μ μμ΅λλ€.
- κ²½λ‘ κ·Έλ£Ήμ μ¬μ©νμ¬ μ¬λ¬ root λ μ΄μμμ λ§λ€ μ μμ΅λλ€. μ¬κΈ°μμ μμλ₯Ό μ°Έμ‘°νμΈμ.
νμ΄μ§ λλ ν 리μμ λ§μ΄κ·Έλ μ΄μ νκΈ°:
- root λ μ΄μμμ
_app.jsλ°_document.jsνμΌμ λ체ν©λλ€.- λ§μ΄κ·Έλ μ΄μ κ°μ΄λλ₯Ό μ°Έμ‘°νμΈμ.
3. Templates
Templatesμ κ° νμ λ μ΄μμ λλ νμ΄μ§λ₯Ό λννλ€λ μ μμ λ μ΄μμκ³Ό μ μ¬ν©λλ€. λΌμ°νΈ μ 체μμ μ§μλκ³ , μνλ₯Ό μ μ§νλ λ μ΄μμκ³Ό λ¬λ¦¬, Templatesμ νμ μ κ° νμ λ μ΄μμμ λν΄ μ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€. μ¦, μ¬μ©μκ° ν νλ¦Ώμ 곡μ νλ κ²½λ‘ μ¬μ΄λ₯Ό νμν λ μ»΄ν¬λνΈμ μ μΈμ€ν΄μ€κ° λ§μ΄νΈλκ³ , DOM μμκ° λ€μ μμ±λλ©°, stateκ° λ³΄μ‘΄λμ§ μκ³ , effectλ€μ΄ λ€μ λκΈ°νλ©λλ€.
νΉμ λμμ΄ νμν κ²½μ° λ μ΄μμλ³΄λ€ ν νλ¦Ώμ΄ λ μ ν©ν μ΅μ μ΄ λ μ μμ΅λλ€. μλ₯Ό λ€λ©΄,
useEffect(μ: νμ΄μ§ μ‘°ν μ λ‘κΉ ) λ°useState(μ: νμ΄μ§λ³ νΌλλ°± νΌ)μ μμ‘΄νλ κΈ°λ₯λ€.- νλ μμν¬μ κΈ°λ³Έμ μΈ λμμ λ³κ²½ν λ.
- μλ₯Ό λ€μ΄, λ μ΄μμ λ΄λΆμ μμ€νμ€ λΌμ°νΈλ λ μ΄μμμ μ²μ λ‘λν λλ§ fallbackμ νμνκ³ νμ΄μ§λ₯Ό μ νν λλ νμνμ§ μμ΅λλ€.
- ν νλ¦Ώμ κ²½μ°, κ° νμμ fallbackμ΄ νμλ©λλ€.
ν
νλ¦Ώμ template.js νμΌμμ κΈ°λ³Έ React μ»΄ν¬λνΈλ₯Ό λ΄λ³΄λ΄μ μ μν μ μμ΅λλ€.
ν΄λΉ μ»΄ν¬λνΈλ μ€μ²©λ μΈκ·Έλ¨ΌνΈκ° λ children propμ λ°μλ€μ¬μΌ ν©λλ€.

1export default function Template({ children }: { children: React.ReactNode }) {2return <div>{children}</div>3}
μ€μ²©μ κ΄μ μμ template.jsλ λ μ΄μμκ³Ό κ·Έ μμ μ¬μ΄μ λ λλ§λ©λλ€. λ€μμ λ¨μνλ μΆλ ₯μ
λλ€:
1<Layout>2{/* ν νλ¦Ώμλ κ³ μ ν€κ° λΆμ¬λ©λλ€. */}3<Template key={routeParam}>{children}</Template>4</Layout>
4. Modifying <head>
app λλ ν 리μμ, λ©νλ°μ΄ν° APIλ₯Ό μ¬μ©νμ¬, title λ° meta λ±μ <head> HTML μμλ₯Ό μμ ν μ μμ΅λλ€.
λ©νλ°μ΄ν°λ layout.js λλ page.js νμΌμμ metadata κ°μ²΄λ₯Ό λ΄λ³΄λ΄κ±°λ, generateMetadata ν¨μλ₯Ό μ¬μ©νμ¬ μ μν μ μμ΅λλ€.
1import { Metadata } from 'next'23export const metadata: Metadata = {4title: 'Next.js',5}67export default function Page() {8return '...'9}
μμλ λ§ν μ :
root λ μ΄μμμ
<title>λ°<meta>μ κ°μ<head>νκ·Έλ₯Ό μλμΌλ‘ μΆκ°ν΄μλ μ λ©λλ€. λμ<head>μμμ μ€νΈλ¦¬λ° λ° μ€λ³΅ μ κ±°μ κ°μ κ³ κΈ μꡬ μ¬νμ μλμΌλ‘ μ²λ¦¬νλ λ©νλ°μ΄ν° APIλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.