개발
Express.js 사용 시 sitemap.xml 동적으로 생성하기
velca
벨바카
2024년 10월 31일 17시 11분

드디어 블로그에도 사이트맵이 반영됐다.

블로그 개시 이후 네이버 웹마스터 도구와 구글 서치 콘솔에 사이트 등록을 해놨는데 구글은 모든 페이지가 정상적으로 수집되는 반면, 네이버는 메인 페이지 말고 수집이 안 되는 문제가 있었다.

robots.txt 도 문제 없고, 웹페이지 수집 요청을 해도 안 되고 해서 골치를 겪다가 사이트맵이 문제인가 싶어 사이트맵 등록을 부랴부랴 했는데 이게 문제가 맞는진 모르겠다.

각설하고, Express 사용 시 사이트맵을 동적으로 사용하는 방법에 대해 알아보자.

Express를 사용 한 사이트맵 생성은 너무 간단하기 때문에 설명이 딱히 필요 없다.

app.get('/sitemap.xml', async (req, res) => {
  const host = req.get('host');

  // 이 사이트는 블로그이기 때문에 블로그 게시글을 API를 통해 가져오는 부분
  const response = await fetch('path-to-fetch-posts');

  const responseJson = await response.json();

  res.header('Content-Type', 'application/xml');
  res.send(generateSitemap(req.protocol, host, responseJson));
});

function generateSitemap(protocol: string, host: string | undefined, posts: any[]) {
  const currentDate = new Date().toISOString();

  // 사이트맵 선언
  let xml = '<?xml version="1.0" encoding="UTF-8"?>\n';

  // 여는 태그
  xml += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n';

  // 메인 페이지 url
  xml += '  <url>\n';
  xml += `    <loc>${protocol}://${host}</loc>\n`;
  xml += `    <lastmod>${currentDate}</lastmod>\n`;
  xml += `    <priority>1</priority>\n`;
  xml += '  </url>\n';

  // 각 게시글 url
  posts.forEach((_post) => {
    xml += '  <url>\n';
    xml += `    <loc>${protocol}://${host}/${_post.id}</loc>\n`;
    xml += `    <lastmod>${currentDate}</lastmod>\n`;
    xml += `    <priority>0.8</priority>\n`;
    xml += '  </url>\n';
  });

  // 닫는 태그
  xml += '</urlset>';

  return xml;
}

Express를 알고 사이트맵이 어떻게 구조화 되어 있는지 안다면 아마 쉽게 수정해서 쓸 수 있을 것이다.

근데 요즘은 이 정도의 정보는 AI 한테 물어보지 않을까? 🤔

댓글
로그인 후 댓글을 작성하세요