혐오스러운 node-gyp

개발조무사·2024년 5월 14일

들어가기전

보통 password는 해싱해서 DB에 적재하는게 국룰 of 국룰입니다. ( 아마도 법임 )

저는 Node를 즐겨서 사용하기 때문에 보통 password 해싱을 할 때 bcrypt라는 놈을 사용하는데
단 한번도 bcrypt를 사용할 때 문제를 일으키지 않다가 오늘 회사에서 사용할 일이 생겨 즐겁게
npm install bcrypt를 갈겼더니 다음과 같은 에러가 출력 됐습니다.

node-pre-gyp ERR! Tried to download(404): https://github.com/kelektiv/node.bcrypt.js/releases/download/v1.0.2/bcrypt_lib-v1.0.2-node-v48-linux-x64.tar.gz

( 사실 오늘 회사에서 겪은 에러를 집에서 겪었으면 해서 npm install bcrypt 때렸더니 너무나 잘 작동해가지고 걍 에러메시지 다른데서 긁어옴 )

에러에 대해서 검색좀 해보니까 bcrypt npm 페이지에서 다음과 같이 해결하랍니다.

대충 이 페이지 참고하세요. 라는 뜻

그러다 문득 node-gyp이 뭐하는 놈이길래 나의 개발흐름을 끊어버렸는지 화가 나서 node-gyp에 대해서 알아보기로 마음을 먹었습니다.

node-gyp이 뭔데

node-gyp... 진짜 처음 봤습니다. 제가 개발조무사라서 그런걸까요.
모르겠으니 일단 구글에 검색하고 npm 사이트 봤습니다. 일단 모두 영어니 gpt에게 번역을 요청해봅시다.

GPT-4o라고 다양한 언어를 학습시킨 새로운 모델이 나왔다길래 바로 돌려봤습니다.

text

그렇답니다. 더 찾아본 정보와 함께 요약하자면...
1. Node에서 c계열로 작성된 놈 돌리고 싶음? 쓰셈
2. node-gyp은 깐깐한 친구라 install하려면 준비물이 많이 필요함.
3. 가끔 고질적인 성능 이슈를 겪는 친구들이 이 라이브러리를 의존해요. ( bcrypt도 그러함 )

text

흠... 2번이 좀 짜치긴하지만 그래도 node-gyp install 시도는 해봅시다.
여기서 포기하면 평생 개발조무사로 살아야 할 것입니다.

text

무슨 준비단계에서부터 옵션이 있어

뜬금 없는 windows-build-tools를 인스톨하고 쓰랍니다.
node-gyp은 python과 windows-build-tools를 의존하고 있기 때문이랍니다.
여기서 제 본능이 그만하고 다른 걸 알아보는게 어떠냐고 신호를 보내지만 한 걸음만 더 다가가봅시다.

text

딸깍... 딸깍...

아니 이런 windows-build-tools이 인스톨이 안되지 뭡니까? 세상에...
다음과 같은 에러를 내뱉고야 말았습니다.

