UUID
UUID 란
Universally Unisque Identifier의 양자로 범용 고유 식별자를 나타낸다.
네트워크 상에서 고유성이 보장되는 id를 만들기 위한 표준 규약이다.
UUID는 128 비트의 숫자이며 32자리의 16진수로 표현된다. 총 36개의 문자
8-4-4-4-12 개의 숫자패턴과 하이픈을 사용하요 5개의 그룹으로 구분한다.
이름 | 길이 (바이트) | 길이 (16진수 숫자) | 내용 |
---|---|---|---|
time_low | 4 | 8 | 시간의 low 32비트를 부여하는 정수 |
time_mid | 2 | 4 | 시간의 middle 16비트를 부여하는 정수 |
time_hi_and_version | 2 | 4 | 최상위 비트에서 4비트 "version", 그리고 시간의 high 12비트 |
clock_seq_hi_and_res clock_seq_low | 2 | 4 | 최상위 비트에서 1-3비트, 그리고 13-15비트 클럭 시퀀스 |
node | 6 | 12 | 48비트 노드 id |
대략 이렇게 생겼다
550e8400-e29b-41d4-a716-446655440000
UUID로 표현가능한 생성 개수는 어마어마하게 커서 중복될 가능성이 아주 낮다
종류
원하는 타입에 따라 생성하는 방식이 조금씩 다른데, 일반적으로 5가지의 종류가 있다.
- v1: 타임스탬프(시간) 기준
- v2: 타입스탬프 + DCE 보안
- v3: MD5 해시 기준
- v4: 랜덤값 기반
- v5: SHA-1 해시 기준
랜덤값 기반으로 생성되는 v4가 가장 많이 사용되고, 다음으로는 시간 기준인 v1이 많이 사용된다.
Node.js에서 사용
npm 라이브러리에 uuid가 있어서 간단하게 사용할 수 있다.
자세한 방법은 공식문서 참조
https://www.npmjs.com/package/uuid
npm install uuid
import
const { v4 : uuidv4 } = require('uuid')l
// or
import { v4 as uuidv4 } from 'uuid';
사용
uuid에서 불러온 함수를 실행시키면 string 타입의 uuid를 반환한다.
const uuid = uuidv4();
UUID PK
UUID를 PK로 설정할 수 있지만 UUID를 DB에 저장할 때 발생할 수 있는 문제점이 있다.
- 36개의 문자로 이루어져 있어 많은 메모리를 차지한다.
- db에서 string 데이터를 인덱싱하면 인덱스도 커지고 검색 성능도 떨어진다.
- 순서를 보장하지 않는다.
아래 글에서 UUID 값을 인덱싱 가능하고 순서를 보장받는 체계로 변경하는 방법이 설명되어 있다.
Storing Universal Unique Identifier (UUID) Values in MySQL - Karthik Appigatla
UUID의 5개 그룹의 순서를 변경한다. (4번째 그룹은 타임스탬프를 포함한다.)
하이픈을 제거하여 검색을 빠르게 한다
즉 1-2-3-4-5 의 구조를 32145로 변경하면 어느 정도 보장받는 수체계로 변환할 수 있다.
이를 node에서 사용하면 다음과 같이 활용할 수 있다.
const uuid = () => {
const tokens = v4().split('-')
return tokens[2] + tokens[1] + tokens[0] + tokens[3] + tokens[4];
}
uuid();