Post
EN

ULID (Universally Unique Lexicographically Sortable Identifier)

최근 PR 내용 중 ULID를 이용하여 데이터베이스 내에 정보를 저장하는 PR이 올라와서 ULID에 대해 찾아보고 남겨본다.

우선 ULID를 사용해야되는 이유는 다음과 같다.

Primary Key를 Auto Increase 방식으로 사용할 경우

장점

순차적으로 데이터베이스 내에 key값이 생성되므로 코드를 개발하는 개발자 입장에서는 별도로 신경쓸 필요가 없다.

순서대로 번호가 증가되기 때문에, 정렬하기 쉽다.

단점

Auto Increase 컬럼은 결국 길이 제한이 생긴다.

Int나 Big int 역시 최대값 길이 차이가 있을 뿐이지, 최대값을 넘길 경우 더이상 표현할 방법이 없다. (물론 그런일이 생길 가능성이 매우 낮다고 생각되지만..)

mysql 기준으로하면

  • int : -2147483648 ~ 2147483647 ( 4 바이트 )

  • bigint -9223372036854775808 ~ 9223372036854775807 (8바이트) 의 값을 가진다.

외부 노출값을 고민하지 않아도 된다.

  • 시퀀스 값으로 표현될 경우 앞으로 생성될 key들을 유츄할 수 있으며, SQL Injection과 같은 보안문제가 발생될 수 있다.

이럴 경우 사용되는 방식이 몇가지 있었는데, 내가 기존에 알던 방식은 UUID로 작성하는 것이였다.

하지만 이 부분도 꽤 부딪힘이 많이 있었다.

키 길이가 길어진다는 것과, 검색 성능이 떨어질 수 있다는 점들이 있어서 여러 논란들이 있었다.

결국엔 사용하긴 했다.

ULID는 이러한 UUID와 유사한 방식으로 사용하기 위해 나온 것으로 보인다.

(좀더 개선된 버전으로 나온 것 같음)

UUID의 장점을 보면 아래와 같다.

UUID는 다음과 같은 이유로 많은 사용 사례에서 최적이 아닐 수 있습니다.

- 128비트 임의성을 인코딩하는 가장 문자 효율적인 방법은 아닙니다.

- UUID v1/v2는 고유하고 안정적인 MAC 주소에 대한 액세스가 필요하므로 많은 환경에서 실용적이지 않습니다.

- UUID v3/v5에는 고유한 시드가 필요하며 무작위로 분산된 ID를 생성하므로 많은 데이터 구조에서 조각화가 발생할 수 있습니다.

- UUID v4는 많은 데이터 구조에서 조각화를 일으킬 수 있는 무작위성 외에 다른 정보를 제공하지 않습니다.

- UUID와의 128비트 호환성

- 밀리초당 1.21e+24개의 고유 ULID

- 사전순으로 정렬 가능!

- 36자 UUID와 달리 26자 문자열로 정규적으로 인코딩됩니다.

- 더 나은 효율성과 가독성을 위해 Crockford의 base32를 사용합니다(문자당 5비트).

- 대소문자를 구분하지 않음

- 특수 문자 없음(URL 안전)

- 단조로운 정렬 순서(동일한 밀리초를 올바르게 감지하고 처리함)

https://github.com/ulid/spec

GitHub - ulid/spec: The canonical spec for ulid

The canonical spec for ulid. Contribute to ulid/spec development by creating an account on GitHub.

그 밖의 전략들도 꽤 있는 것으로 보인다.

트위터 스노플레이크

https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake

TSID(Time-Sorted Unique Identifiers)

https://velog.io/@ssssujini99/%EA%B0%9C%EB%B0%9C-idPK-%EC%A7%81%EC%A0%91%ED%95%A0%EB%8B%B9-%EC%A0%84%EB%9E%B5-Random-UUID-TSID-%EA%B0%81%EA%B0%81-%EB%B9%84%EA%B5%90%EB%B6%84%EC%84%9D

출처 :

https://findstar.pe.kr/2022/10/14/resource-id-generation/

https://way-code.tistory.com/entry/GeneratedValue-IDENTITY%EB%A5%BC-%EB%B2%97%EC%96%B4%EB%82%98-UUIDULID-%EC%A0%84%EB%9E%B5-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0

https://ssdragon.tistory.com/162

분산환경에서 DB 기본키(PK)는 어떤 ID 생성 전략으로 만들어야할까? (UUID,ULID,TSID…)

보통 개발 편의성을 위해 Oracle의 Sequence, MySQL의 auto_increment 로 숫자를 1씩 증가시키는 것으로 만든다. 이것은 어떤 문제점이 있을까? 외부에서 해당 시스템 PK를 예측하기 쉬워져서 SQL Injection 문제 Sequence, auto_increment는 중앙 집중식으로 값을 생성하는 방식이므로 DB에 의존적이게 되어 확장성이 제한되는 문제 서비스 폭풍성장 시, ID 고갈되는 문제 (BIGINT 최댓값은 4,294,967,295 이고, unsigned BIGINT라면 18,446,744,073,…

This article is licensed under CC BY 4.0 by the author.