npm WARN config production Use `--omit=dev` instead.
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated windows-build-tools@5.2.2: Node.js now includes build tools for Windows. You probably no longer need this tool. See https://github.com/felixrieseberg/windows-build-tools for details.
npm ERR! code 1
npm ERR! path C:\Users\user\AppData\Roaming\npm\node_modules\windows-build-tools
npm ERR! command failed
npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node ./dist/index.js
Downloading python-2.7.15.amd64.msi
npm ERR! [============================================>] 100.0% of 20.2 MB (20.2 MB/s)
npm ERR! Downloaded python-2.7.15.amd64.msi. Saved to C:\Users\user\.windows-build-tools\python-2.7.15.amd64.msi.
Downloading vs_BuildTools.exe
npm ERR! [============================================>] 100.0% of 1.12 MB (747 kB/s)
npm ERR! Downloaded vs_BuildTools.exe. Saved to C:\Users\user\.windows-build-tools\vs_BuildTools.exe.
npm ERR!
npm ERR! Starting installation...
npm ERR! Downloading installers failed. Error: TypeError: 'process.env' only accepts a configurable, writable, and enumerable data descriptor
npm ERR!     at Function.defineProperty (<anonymous>)
npm ERR!     at Object.removePath (C:\Users\user\AppData\Roaming\npm\node_modules\windows-build-tools\dist\utils\remove-path.js:11:12)
npm ERR!     at Object.install (C:\Users\user\AppData\Roaming\npm\node_modules\windows-build-tools\dist\install\index.js:29:19)
npm ERR!     at C:\Users\user\AppData\Roaming\npm\node_modules\windows-build-tools\dist\start.js:17:19
npm ERR!     at Object.download (C:\Users\user\AppData\Roaming\npm\node_modules\windows-build-tools\dist\download.js:35:5)
npm ERR!     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
npm ERR!     at async Object.aquireInstallers (C:\Users\user\AppData\Roaming\npm\node_modules\windows-build-tools\dist\aquire-installers.js:32:13) {
npm ERR!   code: 'ERR_INVALID_OBJECT_DEFINE_PROPERTY'
npm ERR! }
npm ERR! windows-build-tools will now exit.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\user\AppData\Local\npm-cache\_logs\2024-05-14T11_55_23_714Z-debug-0.log

하지만 에러메시지에선 다음과 같은 다잉메시지를 남겼습니다.
1. 이 친구는 더이상 지원하지 않는 라이브러리를 많이 의존하고
2. 얘는 죽었음. (npm ERR! windows-build-tools will now exit.)
= 너는 삽질했다. 맞습니다. 삽질이었던 거 같습니다.

+ 사실 더 많은 자료를 봤었는데 2020년 쯤 블로그글에서 "window와 node버젼에 맞는 windows_build_tools를 설치하면 됩니다." 라는 글도 있었습니다. GPT도 없던 그 시절 개발자님들 존경합니다.

그래서 어케 해결함?

npm install bcryptjs

bcryptjs 라는 놈 쓰면 됩니다.

??? : 아니 그런 놈들은 보통 근본없거나, 문제있거나, 느리지 않음?
??? : 아니 보니까 Last publish가 7 years ago인데 써도 되는 거 맞음?
??? : 아니 그러다가 평생 개발조무사로 살게 된다고 어쩌구 저쩌구 궁시렁....( 난 개발조무사 할래 )

text 2017년도부터 bcryptjs 압승

그래도 bcryptjs가 bcrypt보다 30%정도 느리답니다. bcrypt가 아무런 조치 없이 잘 작동한다면 bcrypt를 사용하는게 개이득입니다.
만약 bcrypt가 install이 안돼요 ㅠㅠ 같은 운이 좋지 않은 상황에 걸리셨다면
공수를 들여 성능을 챙길지 개발속도를 챙길지를 적절히 판단하셔서 쓰시면 될 거 같습니다.

특히 해싱과 같이 자주 쓰이고, 반복하는 횟수가 많은 친구들이 30% 정도의 성능 우위를 갖는건 엄청 크니까요.
( bcrypt의 gensalt() 함수의 saltRound 기본 값은 10이고 이는 2^10 = 1024번만큼 반복하여 최종적으로 해싱한다는 뜻입니다. 값이 높을수록 보안에 유리하니 필요하면 더 돌리기도 하겠죠. )

나기 전에 잠깐.
집에서는 bcrypt가 너무 잘 깔리고 잘 사용되길래 뭔가 다른가? 하고 봤더니
node-gyp이 아니라 node-pre-gyp을 의존하더라구요.( 버전 이슈 인가? )
두 개가 다른 거 같긴한데 귀찮으니 여기까지만 알아보겠습니다.
+ node-gpy과 비슷한 역할을 하는 파이썬용 node-gyp도 있더라구요.

profile
네카라쿠배당토직야두몰센 가고싶다.

0개의 댓글