중급GoogleNaver
XML 사이트맵 전략: 설계부터 Search Console 제출까지
핵심 요약 (TL;DR)
XML 사이트맵의 구조·우선순위 설정·인덱스 사이트맵·동적 생성 방법과 Google Search Console·네이버 서치어드바이저 제출 절차를 다룹니다.
XML 사이트맵이란 무엇이며 왜 필요한가
XML 사이트맵(Sitemap)은 검색엔진이 사이트의 모든 중요한 URL을 빠르게 발견하고 색인할 수 있도록 URL 목록을 구조화된 형식으로 제공하는 파일입니다. Google 공식 문서에 따르면, 다음 경우에 사이트맵이 특히 중요합니다:
- 사이트 규모가 크거나 (500페이지 이상) 새로 생성된 경우
- 내부 링크 구조가 빈약해 크롤러가 모든 페이지를 발견하기 어려운 경우
- 새로 발간된 콘텐츠를 빠르게 색인받고 싶은 경우
- 비디오·이미지·뉴스 같은 특수 콘텐츠를 SERP에서 노출시키고 싶은 경우
주의: 사이트맵에 포함한다고 해서 색인이 보장되지는 않습니다. 사이트맵은 크롤링 "힌트"이며, 최종 색인 여부는 구글이 콘텐츠 품질을 평가해 결정합니다.
XML 사이트맵 구조와 태그
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>https://example.com/seo/fundamentals</loc>
<lastmod>2025-03-22</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
<image:image>
<image:loc>https://example.com/images/seo-guide.webp</image:loc>
<image:title>SEO 기초 가이드</image:title>
</image:image>
</url>
</urlset>
| 태그 | 필수? | 설명 | 권장 값 |
|---|---|---|---|
loc | ✅ 필수 | 페이지 URL (절대 경로, HTTPS 포함) | canonical URL과 동일해야 함 |
lastmod | 선택 | 마지막 수정일 (ISO 8601 형식) | 2025-03-22 또는 2025-03-22T09:00:00+09:00 |
changefreq | 선택 | 예상 변경 빈도 (힌트, 구글이 강제로 따르지는 않음) | daily, weekly, monthly, yearly |
priority | 선택 | 사이트 내 상대적 중요도 (0.0~1.0) | 홈: 1.0, 카테고리: 0.8, 글: 0.6 |
사이트맵 인덱스 파일: 대규모 사이트 전략
하나의 사이트맵 파일에는 최대 50,000개 URL / 50MB까지 담을 수 있습니다. 이를 초과하는 대규모 사이트는 사이트맵 인덱스 파일로 여러 사이트맵을 묶어야 합니다.
<!-- sitemap-index.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap-blog.xml</loc>
<lastmod>2025-03-22</lastmod>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-pages.xml</loc>
<lastmod>2025-03-22</lastmod>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-products.xml</loc>
<lastmod>2025-03-22</lastmod>
</sitemap>
</sitemapindex>
콘텐츠 유형별로 사이트맵을 분리하면 관리가 쉽고, 특정 사이트맵의 색인 현황을 Search Console에서 별도로 모니터링할 수 있습니다.
Next.js 동적 사이트맵 생성 (App Router)
Next.js 13+ App Router에서는 app/sitemap.ts 파일로 동적 사이트맵을 생성할 수 있습니다.
// app/sitemap.ts
import type { MetadataRoute } from 'next'
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const baseUrl = 'https://example.com'
// 정적 페이지
const staticPages = [
{ url: baseUrl, lastModified: new Date(), priority: 1.0 },
{ url: `${baseUrl}/study`, lastModified: new Date(), priority: 0.9 },
{ url: `${baseUrl}/tools`, lastModified: new Date(), priority: 0.8 },
]
// 동적 페이지 (DB에서 가져오기)
const posts = await fetchAllPosts()
const dynamicPages = posts.map(post => ({
url: `${baseUrl}/blog/${post.slug}`,
lastModified: new Date(post.updatedAt),
priority: 0.7,
}))
return [...staticPages, ...dynamicPages]
}
이 파일은 자동으로 /sitemap.xml 경로에서 제공됩니다. 별도의 사이트맵 플러그인 설치 없이도 동적 URL을 포함한 완전한 사이트맵이 생성됩니다.
사이트맵에 절대 포함하지 말아야 할 URL
| 제외해야 할 URL | 이유 |
|---|---|
| noindex 페이지 | 색인 제외 페이지를 사이트맵에 포함하면 신호 충돌 |
| canonical이 다른 URL을 가리키는 페이지 | 비정규 URL이므로 제외 |
| robots.txt로 차단된 URL | 크롤러가 접근 불가 |
| 리다이렉트 되는 URL (301/302) | 최종 목적지 URL만 포함 |
| 깨진 링크 (404/500) | 색인 불가 페이지 |
| 검색 결과 페이지 (?q=...) | Thin Content 위험 |
| 로그인 후에만 접근 가능한 페이지 | 크롤러가 접근 불가 |
Google Search Console·네이버 서치어드바이저 제출
Google Search Console 제출
- Google Search Console 접속 → 속성 선택
- 좌측 메뉴 → Sitemaps 클릭
- 사이트맵 URL 입력 후 "제출" 클릭
- 제출 후 "성공" 상태와 색인된 URL 수 확인
네이버 서치어드바이저 제출
- 네이버 서치어드바이저 접속 → 웹마스터 도구
- 사이트 선택 → 요청 → 사이트맵 제출
- 사이트맵 URL 입력 후 확인
robots.txt에도 명시: 사이트맵 위치를 robots.txt에도 추가하면, Search Console 외에도 모든 크롤러가 사이트맵을 자동으로 발견할 수 있습니다.
# robots.txt Sitemap: https://example.com/sitemap.xml
자주 묻는 질문 (FAQ)
Q. 사이트맵이 없어도 구글에 색인되나요?
네, 가능합니다. Google은 내부 링크와 외부 백링크를 따라 페이지를 발견하고 색인합니다. 하지만 사이트맵이 있으면 (1) 새 콘텐츠를 더 빠르게 발견하고, (2) 내부 링크가 없는 고아 페이지도 크롤링할 수 있으며, (3) lastmod 정보로 변경된 페이지를 우선 재크롤링합니다. 규모가 작고 내부 링크가 탄탄한 사이트라면 사이트맵 없이도 충분하지만, 있으면 더 효율적입니다.
Q. changefreq와 priority를 구글이 실제로 사용하나요?
구글은 공식적으로 changefreq와 priority를 무시한다고 밝혔습니다. 이 두 태그는 사이트맵 프로토콜 초기에 정의됐지만, 사이트 운영자가 정확하게 설정하지 않는 경우가 많아 신뢰성이 낮다고 판단한 것입니다. 반면
lastmod는 정확하게 설정했을 때 크롤링 우선순위에 영향을 줍니다. 따라서 lastmod를 정확하게 관리하는 것에 집중하세요.Q. 사이트맵에 포함된 URL 수와 색인된 URL 수가 다른 이유는?
Google이 사이트맵의 모든 URL을 색인하는 것은 아닙니다. 색인되지 않는 일반적인 이유: (1) Thin Content - 내용이 너무 적거나 가치가 낮은 페이지, (2) 중복 콘텐츠 - 유사한 내용의 다른 페이지가 이미 색인됨, (3) 크롤 예산 부족 - 대규모 사이트에서 우선순위가 낮은 페이지, (4) noindex 충돌 - 사이트맵에는 있지만 noindex가 설정됨. GSC의 "인덱스 생성 범위" 보고서에서 구체적 사유를 확인할 수 있습니다.
Q. 사이트맵을 얼마나 자주 업데이트해야 하나요?
이상적으로는 콘텐츠가 변경될 때마다 자동으로 업데이트되어야 합니다. Next.js의
sitemap.ts나 WordPress처럼 동적으로 생성되는 사이트맵은 매 요청 시 최신 상태를 반환합니다. 정적 사이트맵을 사용하는 경우에는 새 콘텐츠 발행 시 수동으로 업데이트하거나, CI/CD 파이프라인에서 빌드 시 자동 생성하도록 설정하세요.Q. 여러 사이트맵을 GSC에 제출해도 되나요?
네, 각각 별도로 제출하거나 사이트맵 인덱스 파일 하나로 묶어 제출할 수 있습니다. 콘텐츠 유형별로 분리(sitemap-blog.xml, sitemap-products.xml, sitemap-pages.xml)하면 GSC에서 각 사이트맵의 색인 현황을 개별적으로 모니터링할 수 있어 디버깅에 유리합니다. 대규모 이커머스 사이트에서 특히 권장됩니다.