πŸŽ‰ berenickt λΈ”λ‘œκ·Έμ— 온 κ±Έ ν™˜μ˜ν•©λ‹ˆλ‹€. πŸŽ‰
Front
NextJs
02-pages와 layouts

Pages and Layouts

κ³„μ†ν•˜κΈ° 전에 λΌμš°νŒ… κΈ°λ³Έ 사항 및 λΌμš°νŒ… μ •μ˜ νŽ˜μ΄μ§€λ₯Ό μ½μ–΄λ³΄λŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€.

Next.js 13의 μ•± λΌμš°ν„°μ—λŠ” νŽ˜μ΄μ§€, 곡유 λ ˆμ΄μ•„μ›ƒ 및 ν…œν”Œλ¦Ώμ„ μ‰½κ²Œ λ§Œλ“€ 수 μžˆλŠ” μƒˆλ‘œμš΄ 파일 μ»¨λ²€μ…˜μ΄ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 νŽ˜μ΄μ§€μ—μ„œλŠ” Next.js μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ΄λŸ¬ν•œ νŠΉλ³„ν•œ νŒŒμΌλ“€μ„ μ‚¬μš©ν•˜λŠ” 방법을 μ•ˆλ‚΄ν•©λ‹ˆλ‹€.


1. Pages

pageλŠ” κ²½λ‘œμ— κ³ μœ ν•œ UIμž…λ‹ˆλ‹€. 기본적으둜 page.js νŒŒμΌμ—μ„œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‚΄λ³΄λ‚΄μ„œ νŽ˜μ΄μ§€λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, index νŽ˜μ΄μ§€λ₯Ό λ§Œλ“€λ €λ©΄, app 디렉토리에 page.js νŒŒμΌμ„ μΆ”κ°€ν•©λ‹ˆλ‹€:

λΌμš°νŒ…-μš©μ–΄

app/page.tsx
1
// `app/page.tsx`λŠ” `/` URL의 UIμž…λ‹ˆλ‹€.
2
export default function Page() {
3
return <h1>Hello, Home page!</h1>
4
}
app/dashboard/page.tsx
1
// `app/dashboard/page.tsx` λŠ”`/dashboard` URL의 UIμž…λ‹ˆλ‹€.
2
export default function Page() {
3
return <h1>Hello, Dashboard Page!</h1>
4
}

μ•Œμ•„λ‘˜ λ§Œν•œ 점(Good to know):

  • νŽ˜μ΄μ§€λŠ” 항상 라우트 ν•˜μœ„ 트리의 λ¦¬ν”„μž…λ‹ˆλ‹€.
  • νŽ˜μ΄μ§€μ—μ„œ .js, .jsx λ˜λŠ” .tsx 파일 ν™•μž₯자λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 라우트 μ„Έκ·Έλ¨ΌνŠΈμ— 곡개적으둜 μ ‘κ·Όν•˜λ €λ©΄ page.js 파일이 ν•„μš”ν•©λ‹ˆλ‹€.
  • νŽ˜μ΄μ§€λŠ” 기본적으둜 μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ΄μ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈλ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŽ˜μ΄μ§€λŠ” 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ Data-Fetching μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ„Έμš”.

2. Layouts

λ ˆμ΄μ•„μ›ƒμ€ μ—¬λŸ¬ 경둜 간에 κ³΅μœ λ˜λŠ” UIμž…λ‹ˆλ‹€. 경둜λ₯Ό 탐색할 λ•Œ, λ ˆμ΄μ•„μ›ƒμ€ stateλ₯Ό λ³΄μ‘΄ν•˜κ³  μƒν˜Έμž‘μš©ν•˜λŠ” stateλ₯Ό μœ μ§€ν•˜λ©° 재 λ Œλ”λ§μ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ ˆμ΄μ•„μ›ƒμ€ 쀑첩될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜ν•˜λ €λ©΄ 기본적으둜 layout.js νŒŒμΌμ—μ„œ React μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‚΄λ³΄λ‚΄λŠ” λ°©μ‹μœΌλ‘œ λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈλŠ” λ Œλ”λ§ 쀑에 μžμ‹ λ ˆμ΄μ•„μ›ƒ(μžˆλŠ” 경우) λ˜λŠ” νŽ˜μ΄μ§€λ‘œ μ±„μ›Œμ§ˆ μžμ‹ ν”„λ‘œνΌν‹°λ₯Ό λ°›μ•„λ“€μ—¬μ•Ό ν•©λ‹ˆλ‹€.

