Node.js에서 UUID 사용하기

Do_Doolly·2022년 12월 27일
2
post-thumbnail
  • 글에 적은 내용 중 잘못된 부분은 댓글로 적어주시면 감사하겠습니다!

UUID란 말을 들어본 적이 있을 것이다.

예전에 UUID에 대한 정의는 모르고 형태만 봤을 때는 그냥 랜덤한 문자열이 합쳐진 ID로 보였다. 어느 정도는 맞는 의미다!

UUID가 뭔지 그리고 왜 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가지의 종류가 있다.

  1. v1: 타임스탬프(시간) 기준
  2. v2: 타입스탬프 + DCE 보안
  3. v3: MD5 해시 기준
  4. v4: 랜덤값 기반
  5. v5: SHA-1 해시 기준

랜덤값 기반으로 생성되는 v4가 가장 많이 사용되고, 다음으로는 시간 기준인 v1이 많이 사용된다.

Node.js에서 사용하기

npm 라이브러리에 uuid가 있다. Node.js 12버전 이상부터 지원하고 크로스 플랫폼이므로 CJS나 EMS 모두 사용 가능하다.

npm install uuid

설치

  1. CommonJS를 사용하는 경우 (ES5 이하)
const { v4: uuidv4 } = require('uuid');
  1. ESM을 사용하는 경우 (ES6 이상)
import { v4 as uuidv4 } from 'uuid';

사용

uuid에서 불러온 함수를 실행시키면 string 타입의 uuid를 반환한다. 이걸 가지고 PK나 다른 필드값으로 사용할 수 있다.

사용법은 상당히 간단하다.

const uuid = uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

index로 설정할 경우

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로 지정하고 인덱싱 설정도 해볼 수 있다!



& 참고 자료

UUID 생성하기


주석

[1] : Storing UUID Values in MySQL

profile
생각하면 복잡하니까 일단 해보자

0개의 댓글