주소가 게시 시점에 굳어 저장되는 구조, 축 링크를 두 번 옮긴 순서, 한글 slug 가 간헐적으로 보인 두 가지 어긋남을 표로 갈랐다. 화면이 실패를 없음으로 그릴 때 작성 도구에서 왜 더 오래 숨는지, Promise.all 이 거절과 던짐에서 다른 경로를 타는 이유를 채웠다. CSS module 이 왜 전역 규칙에 닿지 않는지, 403 과 404 가 원인을 어떻게 좁혔는지도 적었다. link-audit.py 를 감사 Case 의 evidence 로 걸어 배정한 증거 하나를 메웠다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.7 KiB
kind, slug, title, topic, topicName, project, status, lastVerifiedOn, sourceRevision, source
| kind | slug | title | topic | topicName | project | status | lastVerifiedOn | sourceRevision | source | |
|---|---|---|---|---|---|---|---|---|---|---|
| CASE | a-slug-rule-that-threw-korean-away | slug 생성이 한글을 버려 주제 만들기가 간헐적으로 실패했다 | addresses-frozen-at-publish-time | 주소가 만들어지고 굳어지는 곳 | TechLog | 게시 전 | 2026-09-04 | tech-log@2026-09-02 |
|
slug 생성이 한글을 버려 주제 만들기가 간헐적으로 실패했다
주제 만들기가 간헐적으로 실패했다 — 「그 slug 를 가진 주제가 이미 있습니다」. 다른 이름으로 다시 하면 됐다. 규칙은 간헐적이었던 적이 없었고 보이지 않았을 뿐이다. slug 생성이 영문 소문자와 숫자만 남기고 나머지를 버려서, 한글 이름은 아무것도 기여하지 못했다.
관계
- 계약은 앵커라고 적었고 만드는 쪽은 경로를 만들었다 주소를 만드는 다른 곳에서 난 사건이다.
- 한 화면에 종류 이름이 아홉 개 떠 있었다 — 표가 여섯 벌이었다 이름을 다루는 다른 사건이다.
- 서버가 준 주소는 라우트 표에 맞춰 보고, 맞는 라우트가 없으면 링크로 그리지 않는다 slug 가 주소의 재료라는 점에서 이어진다.
문제
주제를 만들면 가끔 「그 slug 를 가진 주제가 이미 있습니다」가 나왔다. 다른 이름으로 다시 하면 됐다.
같은 이름으로 두 번 만든 적은 없었다.
결론
간헐적으로 보인 것은 두 가지 결정적 어긋남이었고, 사용자는 둘 다 만났다.
인증 : 남는 글자가 없어 빈 문자열 → 폼이 요청 전에 거절
Redis 캐시 와 Redis 클러스터 : 둘 다 redis → 두 번째가 충돌
규칙은 간헐적이었던 적이 없다. 보이지 않았을 뿐이다 — slug 생성이
[a-z0-9]만 남기고 나머지를 버려서, 한글 이름은 아무것도 기여하지 못했다.
한글을 버리지 않고 로마자로 옮긴다. 음절을 초성·중성·종성으로 산술 분해하므로 표가 필요 없고 결정적이다.
백엔드 아키텍처 → baekendeu-akitekcheo
국어의 로마자 표기법의 자모 대응만 적용하고 음운 변화 규칙은 일부러 뺐다. slug 는 읽는 것이지 발음하는 것이 아니고, 그 규칙을 넣으면 같은 이름이 문맥에 따라 다른 slug 가 된다.
검증 환경
tech-log-frontend : 5cffe30 · 7093d84 변환 : 국어의 로마자 표기법의 자모 대응 · 음운 변화 규칙 제외 확인 방식 : 한글 이름 여럿으로 주제를 만들어 생성된 slug 를 확인
재현 조건
- 주제 이름을
인증으로 적고 저장한다 — 옛 규칙에서는 빈 slug 가 되어 폼이 거절한다 Redis 캐시와Redis 클러스터를 차례로 만든다 — 옛 규칙에서는 두 번째가 충돌한다- 새 규칙에서 같은 이름들의 slug 를 확인한다
본문
간헐적으로 보인 이유
slug 생성이 영문 소문자와 숫자만 남기고 나머지를 버렸다. 한글 이름은 통째로 사라지므로, 결과가 이름에 영문이 얼마나 섞였는지에 따라 갈린다.
| 이름 | 옛 규칙이 만든 slug | 무엇이 일어났나 |
|---|---|---|
인증 |
(빈 문자열) | 폼이 요청 전에 거절 |
Redis 캐시 |
redis |
만들어짐 |
Redis 클러스터 |
redis |
두 번째가 충돌 |
사용자는 둘 다 만났다. 어느 쪽도 「한글이 버려졌다」로 보이지 않고, 하나는 폼 오류로 하나는 중복 오류로 나타난다.
규칙은 간헐적이었던 적이 없다. 보이지 않았을 뿐이다 — slug 생성이
[a-z0-9]만 남기고 나머지를 버려서, 한글 이름은 아무것도 기여하지 못했다.
산술 분해로 로마자를 만든다
한글 음절은 초성·중성·종성이 정해진 순서로 조합된 코드다. 음절 코드에서 세 값을 산술로 분해할 수 있으므로 변환표가 필요 없고, 같은 입력에 늘 같은 결과가 나온다.
백엔드 아키텍처 → baekendeu-akitekcheo
음운 변화 규칙을 뺀 이유
국어의 로마자 표기법에는 자모 대응 외에 음운 변화 규칙이 있다. 그것을 넣지 않았다.
slug 는 읽는 것이지 발음하는 것이 아니다. 음운 변화를 적용하면 같은 글자가 앞뒤에 무엇이 오느냐에 따라 다르게 옮겨지고, 그러면 이름의 일부만 바뀌어도 앞쪽 slug 가 달라진다. 결정적이지 않은 slug 는 주소로 쓸 수 없다.
확인하지 못한 것
음운 변화 규칙을 빼서 같은 발음의 다른 이름이 다른 slug 가 된다. 그 충돌이 실제로 얼마나 자주 나는지는 재지 않았다.