// app/layout.js
export const metadata = {
title: 'Next.js',
description: 'Generated by Next.js',
}
export default function RootLayout({ children }) {
return (/* children과 레이아웃 코드*/)
}
app/layout.js의 메타데이터는 전역으로 적용되어짐
// app/about/page.js
export const metadata = {
title: "About Page"
}
export default function About() {
return <h1>about page</h1>
}
/about 페이지에서만 적용되어지는 메타데이터, 전역 metadata인 title이 있지만 page의 메타데이터가 우선이기 때문에 About page로 표현됨

// app/product/[productId]/page.js
export const generateMetadata = async ({ params }) => {
return {
title: `product ${params.productId}`
}
}
export default function ProductDetails({ params }) {
return (
<>
<h1>Details about product {params.productId}</h1>
</>
)
}
이와 같이 동적 라우팅 되는 페이지의 경우에도 params로 매개변수를 불러와 간단하게 metadata의 설정이 가능함
또한 메타데이터 function은 async function으로도 정의될 수 있는데, 이는 metadata의 컨텐츠를 비동기적으로 불러올 수 있다는 것이다
// app/product/[productId]/page.js
export const generateMetadata = async ({ params }) => {
const title = await new Promise(resolve => {
setTimeout(() => {
resolve(`iPhone ${params.productId}`)
}, 3000)
})
return {
title: `Product ${title}`
}
}
export default function ProductDetails({ params }) {
return (
<>
<h1>Details about product {params.productId}</h1>
</>
)
}
해당 예시에선 async, await을 활용한 가장 기본적인 setTimeout 함수를 활용하여 3초를 기다리게 만들었지만, fetch 등을 활용하여 metadata를 동적으로 생성하고 페이지 로드 시에 필요한 데이터를 기다린 후 metadata를 완성할 수 있다. 이러한 방식은 서버로부터 실시간 데이터를 가져와 페이지의 메타데이터에 반영할 때 특히 유용하다.
// app/layout.js
export const metadata = {
title: {
absolute: '',
default:'Next.js Tutorial - Codevolution',
template: '%s | Codevolution',
},
description: 'Generated by Next.js',
}
이와 같이 title을 세분화 시키면 absolute, default, template로 나눌 수 있음
default : 기본이 되는 title
template : 동적 title, "%s"가 하위 디렉토리의 metadata.title 값으로 바뀜
예를 들어
// app/blog/page.js
export const metadata = {
title: 'Blog',
}
export default function Blog() {
return <h1>My blog</h1>
}
이와 같이 하위 디렉토리에서 title을 정의해주면

Blog | Codevolution 과 같이 %s가 하위 디렉토리의 metadata.title 값에 따라 동적으로 변하는 것을 확인할 수 있음
// app/blog/page.js
export const metadata = {
title: {
absolute: "Blog"
}
}
export default function Blog() {
return <h1>My blog</h1>
}
이와 같이 하위 디렉토리에서 title을 absolute로 정의해주면

이와 같이 absolute로 정의한 title이 출력되는 것을 확인할 수 있다.