Fastapi
Chapter 3-3 고유하고 짧은 alphanumeric 식별자 만들기 – Base62 접근 방식
Chansman
2025. 5. 27. 13:16
✅ 고유하고 짧은 alphanumeric 식별자 만들기 – Base62 접근 방식
1. 🎯 목표: 어떤 식별자가 필요한가?
우리는 다음과 같은 조건을 만족하는 **식별자(ID)**가 필요합니다:
- ✅ 고유(unique) 해야 한다
- ✅ 충분히 짧아야 한다 (uuid4는 너무 김)
- ✅ alphanumeric 문자로 구성되어야 한다 (URL-safe)
❌ 특수문자 포함된 ID는 URL에 적합하지 않음 → 사용 금지
2. ❌ uuid4가 부적절한 이유
- UUID는 고유성을 보장하지만 너무 깁니다 → 550e8400-e29b-41d4-a716-446655440000
- 길고 특수문자가 포함되어 URL에 바로 쓰기 불편합니다
3. ✅ 해결책: uuid + Base62 인코딩
uuid 값 같은 큰 숫자 → 짧고 고유한 문자열로 변환!
4. 🧬 Base62 인코딩 구현
📁 app/utils/base62.py
import string
from typing import Final, ClassVar
class Base62:
BASE: Final[ClassVar[str]] = string.ascii_letters + string.digits
BASE_LEN: Final[ClassVar[int]] = len(BASE)
@classmethod
def encode(cls, num: int) -> str:
if num < 0:
raise ValueError(f"{cls}.encode() needs positive integer but you passed: {num}")
if num == 0:
return cls.BASE[0]
result = []
while num:
num, remainder = divmod(num, cls.BASE_LEN)
result.append(cls.BASE[remainder])
return "".join(result)
📌 Base62.encode(125) → "cb" 같은 짧은 문자열이 생성됩니다.
5. ⚙️ Base 계열 인코딩 동작 원리
단계 설명
1 | 사용할 문자 집합(BASE)을 정함 (62개: a-z, A-Z, 0-9) |
2 | 변환할 정수를 준비함 |
3 | BASE 길이로 나눠 몫과 나머지를 구함 |
4 | 나머지를 BASE 인덱스로 사용해 문자 선택 |
5 | 몫이 0이 될 때까지 반복 |
6 | 결과 리스트를 문자열로 합침 |
6. 🧠 요약 정리
항목 설명
목적 | 고유하고 짧은 URL-safe ID 만들기 |
문제 | uuid는 길고 특수문자 포함됨 |
해결책 | uuid → 정수 → Base62 인코딩 |
장점 | 고유 + 짧음 + URL 안전 |
응용 | 단축 URL, 고유 코드, 미팅 ID 등 |
Base62 인코딩은 짧고 안전한 식별자가 필요한 모든 서비스에서 매우 유용합니다. ✨