본문 바로가기

Back End

nanoid 라이브러리 이슈

적절한 길이의 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 모듈 지원이 안.. 됨.. 하..

 

이런 이슈는 처음이기도 하고 막 이모지로 의견 팽팽히 나뉘는게 재밌어서 한 번 정리해봤다.