TypeID-JS: Type Safe, K-Sortable Javascript용 고유 ID

WBOY
풀어 주다: 2024-07-16 21:31:00
원래의
669명이 탐색했습니다.

TypeID-JS: Type Safe, K-Sortable Unique IDs for Javascript

작년에 TypeID를 처음 발표한 이후로 커뮤니티에서 상당한 채택과 관심을 얻었습니다. 커뮤니티에서 제공하는 23개의 다양한 언어 클라이언트와 Typescript 구현의 주간 NPM 다운로드가 90,000회에 달합니다. .

지난 주에 우리는 Typescript 구현인 TypeID-JS 버전 1.0을 출시했습니다. 이번 출시를 축하하기 위해 TypeID를 작성한 이유와 이를 사용하여 Jetify에서 유형 안전을 보장하는 방법에 대해 더 자세히 공유하고 싶었습니다.

유형 안전 및 고유 식별자

우리는 팀 전체에 Devbox 또는 Docker 기반 프로젝트를 배포하고 관리하기 위한 솔루션인 Jetify Cloud를 구축하면서 TypeID에 대한 아이디어를 개발했습니다. Jetify Cloud의 아키텍처에는 조직, 사용자, 배포, 비밀 및 프로젝트 등 우리가 관리해야 하는 다양한 개체가 있으며, 모두 구별하기 위해 고유한 식별자가 필요합니다.

처음에는 모범 사례를 따르고 엔터티의 각 인스턴스에 UUID를 할당하는 것부터 시작했습니다. 그럼에도 불구하고 우리는 곧바로 문제에 직면했습니다: UUIDv7에는 유형 안전성이 부족합니다! 아래 코드를 예로 들어보세요.

export const getMember = async (
  memberId: UUID,
  orgId: UUID,
) => {
  const { member, organization } =
    await authClient.organizations.members.get({
      organization_id: orgId,
      member_id: memberId,
    });

  return { member, organization };
};
로그인 후 복사

이 기능은 두 개의 UUID를 사용하여 회원과 조직을 조회합니다. 그러나 이 함수는 memberID 및 orgID가 올바른 엔터티를 나타내는지 확인할 수 없습니다. 개발자가 orgID가 필요한 곳에 memberID를 실수로 사용하는 경우 런타임 시에만 문제를 발견할 수 있습니다.

이 문제에 대한 해결책을 찾다가 접두사를 사용하여 유형 정보를 ID로 인코딩하는 Stripe의 Object ID를 만났습니다. 이는 훌륭한 솔루션처럼 보였지만 안타깝게도 여러 언어에 걸쳐 형식화된 ID를 일관되게 구현하기 위한 잘 정의된 표준을 찾을 수 없었습니다.

TypeID: K 정렬 가능하고 유형 안전하며 전역적으로 고유한 식별자

TypeID는 이러한 일관된 표준을 만들기 위한 우리의 시도입니다. TypeID는 Stripe의 접두사 유형에서 영감을 받아 유형이 안전하고 K 정렬이 가능한 전역적으로 고유한 식별자입니다. TypeID는 또한 다른 언어의 클라이언트 및 라이브러리 구현을 위한 일관된 표준을 제공합니다.

TypeID는 고유 식별자를 세 부분으로 구성된 소문자 문자열로 인코딩합니다.

  1. ID의 종류를 나타내는 접두어(63자, ASCII 소문자)
  2. 밑줄(_) 구분 기호
  3. 수정된 base32 인코딩을 사용하여 26자 문자열로 인코딩된 128비트 UUIDv7입니다.
  user_2x4y6z8a0b1c2d3e4f5g6h7j8k
  └──┘ └────────────────────────┘
  type    uuid suffix (base32)
로그인 후 복사

이 형식을 사용하면 TypeID 호환 클라이언트가 유형 정보를 ID로 인코딩 및 디코딩한 다음 빌드 또는 컴파일 시 검사를 실행하여 올바른 ID를 사용하고 있는지 확인할 수 있습니다. 예를 들어, 사용자 엔터티에 대해 임의의 TypeID를 생성하려면 다음과 같이 할 수 있습니다.

TypeID를 사용하면 함수에 유형 검사를 추가하고 런타임 시 오류를 포착할 수도 있습니다. 위의 예를 다시 작성하면 이제 개발자가 올바른 위치에서 올바른 ID를 사용할 것이라고 확신할 수 있습니다.

import { TypeID } from 'typeid-js';

export const getMember = async (
  memberId: TypeID<'member'>,
  orgId: TypeID<'org'>,
) => {
    ...
}
로그인 후 복사

유형 안전성 외에도 이 형식에는 개발자가 사용하기 쉽게 만드는 몇 가지 속성이 있습니다.

  1. UUIDv7 호환: 접두사를 제거하고 접미사를 디코딩하여 TypeID를 UUID로 쉽게 변환할 수 있습니다.
  2. K-정렬 가능: 지역성이 좋은 데이터베이스에서 TypeID를 정렬 가능한 기본 키로 사용할 수 있습니다.
  3. URL 안전: URL에 TypeID를 사용하여 쉽게 복사하고 붙여넣고 공유할 수 있습니다. URL에 TypeID를 포함하면 페이지 상태 생성이 단순화됩니다.
  4. 쉽게 선택 가능: 더블클릭하여 복사하여 붙여넣을 수 있습니다(사용해 보세요!)

TypeID-JS v1.0의 새로운 기능

오늘 우리는 TypeID-JS 라이브러리 버전 1.0을 발표합니다. 이 업데이트에는 유용성과 유형 안전성을 개선하기 위해 다음과 같은 몇 가지 새로운 기능이 추가되었습니다.

  1. Unboxed, 함수 기반, 스트리밍 가능한 TypeID: 이를 통해 TypeID를 문자열로 변환하지 않고 직렬화할 수 있으며 TypeID를 Maps 및 Set의 키로 사용할 수 있습니다.
  2. 더 엄격한 유형 및 런타임 검사: 이제 빈 문자열이나 잘못된 접두사가 있는 유형 ID를 구문 분석하려고 하면 TypeID에서 오류가 발생합니다.
  3. TypeID 사양 v3과의 호환성: 이제 JS TypeID는 접두사에 밑줄을 사용할 수 있습니다. 예를 들어 pro_subscription_2x4y6z8a0b1c2d3e4f5g6h7j8k는 접두사가 pro_subscription인 유효한 TypeID입니다.

프로젝트에 TypeID를 사용하는 방법

선택한 NodeJS 패키지 관리자를 사용하여 JS 프로젝트에 TypeID를 추가할 수 있습니다. JS를 사용하지 않습니까? TypeID에는 Go에서 OCaml, SQL에 이르기까지 26가지의 다양한 구현이 있습니다. TypeID 구현을 직접 작성하는 데 관심이 있다면 공식 사양을 확인하세요.

개발 팀의 역량을 강화하고 싶으신가요?

Jetify 팀은 강력한 개발자 도구를 구축합니다. Jetify Cloud로 배포 및 프로젝트를 단순화하거나 Devbox로 온보딩 + 개발 환경을 자동화하세요. Twitter에서 우리를 팔로우하거나 Discord 서버에서 실시간으로 개발자와 채팅할 수 있습니다. 또한 Github Repo에서 이슈와 풀 요청을 환영합니다.

위 내용은 TypeID-JS: Type Safe, K-Sortable Javascript용 고유 ID의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!