적절한 길이의 uuid 도입을 위해 조사하던 중 찾은 라이브러리..!
https://www.npmjs.com/package/nanoid
nanoid
A tiny (116 bytes), secure URL-friendly unique string ID generator. Latest version: 4.0.2, last published: 2 months ago. Start using nanoid in your project by running `npm i nanoid`. There are 6583 other projects in the npm registry using nanoid.
www.npmjs.com
2023년 5월 24일 기준, 주간 다운로드 횟수가 약 3천만회다..
통상적인 uuid의 경우, 32개의 16진수와 그룹 표현을 위한 '-'까지 36개의 문자열을 저장한다.
uuid를 사용하게 되면 인덱스 저장공간 관련 이슈가 발생할 가능성이 있다고 판단해 사용하되 최대한 줄여보고자 했다.
그렇게 short-uuid와 nanoid 둘 중 더 자주 사용, 업데이트 되는 nanoid를 사용하기로 결정했다.
물론 두 라이브러리 모두 테스트해봤는데, nanoid에서 제공하는 기능이 더 많아, uuid 외에도 다른 용도로 사용이 용이할 것 같았다.
nanoid를 개략적으로 설명해보자면
일단 굉장히 가볍다. 그 용량이 130bytes에 불과하고 어떠한 의존성도 가지지 않는다.
또 안전하다. 뭐 hardware random generator를 사용해서 예측 불가능한 식별자를 생성한다는데, 이 부분은 잘 모르겠다.
생성하는 코드 까보니까, 뭔가 길긴 했다.
무엇보다 짧다. uuid의 총 길이를 36자에서 21자로 줄여준다. 이 점이 매우 매력적이었다.
% 문 제 발 생 %
도입을 결정하고 개인 레포지터리에서 테스트를 하던 도중, import부터 오류가 발생했다. 다음과 같은 오류였는데
Error [ERR_REQUIRE_ESM]: require() of ES Module /node_modules/nanoid/async/index.js from schema.ts not supported. Instead change the require of index.js in schema.ts to a dynamic import() which is available in all CommonJS modules.
찾아보니 nanoid가 버전 4부터는 ESM만 지원하는 이슈였다.
코멘트가 100개 이상이 달릴 정도로 갑론을박이 벌어졌는데 꽤 재밌었다.
라이브러리 개발자의 결론을 요약해보면 3.x 버전과 4.x 버전 각각 CJS, ESM 어플리케이션을 지원할 것이라는 것
CJS 어플리케이션을 개발하는 사람들은 3.x 버전을 이용하라는 것, 몇 년 간의 지속적인 업데이트도 보장해준다고 했다.
나는 현재 CJS 어플리케이션 개발중이라 기존 버전을 지우고 3.x 버전을 설치하니 문제없이 잘 실행됐다.
다만 async, non-secure 모듈 지원이 안.. 됨.. 하..
이런 이슈는 처음이기도 하고 막 이모지로 의견 팽팽히 나뉘는게 재밌어서 한 번 정리해봤다.
'Back End' 카테고리의 다른 글
일기예보 구현에 기상청 API를 사용해봤던 건에 대하여 (1) (0) | 2025.03.02 |
---|---|
Real MySQL 8.0 1권을 읽고 (2) (1) | 2024.11.09 |
Real MySQL 8.0 1권을 읽고 (1) (0) | 2024.10.26 |
단위 테스트를 가볍게 알아보자 (0) | 2024.10.13 |
인증 로직 (0) | 2023.08.22 |