사이트맵 hreflang으로 다국어 색인 정확히 하기
목차
이번에 사이트맵에 hreflang 대체본을 완전하게 추가했다. 기존에는 영어만 명시하거나 일부 언어만 처리했는데, 이제 우리가 지원하는 모든 언어를 각 URL마다 명시하고 x-default까지 포함하는 방식으로 개선했다. 단순히 "태그 추가"처럼 보일 수 있지만, 다국어 SEO의 기초를 바로잡는 중요한 작업이었다.
hreflang이 왜 필요한가
검색 엔진의 입장에서 보면, 우리 서비스가 여러 언어로 서로 다른 URL을 제공할 때, "이 페이지의 영어 버전은 어디고 일본어 버전은 어디인가?"를 명확하게 알려줘야 한다. hreflang은 그걸 정확하게 지시하는 표준이다. 없으면 검색 엔진은:
- 모든 언어 버전을 독립적인 페이지로 취급하거나
- 중복 콘텐츠로 판단하거나
- 사용자가 원하지 않는 언어로 검색 결과를 노출할 수 있다
예를 들어 독일 사용자가 검색했는데 일본어 버전이 결과에 나타나는 문제가 생긴다는 뜻이다. 특히 기존에 영어(en)만 명시했을 땐, 다른 언어 버전들이 검색 엔진에 "고아 페이지"처럼 보였을 수 있다.
기존 방식과 달라진 점
| 항목 | 기존 | 변경 후 |
|---|---|---|
| 사이트맵 태그 | <xhtml:link rel="alternate" hreflang="en" /> 만 존재 |
8개+ 언어 모두 명시 (fr, de, es, ja, ko, zh, ...) |
| x-default | 미포함 | 포함 (언어 매칭 실패 시 기본) |
| 로직 | 하드코딩 또는 부분 i18n | load_news_i18n.py로 i18n 설정 동적 로드 |
| 결과 | 검색 엔진이 언어 관계 불명확 | 각 언어 버전의 관계를 명확히 신호 전송 |
사이트맵 XML에서 URL 하나는 이제 이런 모습이다:
<url>
<loc>https://example.com/news/article-123</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/news/article-123" />
<xhtml:link rel="alternate" hreflang="fr" href="https://example.fr/news/article-123" />
<xhtml:link rel="alternate" hreflang="de" href="https://example.de/news/article-123" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/news/article-123" />
</url>
기존에 en만 있거나 없던 것이 이제 8개+ 언어가 모두 있으니, 검색 엔진이 우리 콘텐츠 구조를 훨씬 더 정확하게 이해할 수 있게 된 셈이다.
작업의 두 축
이 변경은 크게 두 가지 파일을 건드렸다:
bot/load_news_i18n.py: i18n 설정을 로드하는 로직. 기존에 i18n 언어 목록과 도메인 매핑이 어디에 있었다면, 이제 사이트맵 생성 시점에 그 설정을 동적으로 가져올 수 있도록 정리했을 것이다. 즉, i18n 설정이 변경되면 (새 언어 추가 등) 사이트맵도 자동으로 따라가는 구조.
src/pages/sitemap-content.xml.ts: 사이트맵 XML을 실제로 생성하는 부분. 각 URL에 대해 모든 언어의 hreflang 링크를 생성하고, x-default를 추가하는 로직이 여기 들어갔을 것. 단순히 태그를 생성하는 것 이상으로, 각 언어가 올바른 도메인으로 매핑되는지도 확인해야 한다.
팀 관점에서의 우선순위 결정
이 작업을 왜 이제 했을까? SEO는 장기 효과를 보는 업무라서, 초기엔 우선순위가 낮을 수 있다. 하지만 우리 서비스가 여러 언어, 여러 지역에서 성장하면서:
- 국제 검색 트래픽이 점점 중요해졌고
- 각 지역별 검색 순위 편차가 생기기 시작했다
- 중복 콘텐츠 경고가 실제로 들어올 수 있는 상황이 왔다
이런 신호들이 모여서, "hreflang을 제대로 하자"는 의사결정이 나왔을 거다. 바꿔 말하면, 기술 부채를 감지하고 실제 비즈니스 영향 (검색 순위, 트래픽)과 연결시켜서 우선순위를 올린 사례다.
배운 점과 주의사항
첫 번째 주의점: 도메인 매핑의 정확성. hreflang이 틀린 도메인을 가리킬 수 있다. 예를 들어 일본어(ja)가 일본 서브도메인이 아니라 독일 도메인을 가리키면, 검색 엔진은 혼란스러워한다. 따라서 i18n 데이터 로드 시점에 도메인 매핑을 이중 확인하는 게 중요하다.
두 번째 주의점: x-default의 역할. x-default는 "어떤 언어도 매칭되지 않는 사용자가 봐야 할 페이지"다. 보통 영어나 기본 언어로 설정한다. 이걸 빼먹으면 언어 자동감지 실패 시 사용자 경험이 떨어질 수 있다.
세 번째: 점진적 배포. hreflang 변경 후 검색 엔진이 인덱스를 업데이트하는 데 며칠에서 주까지 걸린다. 배포 후 Search Console (또는 각 지역별 검색 도구)에서 크롤 에러나 경고를 모니터링하는 게 필수다. 혹시 잘못된 hreflang이 있다면 빨리 발견하고 수정해야 한다.
i18n과 SEO는 겹치는 영역이 많은데, 이런 작업을 할 때마다 느끼는 건 "설정이 산재되어 있으면 유지보수가 어렵다"는 것이다. 앞으로 i18n 설정이 한곳에 집중되고, 사이트맵, 메타 태그, 라우팅 등이 모두 그 설정을 참조하는 방식으로 가면, 언어 추가/삭제/도메인 변경 같은 작업이 훨씬 수월할 거다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.