"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > TypeID-JS: Type Safe, K-Sortable Javascript용 고유 ID

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

2024-08-05에 게시됨
검색:600

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의 객체 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,
  orgId: TypeID,
) => {
    ...
}

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

  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를 맵 및 세트의 키로 사용할 수 있습니다.
  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에서 이슈와 풀 요청을 환영합니다.

릴리스 선언문 이 기사는 https://dev.to/jetify/typeid-js-type-safe-k-sortable-unique-ids-for-javascript-djh?1에 복제되어 있습니다. 침해가 있는 경우에는 Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3