다국어 블로그를 만들 때 가장 먼저 떠오르는 일은 번역입니다. 하지만 운영하면서 더 자주 문제가 되는 것은 번역 문장보다 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, 개인정보, 동의 처리 | 높음 |
검색 유입을 생각하면 플랫폼 이름이 들어간 글이 영어 번역 가치가 높습니다. 반대로 네이버 서치어드바이저처럼 한국 로컬 맥락이 강한 글은 한국어에 집중하는 편이 낫습니다.