Metadata
정확한 정의와는 다르지만...
[Wikipedia 설명문]
메타데이터는 사이트와 각 페이지의 구조 정보 내용이다.
본 페이지의 정보가 들어있어서
SEO (Search Engine Optimization)를 위해 많이 사용한다.
그 외에 open graph도 설정할 수 있다.
채팅이나 소셜에 링크를 올리면
미리보기 같은 내용이 나오는 것을 본 적이 있을 것이다.
Metadata 사용법
Next.js에서 사용법은
페이지( page.js )에서 사용한다.
페이지에 나오는 부분이니
layout.js에서 사용해도 된다.
정적 metadata
사용하는 페이지에서
컴포넌트 밖에metadata
변수를 선언하고 export한다.
아래는
dogkaebi.com 의
(전체) layout.js에서 정의한
metadata의 내용이다.
// .\app\layout.js
export const metadata = {
metadataBase: new URL("https://dogkaebi.com"),
title: "DogKaeBi",
description: "독깨비의 광둥어 & 개발 블로그",
icons: { icon: "/logo.png" },
openGraph: {
title: "DogKaeBi | 독깨비",
description: "독깨비의 광둥어 & 개발 블로그",
url: "dogkaebi.com",
siteName: "DogKaeBi 독깨비",
type: "website",
images: [
{
url: "/logo.png",
width: 600,
height: 600,
alt: "dogkaebi",
},
],
},
twitter: {
card: "summary_large_image",
title: "DogKaeBi | 독깨비",
description: "독깨비의 광둥어 & 개발 블로그",
url: "dogkaebi.com",
site: "DogKaeBi 독깨비",
images: { url: "/logo.png", alt: "dogkaebi" },
},
};
export default function RootLayout({ children }) {
return <html>...</html>;
}
동적 metadata
사용하는 곳은 같다.
함수 generateMetadata(props)
를 선언한다.
아래는
dogkaebi.com/blog/[slug]의
page.js 에서 정의한
generateMetadata 내용이다.
// .\app\blog\[slug]\page.js
import matter from "gray-matter";
export async function generateMetadata(props) {
const slug = props.params.slug;
const mdText = await fetch(`http://localhost:3000/${slug}.md`)
.then((res) => res.text())
.catch(() => null);
if (mdText == null) {
return { title: "404" };
} else {
const frontMatter = matter(mdText).data;
return {
title: `DogKaeBi | ${frontMatter.title}`,
description: frontMatter.description,
openGraph: {
title: `DogKaeBi | ${frontMatter.title}`,
description: frontMatter.description,
images: [
{
url: frontMatter.thumbnail,
width: 600,
height: 315,
},
],
},
twitter: {
card: "summary_large_image",
title: `DogKaeBi | ${frontMatter.title}`,
description: frontMatter.description,
url: "dogkaebi.com",
site: "DogKaeBi",
images: { url: frontMatter.thumbnail, alt: frontMatter.title },
},
};
}
}
간단하게는
generateMetadata
함수 선언- metadata와 같은 형식의 객체 return
하면 metadata를 지정할 수 있다.
위의 예시의 경우는
url 오류에 대해서도 조금 처리를 했다.
fetch로 읽는 파일이 markdown 파일이고
markdown의 front matter를 사용하기 때문에
gray-matter를 사용했다.