๐ก Metadata๋ ๊ผญ export ํด์ผํ๋ ๊ฐ์ฒด๋ก์จ ํ์ด์ง์ head ๋ถ๋ถ์ ํ์๋จ.
// 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 (...) }
๐ก ๋์ ์ผ๋ก ๋ณํ๋ ๋ฉํ๋ฐ์ดํฐ ์์ฑ ๋ฐฉ๋ฒ : generateMetadata()
// app/(movies)/movies/[id]/page.tsx export async function generateMetadata({ params: { id } }: iParams) { const movie = await getMovie(id); return { title: movie.title, }; }
๐ก nextjs์์๋ routes๋ฅผ ๊ทธ๋ฃนํํด์ logical groups๋ก ๋ง๋ค ์ ์์.
- ํ์ฌ app์ ๋ฃจํธํ์ผ์๋ 3๊ฐ์ ํ์ผ์ด ์กด์ฌํจ.
- ๊ทธ ์ค homeํ์ด์ง๋ก ํน์ ๋๋ ๊ฒ์ page.tsx ํ๋ ๋ฟ์ด๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌ.
![]()
- ๋ค์๊ณผ ๊ฐ์ด (home)์ฒ๋ผ ์๊ดํธ๋ฅผ ์ฌ์ฉํด์ ํด๋ ์ด๋ฆ์ ์ง์ ํด์ฃผ๋ฉด url์ ์์ฑํด์ฃผ์ง ์๋๋ค.
๐ก Dynamic Routes๋ /movies/:Id ์ ๊ฐ์ด url์ด ๋์ ์ผ๋ก ์์ฑ๋๊ฒ ํ๋ ๊ฒ์ ์๋ฏธ ํ๋ค.
// 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: {} } }