한글 URL을 정규화해서 검색 엔진 최적화 완성
목차
한글 문자가 직접 포함된 기존 URL들을 정규 형태로 301 리다이렉트했다. cms_legacy_slug 필드로 레거시 경로와 새 경로를 매핑하고, DB 쿼리와 라우팅 로직에서 이를 처리하는 식이다.
한글 URL이 남긴 기술 부채
사실 이전까지 시스템에는 한글 문자가 직접 URL에 포함된 페이지들이 꽤 많았다. 예를 들어 /블로그/서버-아키텍처 같은 경로가 실제로 존재했다는 뜻.
얼핏 보면 사용자 입장에서 "아, 한국 사이트니까 한글도 지원하네?"라고 느낄 수 있겠지만, 기술적으로는 여러 문제가 숨어 있었다:
- 브라우저 및 크롤러 호환성: 한글은 URL 인코딩되면
%ED%95%9C%EA%B8%80같은 긴 percent-encoded 형태가 되는데, 일부 구형 크롤러나 슬랙 같은 메신저 앱들이 이를 제대로 파싱하지 못한다. - 외부 링크의 불안정성: SNS나 블로그에서 공유할 때 인코딩 과정에서 깨지거나, URL이 매우 길어져서 가독성이 떨어진다.
- SEO 신호: 검색 엔진이 선호하는 canonical URL 형태(보통 ASCII 문자)와 다르면, 중복 콘텐츠로 간주할 수 있고, 링크 주스가 분산된다.
- 운영 복잡도: 정규화된 형태(
/blog/server-architecture)와 한글 형태(/블로그/서버-아키텍처)가 공존하면 어느 쪽으로 수렴할지 불명확하다.
301 리다이렉트와 레거시 매핑 전략
이를 해결하려면 단순히 한글 URL을 지우는 것만으로는 부족하다. 외부에서 기존 URL로 들어오는 트래픽(검색 엔진, 오래된 소셜 공유 링크, 외부 웹사이트의 백링크)이 끊길 수 있기 때문이다. 그래서 301 Moved Permanently 응답으로 정규 URL로 리다이렉트하는 게 표준이다.
구형 한글 URL: /블로그/서버-아키텍처
↓ (HTTP 301)
신규 정규 URL: /blog/server-architecture
301의 핵심은 "이 변경이 영구적이다"는 신호로, 검색 엔진이 인덱스를 업데이트할 때 기존 URL의 SEO 신호(페이지 권위도, 백링크 가치)를 새 URL로 계승해준다. 302(임시 이동)를 쓰면 엔진이 둘 다 인덱싱하려고 해서 중복 페이지 문제가 생긴다.
문제는 이 매핑을 어디서 관리하느냐. 우리는 CMS 데이터베이스에 cms_legacy_slug 필드를 추가했다. 이 필드는 "이 콘텐츠의 과거 경로 목록"을 저장한다. 그러면:
content_id = 42
slug = "server-architecture" ← 신규 정규 경로
cms_legacy_slug = "블로그/서버-아키텍처" ← 레거시 경로 (JSON array 가능)
구현: DB 쿼리와 라우팅 레이어
src/lib/db.ts에서는 주어진 slug로 콘텐츠를 조회할 때, 단순히 slug 필드만 비교하는 게 아니라 cms_legacy_slug도 함께 검색한다:
// 의사코드
async function getContentBySlug(slug) {
return db.content.findOne({
$or: [
{ slug: slug }, // 신규 정규 경로
{ cms_legacy_slug: slug } // 레거시 경로도 매칭
]
})
}
src/pages/[slug].astro의 라우팅 로직에서는 이 쿼리 결과를 받아 두 가지를 판단한다:
- 콘텐츠가 존재하는가? → 없으면 404 반환
- 요청 경로가 canonical slug와 같은가? → 아니면 301로 리다이렉트
// 의사코드
if (content.slug !== requestedSlug) {
// 요청된 slug가 레거시 경로다
return redirect(301, `/` + content.slug)
}
// 아니면 정상 렌더
return render(content)
이렇게 하면 오래된 한글 URL로 들어온 모든 요청이 정규 URL로 부드럽게 흘러간다.
마이그레이션과 팀 협력
이 작업에서 배운 점이 몇 개 있다. 첫째, URL 정규화는 한 번의 커밋으로 끝나는 게 아니다. 외부 검색 엔진이 301을 감지해 인덱스를 업데이트하는 데 며칠에서 몇 주가 걸릴 수 있다. 그 사이 트래픽 로그를 모니터링해서 정말 리다이렉트가 제대로 작동하는지 확인해야 한다.
둘째, SEO팀이나 마케팅팀과 사전 커뮤니케이션이 중요하다. 특히 기존 한글 URL이 외부에 많이 링크되어 있다면, 리다이렉트 계획을 먼저 공유하고 구글 서치 콘솔에 URL 변경을 신고해야 한다.
셋째, 레거시 지원 기간을 명확히 정하는 게 좋다. "6개월 동안은 레거시 경로 리다이렉트 유지, 그 이후 아예 제거" 같은 식으로. 그렇지 않으면 영구적인 기술 부채가 된다.
이 작업은 작은 수정으로 보일 수 있지만, 검색 노출, 외부 링크 신뢰성, 사용자 경험을 한 번에 개선하는 중요한 전략이다. 그리고 무엇보다 팀의 URL 정규화에 대한 이해를 높이는 기회가 됐다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.