Astro 다국어 블로그는 URL 구조부터 정해야 한다

Astro로 한국어와 영어 기술 블로그를 운영할 때 locale URL, canonical, hreflang, translationKey, sitemap을 어떻게 설계해야 하는지 정리했습니다.

다국어 블로그를 만들 때 가장 먼저 떠오르는 일은 번역입니다. 하지만 운영하면서 더 자주 문제가 되는 것은 번역 문장보다 URL 구조입니다. 글을 한국어와 영어로 같이 발행하려면 검색엔진과 사용자가 “이 두 페이지가 같은 주제의 다른 언어 버전”이라는 사실을 이해해야 합니다.

결론은 단순합니다. 언어별 URL을 명확히 나누고, 각 페이지에 canonical과 alternate hreflang을 같이 넣어야 합니다.

Astro는 정적 HTML을 만들기 좋고, Content Collections로 글 메타데이터를 검증할 수 있습니다. 하지만 다국어 SEO 구조는 프로젝트가 직접 정해야 합니다. 이 글은 한국어와 영어만 지원하는 기술 블로그를 기준으로 잡은 설계 기준입니다.

URL 구조는 숨기지 않는 편이 낫다

언어별 URL은 다음처럼 명확한 prefix를 두는 방식이 관리하기 쉽습니다.

/ko/posts/astro-multilingual-seo-url-structure/
/en/posts/astro-multilingual-seo-url-structure/

루트(/)는 기본 언어로 렌더링하거나 명확히 리다이렉트해야 합니다. 사용자에게 빈 리다이렉트 화면을 먼저 보여주면 좋지 않습니다. 정적 블로그라면 루트도 실제 HTML을 렌더링하고, 필요하면 언어 전환 링크를 노출하는 편이 안정적입니다.

방식 장점 주의점
/ko, /en prefix 구조가 명확하고 확장 가능 기본 언어 URL을 어떻게 처리할지 정해야 함
/는 한국어, /en은 영어 한국어 사용자에게 자연스러움 canonical과 hreflang을 더 신경 써야 함
쿠키/브라우저 언어 자동 이동 사용자 맞춤처럼 보임 크롤러와 느린 네트워크에서 혼란 가능

기술 블로그는 개인화보다 문서 안정성이 중요합니다. 그래서 자동 감지보다 명시적 URL이 낫습니다.

translationKey는 내부 연결의 기준이다

파일 이름만으로 번역 관계를 찾으면 나중에 깨지기 쉽습니다. 제목은 바뀌고, slug도 바뀔 수 있습니다. 그래서 frontmatter에 언어와 무관한 translationKey를 둡니다.

---
title: "Astro 다국어 블로그 SEO: URL 구조를 먼저 정해야 하는 이유"
lang: "ko"
translationKey: "astro-multilingual-seo-url-structure"
---

영어 글도 같은 key를 가집니다.

---
title: "Astro Multilingual SEO: Start with URL Structure"
lang: "en"
translationKey: "astro-multilingual-seo-url-structure"
---

이렇게 하면 언어 전환, related posts, sitemap alternate, 글 목록 정렬을 같은 기준으로 처리할 수 있습니다.

canonical과 hreflang은 역할이 다르다

canonical은 대표 URL을 말합니다. hreflang은 언어별 대체 페이지를 말합니다. 둘은 서로 대체 관계가 아닙니다.

한국어 글에는 한국어 글 자신을 canonical로 둡니다.

<link rel="canonical" href="https://example.com/ko/posts/foo/" />

그리고 한국어와 영어 대체 페이지를 함께 둡니다.

<link rel="alternate" hreflang="ko" href="https://example.com/ko/posts/foo/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/posts/foo/" />
<link
  rel="alternate"
  hreflang="x-default"
  href="https://example.com/ko/posts/foo/"
/>

영어 글도 자기 자신을 canonical로 둡니다. 한국어 글을 canonical로 지정하면 영어 페이지가 중복 페이지처럼 보일 수 있습니다.

페이지 canonical alternate
한국어 글 한국어 글 URL ko, en, x-default
영어 글 영어 글 URL ko, en, x-default
루트 실제 렌더링되는 대표 URL ko, en, x-default

Google Search Central은 현지화된 페이지를 알릴 때 HTML link, HTTP header, sitemap 방식 등을 사용할 수 있다고 설명합니다. 정적 블로그에서는 HTML head에 넣는 방식이 가장 단순합니다.

sitemap도 언어 구조를 따라야 한다

사이트맵에는 검색로봇이 수집할 URL이 들어갑니다. 다국어 블로그에서는 각 언어 URL이 독립 페이지입니다. 그래서 한국어와 영어 글이 모두 사이트맵에 들어가야 합니다.

https://example.com/ko/posts/foo/
https://example.com/en/posts/foo/

단, 없는 번역을 억지로 연결하면 안 됩니다. 영어 버전이 없는 한국어 글은 한국어 URL만 노출하면 됩니다. hreflang도 실제 존재하는 페이지만 넣어야 합니다.

Astro에서 좋은 경계

Astro 프로젝트에서는 역할을 나누는 편이 편합니다.

역할 위치 예시 책임
라우팅 src/pages/[lang]/posts/[slug].astro 언어와 slug 기반 페이지 생성
콘텐츠 src/content/posts/{lang} 글 본문과 frontmatter
SEO src/lib/seo.ts canonical, title, description
alternates src/lib/alternates.ts translationKey 기반 대체 URL
layout BaseLayout.astro head 태그 출력

이 구조의 장점은 글을 추가할 때 코드 수정이 적다는 점입니다. Markdown 파일을 추가하면 목록, RSS, sitemap, 구조화 데이터가 같이 따라옵니다.

실패하는 패턴

다국어 SEO에서 자주 망가지는 지점은 다음입니다.

[ ] 모든 언어 페이지가 같은 canonical을 가진다
[ ] 영어 글이 없는데 hreflang en을 넣는다
[ ] 루트에서 JS 리다이렉트만 하고 실제 콘텐츠가 없다
[ ] title과 description을 번역하지 않고 그대로 둔다
[ ] URL은 영어인데 본문은 한국어로 남는다
[ ] sitemap에는 한국어만 있고 영어 URL은 빠진다

가장 위험한 것은 같은 canonical입니다. 언어가 다른 문서는 중복 페이지가 아니라 대체 언어 페이지입니다. 각 언어 페이지는 자기 URL을 대표 URL로 가져야 합니다.

운영 기준

처음부터 모든 글을 번역할 필요는 없습니다. 대신 번역하는 글은 제대로 연결해야 합니다.

추천 기준은 이렇습니다.

글 유형 영어 번역 우선순위
Astro, GitHub Pages, Cloudflare, Vercel 비교 높음
한국 검색엔진/네이버 특화 글 낮음
제품 운영 철학 중간
AdSense, GA, 개인정보, 동의 처리 높음

검색 유입을 생각하면 플랫폼 이름이 들어간 글이 영어 번역 가치가 높습니다. 반대로 네이버 서치어드바이저처럼 한국 로컬 맥락이 강한 글은 한국어에 집중하는 편이 낫습니다.

참고 자료