Next.js 초간단 자동화 sitemap.xml을 만드는 법

작성일 : 2022년 03월 18일
  • #Next.js

sitemap 제출은 검색 엔진 최적화를 위해 제출하는게 좋다. 그래서 초간단 Next.js 사이트맵 생성하기 가이드를 작성해본다.

준비물

Next.js를 통해 개발 중인 프로젝트

next-sitemap 라이브러리

dynamic route를 사용중이라면 게시물을 불러올 수 있는 api

작업 진행 순서

라이브러리 설치 -> 사이트맵 페이지 작성 끝

라이브러리 설치

yarn

yarn add -D next-sitemap

npm

npm install --save-dev next-sitemap

사이트맵 페이지 작성

pages 폴더 내 사이트맵으로 보여질 파일을 생성한다.

소스 코드 살펴보면,

// pages/sitemap.xml.tsx
import { GetServerSidePropsContext } from 'next';
import { getServerSideSitemap } from 'next-sitemap'; //(1)

//(2)
export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
    const posts = await fetcher('/posts');
    const categories = await fetcher('/categories');
    const lastmod = new Date().toISOString();

    //(3), (4)
    const defaultFields = [
        {
            loc: process.env.URL,
            changefreq: 'daily',
            priority: '0.8',
            lastmod,
        },
        {
            loc: `${process.env.URL}/example`,
            changefreq: 'daily',
            priority: '0.8',
            lastmod,
        },
    ];

    //(5)
    const categoryFields = categories.map((category: string) => ({
        loc: `${process.env.URL}/${category}`,
        changefreq: 'daily',
        priority: '0.9',
        lastmod,
    }));

    const boardFields = boards.map((board: IBoardSummary) => ({
        loc: `${process.env.URL}/${board.category}/${board.id}`,
        changefreq: 'daily',
        priority: '1.0',
        lastmod,
    }));

    //(6)
    const fields = [...defaultFields, ...categoryFields, ...boardFields];

    //(7)
    return getServerSideSitemap(ctx, fields);
};
//(8)
export default () => {
    return;
};
  1. next-sitemap 라이브러리의 내장함수로 첫번째 인자로 application/xml 응답헤더를, 두번째 인자로 사이트맵 xml 형식 데이터를 리턴해준다.

  2. getServerSideProps를 통해 동적 사이트맵을 제작한다.

  3. 사이트맵 태그내 입력할 데이터를 객체형식으로 만들어주어야 한다.

    • loc : 페이지 url을 넣어준다. 개발 / 운영 환경 분리와 url 변경을 대비해 환경변수로 입력해두었다.

    • changefreq(optional) : 변경 빈도를 입력해준다. always, hourly, daily, weekly, monthly, yearly, never 중 하나를 문자열 형태로 입력하면 된다.

    • priority(optional): 우선순위를 입력해준다. 기본값은 0.5이며 0.0 ~ 1.0까지 입력 가능하다.

    • lastmod(optional) : 마지막 수정 날짜를 입력해준다. 입력 가능한 형식은W3C Datetime이다.

  4. api를 통해 불러올 수 없는 정적 페이지를 하드코딩 해준다.

  5. api를 통해 불러온 게시판 배열과 게시글 배열을 map 함수를 통해 유효한 fields 객체 배열로 만들어준다.

  6. 스프레드 연산자를 통해 만들어 놓은 전체 fields를 합친다.

  7. (1)에서 임포트 한 함수를 이용하여 xml문서로 리턴해준다.

  8. 리턴할 컴포넌트 객체는 없으므로 아무것도 리턴하지 않는 익명함수로 대체한다.

이렇게 하면 끝난다.

결과물

다음과 같이 생성한 파일의 결과물로 sitemap xml 문서를 확인 할 수 있다.


사이트맵 url에 접속하면,

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
<loc>https://www.example.com</loc>
<changefreq>daily</changefreq>
<priority>0.8</priority>
<lastmod>2022-03-18T13:52:05.199Z</lastmod>
</url>
<url>
<loc>https://www.example.com/example</loc>
<changefreq>daily</changefreq>
<priority>0.8</priority>
<lastmod>2022-03-18T13:52:05.199Z</lastmod>
</url>
<url>
<url>
<loc>https://www.example.com/category/1</loc>
<changefreq>daily</changefreq>
<priority>1.0</priority>
<lastmod>2022-03-18T13:52:05.199Z</lastmod>
</url>
</urlset>

위와 같은 사이트맵 데이터가 출력된다.


현재 운영중인 블로그의 사이트맵

레퍼런스

next-sitemap 라이브러리

sitemap xml 스키마 정의 한국어 문서