세 개의 글 목록에서 공개 기준을 반영하는 목록으로
처음 사이트맵을 만들 때는 status='published'인 글만 반환했다. 글이 세 개일 때는 단순했지만, 비공개·검토 보류·다국어 페이지가 생긴 뒤에는 발행 여부만으로 검색에 안내할 대상을 고를 수 없었다. 현재 win-j.com은 발행, 공개, 색인 허용을 함께 검사한다.
사이트맵은 검색엔진에 URL을 알려주는 자료다. XML이 정상이라고 그 URL의 색인이 보장되지는 않는다. 이 글에서는 Django가 어떤 대상을 XML로 만드는지와 누락을 어떻게 판별하는지에 집중한다.
현재 게시글 선택 조건
프로젝트의 src/blog/sitemaps.py에 있는 핵심은 다음과 같다. Post와 필드 상수는 이 프로젝트 모델 기준이므로 다른 프로젝트에 붙일 때는 이름과 의미를 맞춰야 한다.
from django.contrib.sitemaps import Sitemap
from .models import Post
class PostSitemap(Sitemap):
protocol = "https"
def items(self):
return Post.objects.filter(
status=Post.PUBLISHED,
visibility="public",
indexing_status=Post.INDEX_INDEX,
).exclude(slug__in=("about", "opensource", "privacy", "terms", "utility"))
def lastmod(self, obj):
return obj.updated_at
위 코드는 본질적인 선택 조건을 보여주도록 축약했다. 기존 클래스의 priority·changefreq 속성은 생략했다. get_absolute_url()이 각 글의 경로를 제공하며, 소개·정책·도구 목록처럼 고정 경로와 충돌하는 slug는 게시글 목록에서 제외한다. 해당 고정 페이지는 별도의 StaticSitemap이 담당한다.
| 글 상태 | 공개 상세 페이지 | 게시글 사이트맵 |
|---|---|---|
| 발행·공개·index | 열림 | 포함 |
| 발행·공개·noindex | 열리며 noindex 표시 | 제외 |
| 초안 | 일반 상세 경로에서 404 | 제외 |
| 비공개 또는 protected | 일반 상세 경로에서 404 | 제외 |
이 표는 현재 공개 상세 뷰의 동작이다. noindex 글이 사이트맵에서 빠졌다고 URL까지 닫힌 것은 아니다. 보호 설정의 의미는 게시글 관리 기록에서 구분했다.
URL 연결과 도구 목록
Django의 sitemap 뷰에 클래스 목록을 전달하고 프로젝트 URL에서 /sitemap.xml에 연결한다. 이 프로젝트의 실제 URL 설정은 src/myproject/urls.py에 있으며 게시글 외에 고정 페이지와 도구 클래스도 등록한다. 설정 시 django.contrib.sitemaps, URL 패턴, 모델의 URL 반환을 함께 확인한다. Django sitemap 문서
도구는 활성·공개·검토 완료·색인 허용 여부에 더해 활성 카테고리 또는 추천 여부, 렌더링 가능한 템플릿까지 검사한다. 글과 도구의 모델이 다르므로 게시글 조건만 도구에 복사하지 않는다. 현재 보조 언어 페이지는 검토 보류 정책으로 언어별 sitemap 클래스가 빈 목록을 반환한다. 이것은 번역 기능이 없다는 뜻이 아니라 검색에 안내하는 범위를 제한한 것이다.
priority를 높이는 대신 확인할 것
초기 글에서는 priority=1.0을 중요한 콘텐츠 설정처럼 설명했다. Google은 sitemap의 priority와 changefreq를 사용하지 않는다고 밝힌다. 숫자를 올려 검색 순위를 조절하려고 하기보다 대표 URL, 실제 접근 가능 여부, 정확한 수정 시각을 확인한다. lastmod는 내용의 실질적인 수정과 맞아야 한다. Google sitemap 작성 안내
현재 코드는 모델의 updated_at을 반환한다. 운영 중 모든 행의 수정 시각을 일괄 갱신한다면 그 시간이 본문 변경을 뜻하는지 별도로 검토해야 한다. 글자 하나 바뀌지 않은 URL을 매일 새 글처럼 표시하는 용도로 쓰지 않는다.
배포 후 누락을 조사하는 순서
/sitemap.xml에서 응답이 XML인지 확인한다. 200인 로그인 HTML도 실패다.- 찾는 글의 정확한 URL을
<loc>에서 검색한다. - 없으면 DB의 발행·공개·색인 상태와 예약 slug 여부를 확인한다.
- 있으면 그 URL을 로그아웃 창에서 열고 canonical과 robots를 비교한다.
- 목록 자체를 수정한 뒤 검색엔진 도구에서 수집 상태를 확인한다.
로컬 테스트에서는 공개 index, 공개 noindex, 초안, 비공개 글을 따로 만들어 선택 조건과 상세 응답을 확인한다. 이는 코드의 동작 검증이며 운영 검색엔진의 수집 결과를 측정한 것은 아니다. XML 생성기 사용과 동적 sitemap의 차이는 SEO 생성 도구 적용 기록에서 이어진다.
댓글 0
로그인 없이 궁금한 점이나 의견을 남겨주세요.
아직 댓글이 없습니다. 첫 의견을 남겨주세요.