UUID란 말을 들어본 적이 있을 것이다.
예전에 UUID에 대한 정의는 모르고 형태만 봤을 때는 그냥 랜덤한 문자열이 합쳐진 ID로 보였다. 어느 정도는 맞는 의미다!
UUID가 뭔지 그리고 왜 UUID를 사용하면 좋은지에 대해 알아보자!
UUID는 Universally Unique IDentifier의 약어로 범용 고유 식별자라는 의미를 가지고 있다.
UUID는 국제 인터넷 표준화 기구인 IETF에서 정식 표준(RFC4122)으로 채택한 프로토콜로써 나름 역사와 정통을 가진 녀석이다.
DB에서 레코드를 선택하는 기준으로 PK를 만들 때 숫자형(Integer)을 자동 증가(Auto Increment)로 설정한 적이 있을 것이다.
특히나 나같은 초보 개발자라면 별다른 생각없이 간편하게 삼기에 자동 증가형 숫자만큼 PK로 편한게 없다.
하지만 이 방식은 큰 문제점이 있다. 만약에 다른 누군가가 클라이언트의 정보를 가로채서 ID값에 임의의 숫자를 대입한다면? 서버로부터 다른 사용자의 정보를 불러오거나 수정, 삭제되는 불상사가 발생할 수 있다.
이런 일을 대비하기 위해 쉽게 유추할 수 없는 값을 PK로 만드는게 좋은데, 그 중 하나가 문자열(String)로 이루어진 UUID를 사용하는 것이다.
UUID는 128비트수로 32개의 16진수로 표현되며, 총 36개의 문자(32개 16진수 + 4개의 하이폰)으로 구성돼있다.
UUID 패턴 예시
8 - 4 - 4 - 4 - 12 (총 36개 문자)
abl8dj11-blz1-987s-piuz-8zb02898xl1d
UUID로 표현할 수 있는 객체의 생성 개수는 340,282,366,920,938,463,463,374,607,431,768,211,456개라고 하는데, 쉼표 세는 것도 힘들만큼 어마어마한 숫자이다. 무려 10의 36제곱...
한 마디로 중복될 가능성은 아주 낮다
원하는 타입에 따라 생성하는 방식이 조금씩 다른데, 일반적으로 5가지의 종류가 있다.
랜덤값 기반으로 생성되는 v4가 가장 많이 사용되고, 다음으로는 시간 기준인 v1이 많이 사용된다.
npm 라이브러리에 uuid가 있다. Node.js 12버전 이상부터 지원하고 크로스 플랫폼이므로 CJS나 EMS 모두 사용 가능하다.
npm install uuid
const { v4: uuidv4 } = require('uuid');
import { v4 as uuidv4 } from 'uuid';
uuid에서 불러온 함수를 실행시키면 string 타입의 uuid를 반환한다. 이걸 가지고 PK나 다른 필드값으로 사용할 수 있다.
사용법은 상당히 간단하다.
const uuid = uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
UUID를 PK로 설정하고 싶을 때, Index로 설정해야 하나 고민이 될 수도 있는데,
16진수와 하이폰으로 이루어진 문자열을 인덱스로 설정하면 검색 성능이 저하될 수도 있기 때문이다.
그러나 이 방법도 어느정도 해결책은 있다!
UUID를 인덱싱 가능하고 순서를 보장받는 체계로 변경하는 방법이 참고 링크[1]에 나와있다.
내용을 요약하면 UUID의 5개의 파트 (1 - 2 - 3 - 4 - 5)를 (3 - 2 - 1 - 4 - 5)로 변경하면 어느정도 순서를 보장받는 값으로 변경한다는 것이다.
const uuid = () => {
const tokens = v4().split('-')
return tokens[2] + tokens[1] + tokens[0] + tokens[3] + tokens[4];
}
uuid(); // -> token2 - token1 - token0 - token3 - token4
이제 DB에 UUID를 PK로 지정하고 인덱싱 설정도 해볼 수 있다!