Layouts

app/dashboard/layout.tsx
1
export default function DashboardLayout({
2
children, // will be a page or nested layout
3
}: {
4
children: React.ReactNode
5
}) {
6
return (
7
<section>
8
{/* Include shared UI here e.g. a header or sidebar */}
9
<nav></nav>
10
11
{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 νƒœκ·Έλ₯Ό 포함해야 ν•©λ‹ˆλ‹€.

app/layout.tsx
1
export default function RootLayout({ children }: { children: React.ReactNode }) {
2
return (
3
<html lang="en">
4
<body>{children}</body>
5
</html>
6
)
7
}

2.2 Nesting Layouts

기본적으둜, 폴더 계측 ꡬ쑰의 λ ˆμ΄μ•„μ›ƒμ€ μ€‘μ²©λ˜μ–΄ μžˆμœΌλ―€λ‘œ, children ν”„λ‘œνΌν‹°λ₯Ό 톡해 μžμ‹ λ ˆμ΄μ•„μ›ƒμ„ κ°μ‹Έκ²Œ λ©λ‹ˆλ‹€. νŠΉμ • 경둜 μ„Έκ·Έλ¨ΌνŠΈ(폴더) μ•ˆμ— layout.jsλ₯Ό μΆ”κ°€ν•˜μ—¬ λ ˆμ΄μ•„μ›ƒμ„ 쀑첩할 수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, /dashboard κ²½λ‘œμ— λŒ€ν•œ λ ˆμ΄μ•„μ›ƒμ„ λ§Œλ“€λ €λ©΄, λŒ€μ‹œλ³΄λ“œ 폴더에 μƒˆ layout.js νŒŒμΌμ„ μΆ”κ°€ν•©λ‹ˆλ‹€:

Nesting Layouts

app/dashboard/layout.tsx
1
export default function DashboardLayout({ children }: { children: React.ReactNode }) {
2
return <section>{children}</section>
3
}

μœ„μ˜ 두 λ ˆμ΄μ•„μ›ƒμ„ κ²°ν•©ν•˜λ©΄ 루트 λ ˆμ΄μ•„μ›ƒ(app/layout.js)이 λŒ€μ‹œλ³΄λ“œ λ ˆμ΄μ•„μ›ƒ(app/dashboard/layout.js)을 감싸고, 루트 λ ˆμ΄μ•„μ›ƒμ€ app/dashboard/* μ•ˆμ— μžˆλŠ” 경둜 μ„Έκ·Έλ¨ΌνŠΈλ₯Ό κ°μ‹Έκ²Œ λ©λ‹ˆλ‹€.

두 λ ˆμ΄μ•„μ›ƒμ€ μ΄λ ‡κ²Œ μ€‘μ²©λ©λ‹ˆλ‹€:

Nesting Layouts

μ•Œμ•„λ‘˜ λ§Œν•œ 점:

  • .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을 λ°›μ•„λ“€μ—¬μ•Ό ν•©λ‹ˆλ‹€.

Nesting Layouts

app/template.tsx
1
export default function Template({ children }: { children: React.ReactNode }) {
2
return <div>{children}</div>
3
}

μ€‘μ²©μ˜ κ΄€μ μ—μ„œ template.jsλŠ” λ ˆμ΄μ•„μ›ƒκ³Ό κ·Έ μžμ‹ 사이에 λ Œλ”λ§λ©λ‹ˆλ‹€. λ‹€μŒμ€ λ‹¨μˆœν™”λœ 좜λ ₯μž…λ‹ˆλ‹€:

Output
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 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

app/page.tsx
1
import { Metadata } from 'next'
2
3
export const metadata: Metadata = {
4
title: 'Next.js',
5
}
6
7
export default function Page() {
8
return '...'
9
}

μ•Œμ•„λ‘˜ λ§Œν•œ 점:

root λ ˆμ΄μ•„μ›ƒμ— <title> 및 <meta>와 같은 <head> νƒœκ·Έλ₯Ό μˆ˜λ™μœΌλ‘œ μΆ”κ°€ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. λŒ€μ‹  <head> μš”μ†Œμ˜ 슀트리밍 및 쀑볡 μ œκ±°μ™€ 같은 κ³ κΈ‰ μš”κ΅¬ 사항을 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 메타데이터 APIλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

API λ ˆνΌλŸ°μŠ€μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ 메타데이터 μ˜΅μ…˜λ“€μ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄μ„Έμš”.