사이트맵 생성 및 제출 가이드 (구글·네이버)

사이트맵은 검색엔진이 사이트의 페이지를 빠짐없이 수집하도록 돕는 XML 파일입니다. 이 가이드에서는 사이트맵의 구조부터, 개발 환경별 생성 방법, 구글과 네이버에 제출하는 절차까지 정리합니다.

사이트맵이란?

사이트맵(Sitemap)은 웹사이트의 URL 목록을 XML 형식으로 구조화한 파일입니다. 검색엔진 크롤러는 이 파일을 통해 사이트의 전체 페이지를 파악하고, 새로 추가되거나 수정된 콘텐츠를 효율적으로 발견합니다.

기본적인 사이트맵 XML의 구조는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/</loc>
    <lastmod>2025-02-20</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
</urlset>

<url> 요소에는 페이지 주소(loc), 마지막 수정일(lastmod), 변경 빈도(changefreq), 우선순위(priority)가 포함됩니다. 이 중 loclastmod가 핵심이며, changefreqpriority는 구글이 참고하지 않는다고 공식 문서에서 밝히고 있습니다.

ℹ️ 참고

하나의 사이트맵 파일에는 최대 50,000개의 URL, 파일 크기는 50MB까지 포함할 수 있습니다. 이를 초과하는 대규모 사이트는 사이트맵 인덱스(Sitemap Index)로 여러 파일을 묶어 관리합니다.

정적 사이트맵 vs 동적 사이트맵

사이트맵 생성 방식은 크게 두 가지로 나뉩니다. 사이트의 콘텐츠 업데이트 빈도에 따라 적절한 방식을 선택해야 합니다.

구분 정적 사이트맵 동적 사이트맵
생성 방식 빌드 시점에 XML 파일을 미리 생성 요청 시 서버에서 실시간으로 XML을 생성
URL 반영 새 페이지 추가 시 재빌드 또는 수동 갱신 필요 DB/CMS의 콘텐츠를 실시간으로 반영
적합한 사이트 페이지 수가 적고 변경이 드문 기업 소개 사이트 블로그, 쇼핑몰 등 콘텐츠가 자주 추가되는 사이트
서버 부하 없음 (정적 파일 제공) 요청마다 연산 발생 (캐싱으로 해결 가능)

콘텐츠가 주기적으로 추가되는 사이트라면 동적 사이트맵이 관리 효율 면에서 유리합니다. 새 글을 발행할 때마다 사이트맵을 수동으로 갱신할 필요가 없기 때문입니다.

개발 환경별 사이트맵 생성 방법

워드프레스

워드프레스는 버전 5.5부터 코어에 사이트맵 기능이 내장되어 /wp-sitemap.xml에서 기본 사이트맵이 자동 생성됩니다. 다만 SEO 플러그인이 제공하는 사이트맵이 더 세밀한 제어를 지원하므로, 실무에서는 플러그인 사이트맵을 사용하는 것이 일반적입니다.

플러그인 사이트맵 URL 특징
Yoast SEO /sitemap_index.xml 게시물 유형별 자동 분리, noindex 페이지 자동 제외
Rank Math /sitemap_index.xml 이미지 사이트맵 포함, 개별 URL 제외 설정 가능
All in One SEO /sitemap.xml 동영상 사이트맵 지원, 우선순위 수동 설정

SEO 플러그인을 사용하는 경우, 워드프레스 기본 사이트맵과 중복되지 않도록 기본 사이트맵을 비활성화하는 것이 좋습니다. 대부분의 SEO 플러그인은 설치 시 자동으로 처리합니다.

Next.js / React 기반 프레임워크

Next.js의 App Router 환경에서는 app/sitemap.ts 파일을 생성하면 빌드 시 또는 요청 시 동적으로 사이트맵을 생성할 수 있습니다. DB나 CMS에서 데이터를 가져와 URL 목록을 자동으로 구성하므로, 콘텐츠 추가 시 별도 갱신 작업이 필요 없습니다.

// app/sitemap.ts
import { MetadataRoute } from 'next'

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  // DB 또는 CMS에서 동적 페이지 목록 조회
  const posts = await fetch('https://api.example.com/posts').then(res => res.json())

  const postUrls = posts.map((post: any) => ({
    url: `https://example.com/blog/${post.slug}`,
    lastModified: new Date(post.updatedAt),
    changeFrequency: 'weekly' as const,
    priority: 0.8,
  }))

  return [
    {
      url: 'https://example.com',
      lastModified: new Date(),
      changeFrequency: 'monthly',
      priority: 1.0,
    },
    ...postUrls,
  ]
}

이 방식의 장점은 코드와 콘텐츠가 동기화된다는 것입니다. 새 블로그 글을 발행하면 사이트맵에 자동 반영되고, 삭제된 페이지는 자동으로 제거됩니다.

💡 실무 팁

페이지 수가 많은 사이트에서는 app/sitemap.ts 대신 app/sitemap/[id]/route.ts 패턴으로 사이트맵을 분할하고, 사이트맵 인덱스를 별도로 구성하면 50,000 URL 제한을 넘기는 대규모 사이트도 대응할 수 있습니다.

PHP / 커스텀 서버 환경

프레임워크 없이 PHP로 개발된 사이트에서는 서버 사이드에서 XML을 직접 생성합니다. DB에서 페이지 목록을 쿼리하고 XML 형식으로 출력하는 방식입니다.

// sitemap.php
header('Content-Type: application/xml; charset=UTF-8');

$pdo = new PDO('mysql:host=localhost;dbname=mysite', 'user', 'pass');
$pages = $pdo->query("SELECT slug, updated_at FROM pages WHERE status = 'published'");

echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

foreach ($pages as $page) {
    echo '<url>';
    echo '<loc>https://example.com/' . htmlspecialchars($page['slug']) . '</loc>';
    echo '<lastmod>' . date('Y-m-d', strtotime($page['updated_at'])) . '</lastmod>';
    echo '</url>';
}

echo '</urlset>';

이 파일을 웹서버 설정에서 /sitemap.xml 경로로 라우팅하면 동적 사이트맵으로 동작합니다. Apache의 경우 .htaccess에서, Nginx의 경우 nginx.conf에서 리라이트 규칙을 설정합니다.

대규모 사이트: 사이트맵 인덱스

URL이 50,000개를 초과하거나, 게시물·제품·카테고리 등 콘텐츠 유형이 다양한 사이트에서는 사이트맵 인덱스(Sitemap Index)를 사용하여 여러 사이트맵 파일을 하나로 묶어 관리합니다.

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://example.com/sitemap-posts.xml</loc>
    <lastmod>2025-02-20</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap-pages.xml</loc>
    <lastmod>2025-02-15</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap-products.xml</loc>
    <lastmod>2025-02-18</lastmod>
  </sitemap>
</sitemapindex>

검색엔진에는 개별 사이트맵이 아닌 인덱스 파일의 URL만 제출하면 됩니다. 워드프레스의 Yoast SEO, Rank Math가 생성하는 sitemap_index.xml이 바로 이 형식입니다.

구글·네이버에 사이트맵 제출

구글 서치콘솔

  1. 구글 서치콘솔에 접속하고 해당 사이트 속성을 선택합니다.
  2. 좌측 메뉴에서 Sitemaps을 클릭합니다.
  3. 사이트맵 URL(예: sitemap_index.xml 또는 sitemap.xml)을 입력하고 제출합니다.
  4. 상태가 성공으로 표시되는지 확인합니다.

상세 과정은 구글 서치콘솔 사이트맵 등록 가이드를 참고하세요.

네이버 서치어드바이저

  1. 네이버 서치어드바이저에 접속하고 웹마스터 도구에서 등록한 사이트를 선택합니다.
  2. 좌측 메뉴에서 요청 > 사이트맵 제출로 이동합니다.
  3. 사이트맵 URL을 입력하고 확인합니다.

네이버에는 사이트맵과 함께 RSS 피드도 제출하는 것을 권장합니다. 워드프레스의 RSS 피드 주소는 https://내도메인.com/feed입니다.

robots.txt에 사이트맵 위치 명시

robots.txt 파일에 사이트맵 위치를 선언하면 검색엔진이 사이트맵을 더 빠르게 발견합니다. 서치콘솔 제출과 별개로, robots.txt에도 명시해두는 것이 권장됩니다.

User-agent: *
Allow: /

Sitemap: https://example.com/sitemap_index.xml

워드프레스에서는 Yoast SEO, Rank Math 등의 SEO 플러그인이 이 설정을 자동으로 처리합니다.

사이트맵 검증 및 모니터링

사이트맵을 제출한 후에는 정상 작동 여부를 주기적으로 확인합니다.

  • 브라우저 직접 확인: 사이트맵 URL에 접속하여 XML이 정상 출력되는지 확인합니다.
  • 서치콘솔 상태 확인: Sitemaps 메뉴에서 상태가 성공이고, 발견된 URL 수가 실제 페이지 수와 일치하는지 점검합니다.
  • 색인 연동 확인: 서치콘솔의 페이지(색인 생성) 메뉴에서 사이트맵을 통해 발견된 페이지의 색인 진행 상황을 모니터링합니다.

⚠️ 주의

사이트맵에 포함된 URL은 실제 접근 가능한 페이지여야 합니다. 404 오류 페이지, noindex가 설정된 페이지, 리디렉션되는 URL이 사이트맵에 포함되면 서치콘솔에서 오류로 보고됩니다. 동적 사이트맵을 구현할 때는 발행 상태(published)인 페이지만 포함하도록 필터링하세요.

정리

  • 사이트맵은 사이트의 URL 목록을 XML로 정리한 파일로, loclastmod가 핵심 요소입니다.
  • 콘텐츠가 자주 추가되는 사이트에서는 DB/CMS와 연동되는 동적 사이트맵이 관리 효율 면에서 유리합니다.
  • 워드프레스는 SEO 플러그인, Next.js는 app/sitemap.ts, PHP는 서버 사이드 XML 생성으로 구현합니다.
  • 구글 서치콘솔과 네이버 서치어드바이저 모두에 제출하고, robots.txt에도 사이트맵 위치를 명시하세요.

이 주제에 대해 전문 상담이 필요하신가요?

웹닷이 최적의 솔루션을 제안해드립니다.

무료 상담 문의하기
개발가이드