나도 그 말이 이상하다고 생각했음. v7은 단조성이 필요할 때 좋지만, 타임스탬프가 시스템 정보를 노출할 수 있음. 그래서 v4는 여전히 유효함
“outdated”라는 표현은 부적절하다고 봄. 문제는 요구사항 불일치이지 나이 때문이 아님
각 UUID 버전(v4 포함)은 특정 상황에서 결함이 있음. 실제로 많은 조직은 표준 UUID 대신 순수 128비트 값을 자체 정의해 사용함
결국 UUID의 설계 한계를 넘어서는 복잡한 요구사항이 많아졌음
v4가 기본 선택이고, 특별히 순서 보존이 필요할 때만 다른 버전을 씀
정말 128비트 무작위성이 필요하다면 그냥 128비트 난수를 쓰면 됨. UUID 포맷에 끼워 맞출 필요는 없음
하지만 v4는 B-Tree 삽입을 엉망으로 만들 수 있음. 커널의 페이지 캐싱 효율 때문에 v7이 훨씬 빠르다고 배웠음
오늘 HN에 이런 소소한 Go 관련 뉴스가 올라온 게 반가움
요즘은 프로그래밍의 미래나 AI 얘기뿐이라 이런 기술 토픽이 신선함
오랜만에 깊이 있는 기술 토론을 보니 기분이 좋음
AI 관련 공포(FUD)에서 잠시 벗어나서 마음이 편해짐. 예전엔 HN을 열면 불안해지지 않았는데 요즘은 다들 “망할 거야” 얘기뿐이었음
겉보기엔 작은 기술 이슈지만, 사실 Go 언어의 아키텍처와 리더십 방향을 좌우하는 큰 결정임
완벽주의자, 실무 개발자, 그리고 crypto 커뮤니티가 각기 다른 입장을 가짐
관련 문서: RFC 9562
나는 Go가 올바른 결정을 내리길 바람. 특히 TinyGo는 마이크로컨트롤러용으로 정말 멋짐
Go를 싫어하는 사람들의 풍경이 재밌음. 이제는 AI가 코드 보는 시대라 언어 비판의 재미도 사라진 듯함
Go가 UUID 생성을 지원하는 건 별로 신경 안 쓰지만, 표준 UUID 타입이 생기는 건 정말 중요함
JSON, Text, database/sql 등에서 일관된 마샬링이 가능해질 것임
최근 Go 의존성 분석에서 google/uuid가 두 번째로 많이 쓰이는 패키지였음
관련 분석: The most popular Go dependency
나도 dec128 타입이 표준으로 들어가면 좋겠음. uint128로 변환이 쉬운 구조체 형태로 제공되면 이상적임
Go의 매력은 화려한 기능보다 실용성에 있음
언어가 무너질 정도로 복잡해지지 않고, 필요한 기능만 추가함
나도 최근 여러 버전을 건너뛰어 업그레이드했는데 아무 문제 없었음 호환성 보장 덕분에 안심하고 쓸 수 있음. 변화는 느리지만 꾸준히 좋아지는 언어임
Google의 uuid 패키지가 비활성화된 것보다, gofrs/uuid가 새 표준을 따르고 활발히 유지된다는 점이 더 중요하다고 생각함 gofrs/uuid 저장소
외부 의존성 없는 라이브러리를 만드는 게 즐거움. 이번 변경으로 그런 작업이 더 쉬워짐
하지만 google/uuid는 2024년 이후 릴리스가 없고, 2025년 6월에도 관련 이슈가 열려 있음 이슈 #194
이 제안은 이미 3년 전부터 논의 중이었음
UUID를 정말 싫어함. 사람 친화적이지 않은 식별자임
디버깅이나 쿼리 결과에서 너무 길고 불편함.
물론 완전히 분리된 시스템 간 고유 ID가 필요할 때는 쓸모 있지만, 대부분은 남용되고 있음
일반적인 경우엔 중앙화된 번호 발급기가 훨씬 나음.
예를 들어 DB의 GetNextId 같은 절차가 더 인간적이고 효율적임
예전에 회사에서 6자리 코드로 프로젝트를 관리했는데, 누군가 그걸 UUID로 바꿔버림
결과적으로 사람이 읽을 수 없는 코드가 되어버렸고, 심지어 자체 구현이라 이상하게 순차적이었음. 완전히 망한 결정이었음
사실 대부분의 경우 정수 카운터로 충분함
Postgres에서 카운터 테이블을 쓰면 초당 수만 개 ID를 생성할 수 있음
이렇게 하면 메모리 절약, 압축 효율, 해시맵 성능까지 좋아짐
UUID는 편하지만 성능을 망침
인간이 읽기 쉬운 요소가 있었으면 좋겠음
예: BASKETBALL-...-FISH 같은 형태로 단어 기반 체크섬을 붙이면 기억하기 쉬움
“결정적 난수화”를 언급했는데, 나도 LFSR(선형 피드백 시프트 레지스터) 같은 방식이 괜찮다고 생각함
Go에 UUID가 정말 추가되는 건지 궁금했음
현재 ‘Likely accept’ 상태임. Go 프로젝트 보드에서 확인 가능함
특별한 반대가 없으면 포함될 가능성이 높음
네, 추가될 예정임
Kotlin도 최근 2.3 버전에서 RFC 9562 기반 UUID 버전 지원을 표준 라이브러리에 추가했음
JVM, JS, WASM, Native 모두 지원함.
IETF RFC가 안정화된 만큼 Go도 따라가는 게 합리적임
Go가 이런 기본 기능 지원이 부족한 점은 아쉬움
어떤 언어가 이런 걸 더 잘 표준화했는지 궁금함. Java 정도일까? Python이나 Rust도 비슷한 상황임
“배터리 포함”의 의미가 20년 사이 많이 달라졌음. 아마 Google 내부에서 필요하지 않았던 기능일 수도 있음
UUID는 결국 16바이트 배열일 뿐임. v4 생성은 몇 줄이면 끝남. 큰일은 아님
어떤 기능이 부족하다고 느끼는지 궁금함
개인적으로는 Go의 로깅 시스템이 너무 단순해서 직접 구현해야 했음
slog 모듈은 느리고 불편함. 엔터프라이즈 환경만 고려한 듯함
그래도 Go의 표준 라이브러리 품질은 최고 수준임. 일상 개발에서 가장 많이 쓰이는 stdlib이라고 생각함
v7의 DB 클러스터링 효율과 v4의 무작위성을 동시에 얻을 방법이 있을까 고민했음
내부적으로 v7을 쓰고, 외부로 보낼 때 XOR이나 AES로 스크램블링하면 가능할 듯함
Hacker News 의견들
UUID 버전 1~5가 이미 구식이라는 말이 흥미로웠음
하지만 v4는 여전히 무작위성이 가장 높고, 분산 DB에서 핫스팟 문제와 프라이버시 이슈를 피하기 위해 기본 키로 권장됨
참고 링크: CockroachDB UUID 문서, Google Cloud Spanner UUID 가이드
각 UUID 버전(v4 포함)은 특정 상황에서 결함이 있음. 실제로 많은 조직은 표준 UUID 대신 순수 128비트 값을 자체 정의해 사용함
결국 UUID의 설계 한계를 넘어서는 복잡한 요구사항이 많아졌음
오늘 HN에 이런 소소한 Go 관련 뉴스가 올라온 게 반가움
요즘은 프로그래밍의 미래나 AI 얘기뿐이라 이런 기술 토픽이 신선함
완벽주의자, 실무 개발자, 그리고 crypto 커뮤니티가 각기 다른 입장을 가짐
관련 문서: RFC 9562
나는 Go가 올바른 결정을 내리길 바람. 특히 TinyGo는 마이크로컨트롤러용으로 정말 멋짐
Go가 UUID 생성을 지원하는 건 별로 신경 안 쓰지만, 표준 UUID 타입이 생기는 건 정말 중요함
JSON, Text, database/sql 등에서 일관된 마샬링이 가능해질 것임
최근 Go 의존성 분석에서 google/uuid가 두 번째로 많이 쓰이는 패키지였음
관련 분석: The most popular Go dependency
Go의 매력은 화려한 기능보다 실용성에 있음
언어가 무너질 정도로 복잡해지지 않고, 필요한 기능만 추가함
호환성 보장 덕분에 안심하고 쓸 수 있음. 변화는 느리지만 꾸준히 좋아지는 언어임
Google의 uuid 패키지가 비활성화된 것보다, gofrs/uuid가 새 표준을 따르고 활발히 유지된다는 점이 더 중요하다고 생각함
gofrs/uuid 저장소
이슈 #194
UUID를 정말 싫어함. 사람 친화적이지 않은 식별자임
디버깅이나 쿼리 결과에서 너무 길고 불편함.
물론 완전히 분리된 시스템 간 고유 ID가 필요할 때는 쓸모 있지만, 대부분은 남용되고 있음
일반적인 경우엔 중앙화된 번호 발급기가 훨씬 나음.
예를 들어 DB의 GetNextId 같은 절차가 더 인간적이고 효율적임
결과적으로 사람이 읽을 수 없는 코드가 되어버렸고, 심지어 자체 구현이라 이상하게 순차적이었음. 완전히 망한 결정이었음
Postgres에서 카운터 테이블을 쓰면 초당 수만 개 ID를 생성할 수 있음
이렇게 하면 메모리 절약, 압축 효율, 해시맵 성능까지 좋아짐
UUID는 편하지만 성능을 망침
예:
BASKETBALL-...-FISH같은 형태로 단어 기반 체크섬을 붙이면 기억하기 쉬움Go에 UUID가 정말 추가되는 건지 궁금했음
특별한 반대가 없으면 포함될 가능성이 높음
Kotlin도 최근 2.3 버전에서 RFC 9562 기반 UUID 버전 지원을 표준 라이브러리에 추가했음
JVM, JS, WASM, Native 모두 지원함.
IETF RFC가 안정화된 만큼 Go도 따라가는 게 합리적임
Go가 이런 기본 기능 지원이 부족한 점은 아쉬움
개인적으로는 Go의 로깅 시스템이 너무 단순해서 직접 구현해야 했음
slog 모듈은 느리고 불편함. 엔터프라이즈 환경만 고려한 듯함
v7의 DB 클러스터링 효율과 v4의 무작위성을 동시에 얻을 방법이 있을까 고민했음
내부적으로 v7을 쓰고, 외부로 보낼 때 XOR이나 AES로 스크램블링하면 가능할 듯함
예를 들어 Feistel 암호화를 쓰면 UUID의 성능 문제 없이 불투명한 공개 ID를 만들 수 있음