Porta
한글 상호명도 바로 쓸 수 있는 서브도메인 만들기

엔지니어링

한글 상호명도 바로 쓸 수 있는 서브도메인 만들기

ASCII 전용 slug 정리는 한글 상호명에서 쉽게 깨졌고, Porta는 한글 친화 후보와 안전한 fallback을 함께 제공하는 쪽을 택했어요.

버그는 처음엔 작아 보였어요. 예를 들어 카멜커피 11호점 같은 이름이 게시 화면에 들어오면, 예전 ASCII-only sanitizer를 거친 뒤 기본 slug가 11처럼 나오는 일이 있었어요.

한글이 다 빠지고 숫자만 남았기 때문이에요.

문제는 그 결과가 제품의 최소 길이 규칙에도 맞지 않았다는 점이에요.

즉 사용자는 아무 잘못도 하지 않았는데, 게시 화면에 들어오자마자 invalid 상태를 보게 됐어요.

이건 문자열 유틸리티 문제만은 아니었다

게시 단계는 제품에서 가장 확신을 줘야 하는 순간 중 하나예요. 사용자는 이미 생성을 끝냈고, 이제는 "내 홍보 웹페이지를 공개로 올리면 된다"는 감각을 기대해요.

그런데 첫 화면이 invalid default를 보여주면, 시스템이 방금까지 잘 다뤘던 상호명을 게시 단계에서는 이해하지 못하는 것처럼 보이에요.

이건 단순한 formatting bug가 아니라 신뢰의 문제였어요.

가장 쉬워 보이는 답이 꼭 좋은 답은 아니었다

당장 떠오르는 대응은 "그냥 raw 한글 서브도메인을 전부 허용하자"일 수 있어요. 하지만 Porta는 그 방향으로 가지 않았어요.

제품 결정은 이랬어요.

  • 게시용 canonical slug는 ASCII로 유지한다
  • 대신 suggestion 계층을 훨씬 똑똑하게 만든다

이 선택 덕분에 아래 경계가 유지됐어요.

  • 게시 계약은 안정적으로 유지되고
  • 백엔드 검증 규칙도 단순하게 남고
  • 사용자는 깨진 기본값 대신 의미 있는 후보를 받아요

즉 canonical slug는 보수적으로 두고, suggestion 레이어만 더 한국어 친화적으로 만든 셈이에요.

실제로 무엇이 달라졌는가

예전 흐름은 사실상 한 가지 질문만 했어요.

"여기서 [a-z0-9-]만 남기면 뭐가 되지?"

영문 이름엔 꽤 잘 맞아요. 하지만 한글 비중이 큰 이름에서는 금방 깨져요.

새 흐름은 더 의도적으로 바뀌었어요.

  1. 한글 romanization을 포함한 slug 후보를 만든다
  2. 비어 있거나, 너무 짧거나, 약한 후보는 버린다
  3. 이름 기반 후보가 충분히 좋지 않으면 deterministic safe fallback을 만든다
  4. 사용자가 깨진 입력창에서 직접 고치게 하지 않고, candidate 버튼에서 고를 수 있게 한다

이게 훨씬 더 좋은 게시 경험이에요.

deterministic fallback이 중요했던 이유

여기서 배운 건 "최선을 다해보자"만으로는 게시 기본값이 될 수 없다는 점이었어요.

이름 기반 후보가 잘 안 나오는 경우에도 제품은 usable한 답을 하나는 내줘야 해요.

그래서 deterministic fallback이 중요했어요.

가장 사람 친화적인 slug는 아닐 수 있어요. 그래도 적어도 아래 조건은 만족해요.

  • 유효하고
  • 예측 가능하고
  • 바로 채택할 수 있어요

이건 비어 있거나 invalid한 입력창보다 훨씬 나은 실패 방식이에요.

알고리즘만이 아니라 UX도 함께 바뀌어야 했다

이 변화는 transliteration 로직 하나로 끝난 게 아니에요.

게시 단계의 UX도 같이 좋아졌어요.

  • candidate 버튼으로 선택지가 눈에 보이게 되고
  • safe fallback 액션으로 dead-end 상태를 없애고
  • 입력 정렬을 바꿔 실제 subdomain을 읽기 쉽게 만들었어요

사용자는 "slug utility"를 경험하는 게 아니에요. 공개로 올릴 수 있다는 자신감이나, 게시 직전의 마찰을 경험해요.

우리가 받아들인 트레이드오프

Romanization은 실용적이지 완벽하진 않아요.

하지만 여기서 목표는 언어학적 순도가 아니었어요.

더 튼튼한 인프라 계약을 유지하면서, 게시 마찰을 줄이는 것이 목표였어요.

이런 기능은 이상적으로 넓은 해법보다, 약간 덜 완벽해도 안정적인 기본값이 더 낫다고 느껴질 때가 많아요.

마무리

사용자가 구현에 가장 관심 없는 순간일수록 좋은 기본값의 가치가 커져요. 사업 홍보 웹페이지를 게시하려는 사람은 slug 정책을 깊게 생각하고 싶지 않아요.

제품이 먼저 reasonable한 답을 줘야 해요.

Porta에서는 그 답이 "게시 규칙은 보수적으로 유지하고, suggestion 레이어는 훨씬 더 한국어 친화적으로 만들자"였어요.

출처