nextjs
Sitemap이란, 검색 사이트(google)의 크롤링 봇들이 우리 Application을 사용할 수 있도록 정보를 주기위해 활용됩니다. 따라서 서비스를 배포한다면, 관련 설정들을 추가하여 만든 Application에 많이 접속할 수 있도록 Sitemap을 사용해야합니다.
우선 sitemap에 대한 간단한 개념을 확인해 봅시다. 페이지에 대한 sitemap은 주소 뒤에 /sitemap.xml을 작성해서 확인 할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
<lastmod>2024-08-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
각 테그에 대한 설명은 아래와 같습니다.
Sitemap을 통해 Application이 검색 될 수 있도록 등록을 하였다면, 만든 Application에서 크롤링을 하면 안되는 부분에 대해 명시를 하는 것도 필요합니다. 이러한 명시를 적어주는 곳이 roboots.txt로 할 수 있습니다.
Sitemap과 Robots.txt는 검색엔진최적화(SEO) 설정에서 기초적인 부분이라 할 수 입니다. 이러한 기본설정을 next-sitemap 라이브러리를 통해 간단히 설정 가능합니다.
$ npm install -D next-sitemap
build 스크립트 전후에 작동하는 스크립트가 있다. prebuild가 빌드 전에 작동하는 스크립트고, postbuild가 build 이후에 작동하는 스크립트이다.
// package.json
{
"scripts": {
"postbuild": "next-sitemap"
}
}
root경로에 next-sitemap.config.js 파일을 하나 생성해 줍니다.
/** @type {import('next-sitemap').IConfig} */
module.exports = {
siteUrl: 'http://localhost:3000', // site의 url
generateRobotsTxt: true, // robots.txt generate 여부 (자동생성 여부)
sitemapSize: 3000, // sitemap별 최대 크기 (최대 크기가 넘어갈 경우 복수개의 sitemap으로 분리됨)
changefreq: 'daily', // 페이지 주소 변경 빈도 (검색엔진에 제공됨) - always, daily, hourly, monthly, never, weekly, yearly 중 택 1
priority: 1, // 페이지 주소 우선순위 (검색엔진에 제공됨, 우선순위가 높은 순서대로 크롤링)
exclude: [
// sitemap 제외 페이지 주소
'/exclude/admin', // 페이지 주소 하나만 제외시키는 경우
'/exclude/**', // 하위 주소 전체를 제외시키는 경우
],
robotsTxtOptions: {
// robots.txt 옵션 설정
// 정책 설정
policies: [
// 추가 정책이 필요할 경우 배열 요소로 추가 작성
{
userAgent: '*', // 모든 agent 허용
allow: '/', // 모든 페이지 주소 크롤링 허용
disallow: [
'/admin', // exclude로 시작하는 페이지 주소 크롤링 금지
],
},
],
},
}
$ npm run build
위의 라이브러리를 활용해도 쉽고 간단히 sitemap을 적용가능합니다.
https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap 을 보면 아래와 같이 app/sitemap.ts 를 적기만 해도 sitemap을 사용할 수 있습니다. 본 블로그는 아래와 같은 형식으로 sitemap이 작성되었습니다.
import { MetadataRoute } from 'next'
const BASE_URL = 'https://hanpy-blog.com'
export default function sitemap(): MetadataRoute.Sitemap {
const datas = fetch('데이터 GET') // blog들의 meta데이터를 가지고 오는 로직입니다.
const sitmapDatas = datas.map((data) => {
return {
url: `${BASE_URL}/${data['_raw']['flattenedPath']}`,
lastModified: new Date(data['publishedAt']),
}
})
return [
{
url: 'https://hanpy-blog.com',
lastModified: new Date(),
priority: 1,
},
...sitmapDatas,
]
}
기본적으로 root 홈페이지에서만 priority를 적용해주었고, 나머지 글에서는 lastModified와 url 정도만 추가해 주었습니다.