Go 표준 라이브러리에 UUID 패키지 추가 제안

2 weeks ago 10

  • Go 언어에 UUID 생성 및 파싱 기능을 표준 라이브러리로 포함하자는 제안이 GitHub에서 논의됨
  • 제안자는 현재 대부분의 Go 서버·DB 프로젝트가 github.com/google/uuid 같은 외부 패키지에 의존하고 있음을 근거로 제시
  • C#, Java, Python 등 주요 언어는 이미 표준 라이브러리 수준에서 UUID 지원을 제공하고 있음
  • 논의 과정에서 UUIDv7 등 최신 사양과 RFC 9562 준수 여부, 파싱 기능 포함 범위, API 일관성 등이 주요 쟁점으로 다뤄짐
  • 이 제안은 이후 crypto/rand 패키지의 UUIDv4·UUIDv7 지원 제안(#76319) 으로 통합되어 진행 중임

제안 개요

  • Go 표준 라이브러리에 UUID 생성 및 파싱 API를 추가하는 방안 제시
    • 대상 버전은 UUID v3, v4, v5
    • 주요 근거는 외부 패키지 의존도와 다른 언어의 표준 지원 사례
  • UUID는 RFC 4122(이후 RFC 9562)에 정의된 국제 표준임
  • 제안자는 Go가 주요 언어 중 UUID 표준 지원이 없는 예외적 사례라고 지적

초기 반응과 논의

  • 일부 참여자는 과거에도 유사 제안이 있었으나 거절된 전례를 언급 (#23789, #28324)
    • 이유는 외부 패키지 사용이 충분히 간편하고, 표준 라이브러리보다 릴리스 주기가 유연하다는 점
  • 제안자는 “대부분의 프로젝트가 매번 외부 패키지를 임포트해야 한다면, 차라리 표준에 포함하는 것이 낫다”고 주장
  • 다수의 언어가 UUID를 crypto 관련 표준 라이브러리에 포함하고 있다는 점이 지지 근거로 제시됨

최신 UUID 버전 및 RFC 반영

  • 일부 의견은 UUID v1~v5는 구식이며, v7이 최신이자 유망한 버전이라고 지적
    • v7은 다양한 구현 옵션이 존재하며, 적용 결과를 지켜볼 필요가 있음
  • RFC 초안에서는 UUID를 불필요하게 파싱하지 말고 불투명한 식별자로 다루는 것을 권장
  • 이후 RFC 9562가 정식 발행되면서, 관련 논의가 UUIDv7 지원 중심으로 이동

제안의 수정 및 병합

  • 2025년, RFC 9562가 공식화되자 PostgreSQL 18이 UUIDv7을 지원했다는 언급 등장
  • 이후 Go 측에서는 crypto/rand 패키지에 UUIDv4·UUIDv7 생성 기능만 추가하는 별도 제안(#76319)을 개시
    • 파싱 기능은 RFC 권고에 따라 제외
  • 원 제안(#62026)은 중복(duplicate) 으로 처리되어 닫힘

API 설계 논의

  • uuid.New() 기본 동작을 v4로 둘지, 향후 변경 가능성을 둘지 논의
    • 일부는 “버전 변경 시 호환성 문제가 생길 수 있다”며 항상 v4로 고정할 것을 제안
  • Compare, MustParse, Parse 등 메서드 제공 여부 논의
    • Compare는 RFC 정의에 따라 정렬 가능한 UUID 지원을 위해 필요하다는 의견
    • MustParse는 표준 내 다른 Must* 함수들과 일관성을 유지하기 위해 포함
  • IsZero() 메서드는 UUID 타입에 불필요하다는 결론
  • Generator 구조체 도입, 버전별 타입 분리(UUIDv4, UUIDv7 등) 등 다양한 설계 제안이 제시됨
  • 일부는 New() 함수의 모호성을 지적하며, 명시적 버전 함수(NewV4, NewV7) 만 제공하자는 의견 제시

주요 기술 쟁점

  • UUID 정렬(sorting) 정의가 v6·v7에만 명확히 존재하는지 여부 논의
  • UUIDv7 생성 시 시간 기반 정렬 보장동시성 충돌 방지(counter 방식) 구현 방법 검토
  • 버전별 의미 차이(예: v1은 MAC 주소 포함, v7은 시간 기반)로 인해 단일 타입 설계의 한계 지적
  • 일부는 버전별 타입 분리 및 명시적 변환 메서드(AsV4(), AsV7() 등) 도입을 제안

결론 및 현재 상태

  • Go 커뮤니티는 UUID 표준 지원 필요성에는 대체로 동의
  • 다만, 표준 라이브러리의 단순성 유지RFC 권고 준수를 위해
    • 파싱 기능은 제외
    • UUIDv4·UUIDv7 생성 기능만 crypto/rand에 추가하는 방향으로 정리
  • 원 제안(#62026)은 #76319 제안으로 통합되어 진행 중이며,
    Go 언어의 UUID 표준 지원이 공식화 단계에 근접한 상태임

Read Entire Article