메타데이터란 페이지에 방문하는 유저들에게는 보이지 않지만, 페이지의 HTML 속(주로 <head>
엘리먼트 속)에 포함되어있는 웹페이지의 추가적인 정보들을 말한다. 이 숨겨진 정보들은 서치엔진과 같은 시스템들에게 우리의 웹페이지 내용들을 더 잘 이해시키기 위해 매우 중요하다.
메타데이터는 웹페이지의 SEO에서 중대한 역할을 차지하고 있다. 서치 엔진들과 소셜 미디어 플랫폼들이 페이지에 더 잘 접근하고 더 잘 이해할 수 있게 해주는 역할을 수행한다. 적절한 메타데이터는 서치엔진이 효율적으로 웹페이지들의 색인을 생성할 수 있게해줌으로써 검색 결과의 랭킹을 향상시키는데 도움을 준다. 추가적으로 Open Graph와 같은 메타데이터는 소셜 미디어에서 공유 링크의 모습을 향상시켜줌으로써 유저들에게 좀 더 내용을 잘 전달시킬 수 있다.
Next.js는 앱의 메타데이터를 정의하는데 사용되는 Meatadata API들을 갖고있다. 앱에 메타데이터를 추가하는데는 두가지 방법이 존재한다.
layout.js
또는 page.js
파일에서 정적 메타데이터 객체 또는 동적 generateMetadata 함수를 export 해주기favicon.ico
, apple-icon.jpg
, icon.jpg
: 파비콘 및 아이콘 활성화opengraph-image.jpg
, twitter-image.jpg
: 소셜 미디어 이미지 적용robots.txt
: 서치 엔진 크롤링을 위한 지시 제공sitemap.xml
: 웹사이트 구조에 대한 정보 제공이 모든 방법들을 유연하게 사용할 수 있다. 이 옵션들을 통해 Next.js는 자동적으로 적절한 <head>
엘리먼트를 생성해줄 것이다.
예시로 layout.js
에서 title 메타데이터를 정의하는 방법을 알아보자. 해당 layout.js
에 존재하는 모든 메타데이터들은 그 레이아웃을 사용하는 모든 페이지에 상속될 것이다.
루트 레이아웃에서 다음 코드를 작성하자.
import { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Acme Dashboard',
description: 'The official Next.js Course Dashboard, built with App Router.',
metadataBase: new URL('https://next-learn-dashboard.vercel.sh'),
};
export default function RootLayout() {
// ...
}
Next.js가 자동적으로 메타데이터와 title을 추가해줄 것이다.
만약 특정 페이지에 커스텀 타이틀을 추가하고 싶다면 어떻게 해야할까? 그냥 해당 페이지의 page.tsx
에서 metatdata
객체를 추가해주면된다. 예를들어 /dashboard/invoices
페이지의 페이지 타이틀을 업데이트 하고 싶다면
import { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Invoices | Acme Dashboard',
};
이 코드를 추가해주면된다.
이 방식은 잘 작동하지만, 모든 페이지마다 타이틀을 반복하는 것은 만약 회사명이 바뀌었다던가 뭔가가 변화했을 때 하나하나 일일히 변경해주어야하는 번거로움이 존재한다.
대신에 title.template
필드를 metadata
객체에 정의해주는 것으로 페이지 타이틀에 대한 템플릿을 정의할 수 있다.
루트 레이아웃에서 다음과 같이 작성해보자.
import { Metadata } from 'next';
export const metadata: Metadata = {
title: {
template: '%s | Acme Dashboard',
default: 'Acme Dashboard',
},
description: 'The official Next.js Learn Dashboard built with App Router.',
metadataBase: new URL('https://next-learn-dashboard.vercel.sh'),
};
이제 하위 페이지들에서는 %s
템플릿을 지정해주기만 하면된다.
예를들어 /dashboard/invoices
페이지에서는 다음과 같이 사용하면 된다.
export const metadata: Metadata = {
title: 'Invoices',
};
이렇게만 하면 Invoices | Acme Dasboard
라는 타이틀을 확인할 수 있다.