NEXT.JS : Layout, (๊ด„ํ˜ธfolder), metadata

<angeLog/>ยท2024๋…„ 3์›” 23์ผ
0

NEXT.JS

๋ชฉ๋ก ๋ณด๊ธฐ
6/7
post-thumbnail

๐Ÿ’ก๋…ธ๋งˆ๋“œ์ฝ”๋” ๋‹ˆ๊ผฌ์Œค์˜ ๊ฐ•์˜๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถ€ํ•˜๋Š” ์‹œ๋ฆฌ์ฆˆ์ž…๋‹ˆ๋‹ค.

Layout?

์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๋™์ผํ•œ layout์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก component๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ.
๋‹จ์ผ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ตœ์ƒ์œ„layoutํŒŒ์ผ์— component๋ฅผ importํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๊ณ , ํŽ˜์ด์ง€๋ณ„๋กœ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋ฉด ๊ฐํŽ˜์ด์ง€๋งˆ๋‹ค layoutํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

Root Layout

Next๋Š” layout์„ ๋จผ์ € ํ™•์ธ ํ•˜๊ณ , layout ์ปดํฌ๋„ŒํŠธ์˜ children prop์„ page๋กœ renderํ•œ๋‹ค.

//์ตœ์ƒ์œ„ layout
export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body>
        <h1>์ตœ์ƒ์œ„ ๋ ˆ์ด์•„์›ƒ</h1>
        {children}
      </body>
    </html>
  );
}

Nested Layout

Next์—์„œ layout์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ ์ƒ์‡„๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ค‘์ฒฉ๋œ๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด ์ตœ์ƒ์œ„ layout๋ง๊ณ ๋„ aboutํด๋”์— layout์ด ๋” ์žˆ๋‹ค๋ฉด, ๋‘๊ฐœ์˜ ๋ ˆ์ด์•„์›ƒ์ด ๋™์‹œ์— ๋ณด์—ฌ์ง„๋‹ค.

โ€ปํ•˜์œ„ ๋ ˆ์ด์•„์›ƒ์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” html, body๊ฐ€ ์•„๋‹Œ div๋กœ component๋ฅผ ๊ฐ์‹ธ์•ผํ•œ๋‹ค.

//aboutํด๋” layout.tsx์ถ”๊ฐ€
export default function Layout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <div>
      <h1>ํ•˜์œ„ ๋ ˆ์ด์•„์›ƒ</h1>
      {children}
    </div>
  );
}

aboutํด๋”์— ์ถ”๊ฐ€ํ•œ layout์ด ์ค‘์ฒฉ๋˜์–ด ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

(๊ด„ํ˜ธfoloer)

Next๋Š” rout-group์ด๋ผ๋Š” ์žฌ๋ฏธ๋‚œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ์ด๊ฒƒ์€ pageํŒŒ์ผ์—๋งŒ ํ•œ์ •๋œ ๊ฒƒ์ธ๋ฐ,
(๊ด„ํ˜ธfoloer)๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ ์•ˆ์œผ๋กœ ์˜ฎ๊ฒจ๋„ url์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ณ€ํ™” ์—†์ด ์ž‘๋™ํ•œ๋‹ค.

metadata

Next์˜ metadata๋Š” ๋ณ‘ํ•ฉ๋œ๋‹ค.

์ตœ์ƒ์œ„ layoutํŒŒ์ผ์˜ ์ƒ๋‹จ์—๋Š” metadata๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด metadata๋ฅผ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— ์ž‘์„ฑํ•˜์—ฌ ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ค๋ฅธ metadata๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

//์ตœ์ƒ์œ„ layout.tsx
export const metadata = {
  title: {
    template: '%s | Next Movies',
    default: 'Loading...',
  },
  description: 'The best movies on the best framework',
};

//์ตœ์ƒ์œ„page.tsx
export const metadata = {
  title: 'HOME',
};

//aboutํด๋” page.tsx
export const metadata = {
  title: 'ABOUT',
};

๊ฐ๊ฐ์˜ ํŒŒ์ผ์— ์ž…๋ ฅํ•œ metadata๊ฐ€ ๋ณ‘ํ•ฉ๋˜์–ด ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ด์ฒ˜๋Ÿผ ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ metadata๋ฅผ ๋ณด์—ฌ์ค˜์•ผํ•  ๋•Œ ์œ ์šฉํžˆ ์‚ฌ์šฉํ•˜๊ณ  head์— ์ง์ ‘ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฒ€์ƒ‰์—”์ง„์ตœ์ ํ™”SEO๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

โ€ป'use client'์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค!

๐Ÿ‘‰๐ŸปNEXT.JS๊ณต์‹๋ฌธ์„œ Metadata

profile
์ผ๋‹จ ํ•ด๋ณผ๊ฒŒ์š”!โœ๐Ÿป

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