NextJs (4) Metadata, Routes Groups, Dynamic Routes

์ฑ„์˜๋ฏผยท2024๋…„ 2์›” 14์ผ

๐Ÿ“š Metadata

๐Ÿ’ก Metadata๋Š” ๊ผญ export ํ•ด์•ผํ•˜๋Š” ๊ฐ์ฒด๋กœ์จ ํŽ˜์ด์ง€์— head ๋ถ€๋ถ„์— ํ‘œ์‹œ๋จ.

  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ ˆ์ด์•„์›ƒ์ด ์ค‘์ฒฉ๋˜๋Š” ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ณ‘ํ•ฉ์ด ๋จ.
  • ํŽ˜์ด์ง€๋‚˜ ๋ ˆ์ด์•„์›ƒ๋งŒ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ export ํ•  ์ˆ˜ ์žˆ์Œ.
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ์Œ.
// app/layout.tsx

export const metadata: Metadata = {
  title: {
    template: "%s | Movies", 
    // template์— %s ๋ถ€๋ถ„์— ๊ฐ ํŽ˜์ด์ง€๋ณ„๋กœ ์ง€์ •ํ•œ metadata์˜ ํƒ€์ดํ‹€๊ฐ’์„ ๋ฐ›๊ฒŒ๋จ.
 
    default: "Loading...",
    // metadata์˜ ํƒ€์ดํ‹€์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ์‹œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๊ฐ’.
  },
 
  description: "The Best movies on the framework",
  // ๋งŒ์ผ description์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ ์ž‘์„ฑ ๋ฒ•.
};

// app/home/page.tsx

export const metadata = {
  title: "Home", // metadata์˜ ํƒ€์ดํ‹€์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
};

export default function Page() {
  return (...)
}

๐Ÿ“š Dynamic Metadata

๐Ÿ’ก ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๋ฐฉ๋ฒ• : generateMetadata()

  • generateMetadata๋Š” ๋™์ ์ธ ์ œ๋ชฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•ด ์กด์žฌ ํ•จ.
  • nextjs์—์„œ ๋™์ ์œผ๋กœ ๋ฐ”๋€Œ๋Š” ํŽ˜์ด์ง€์ธ [id] ๋‚ด๋ถ€์— ํŒŒ์ผ๋“ค์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
  • ์›น์‚ฌ์ดํŠธ์˜ head๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ , ์›ํ•˜๋Š” ์ œ๋ชฉ๊ณผ meta tag๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ.
// app/(movies)/movies/[id]/page.tsx
export async function generateMetadata({ params: { id } }: iParams) {
  const movie = await getMovie(id);
  return {
    title: movie.title,
  };
}

๐Ÿ“š Routes Groups

๐Ÿ’ก nextjs์—์„œ๋Š” routes๋ฅผ ๊ทธ๋ฃนํ™”ํ•ด์„œ logical groups๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

  • ํ˜„์žฌ app์— ๋ฃจํŠธํŒŒ์ผ์—๋Š” 3๊ฐœ์˜ ํŒŒ์ผ์ด ์กด์žฌํ•จ.

  • ๊ทธ ์ค‘ homeํŽ˜์ด์ง€๋กœ ํŠน์ •๋˜๋Š” ๊ฒƒ์€ page.tsx ํ•˜๋‚˜ ๋ฟ์ด๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌ.
    • ๋‹ค์Œ๊ณผ ๊ฐ™์ด (home)์ฒ˜๋Ÿผ ์†Œ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํด๋” ์ด๋ฆ„์„ ์ง€์ •ํ•ด์ฃผ๋ฉด url์„ ์ƒ์„ฑํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“š Dynamic Routes๋ž€

๐Ÿ’ก Dynamic Routes๋ž€ /movies/:Id ์™€ ๊ฐ™์ด url์ด ๋™์ ์œผ๋กœ ์ž‘์„ฑ๋˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ•œ๋‹ค.

  • nextjs์—์„œ Dynamic Routes ์ƒ์„ฑ ๋ฒ• ->
    • /app/(movies)/[movies]/[id]/pages.tsx ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ์„ ํ•ด์ฃผ์–ด์•ผ ํ•จ.
// app/(movies)/[movies]/[id]/pages.tsx
export const metadata = {
  title: "Movie",
};

export default function MovieDetail({
  params: { id }, 
    // nextJs ๋‚ด์žฅ๊ธฐ๋Šฅ์œผ๋กœ url์—์„œ id์— ํ•ด๋‹นํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•. 
}: {
  params: { id: string };
}) {
  return (
    <div>
      <h1>Movie {id} </h1>
    </div>
  );
}

// props
export default function MovieDetail(props){
  console.log(props) // ๋ฐฑ์—”๋“œ์—์„œ๋งŒ ์‹คํ–‰ { params: {id : 32313123}, searchParams: {} }
}
profile
ํ•ญ์ƒ ์žฌ๋ฐŒ๋Š”๊ฒƒ์„ ์ฐพ์•„ ํ—ค๋งค๋Š” ํ˜ธ๋ž‘์ด๋  ๋– ๋Œ์ด;

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