[DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead. 에러를 만났을 때

Aain·2023년 12월 26일

JS 백엔드

목록 보기
1/2

DeprecationWarning: The punycode module is deprecated. 경고가 뜨는 이유

const mongoose = require("mongoose");

위 코드로 mongoose를 불러오려고 하자 아래와 같은 경고가 떴다.

[DEP0040] DeprecationWarning: The punycode module is deprecated. Please use a userland alternative instead.
(Use node --trace-deprecation ... to show where the warning was created)

위 warning은 최신버전의 node.js에서는 punycode라는 모듈이 삭제되었다는 의미이다.
이 경고 메시지를 보지 않으려면 node.js의 버전을 낮출 필요가 있다.

먼저 나의 node.js 버전을 확인해본다.

node -v


내 경우 현재 node.js의 버전은 21.1.0 이다. 이보다 낮은 버전으로 낮춰보기로 한다.



의존성 확인하기

여기서 갑자기 문제가 된 punycode라는 모듈을 어느 패키지가 사용하고 있는지 궁금해졌다. 그래서 터미널에 아래와 같이 입력한다.

의존성에 대한 내용이 궁금하지 않다면 이 부분은 건너뛴다.

npm ls --depth=5

현재 프로젝트의 의존성을 깊이 5까지 확인하는 명령어이다.

결과는 아래와 같았다.

mongodbmongoose가 각각 punycode에 의존성을 가지고 있는 것을 확인할 수 있다.




node.js 버전 확인 & 낮은 버전 설치

node.js의 버전을 낮추기 위해 nvm을 설치한다.
nvm은 Node Version Manager로 node.js의 버전을 컨트롤해주는 도구이다.

nvm이 이미 설치 되어 있다면 이 과정은 건너뛴다. nvm -v으로 nvm이 설치되어 있는지 확인할 수 있다.

brew install nvm

brew로 nvm을 설치할 수 있는데 설치 이후에 환경변수 설정이 필요하다. 그 부분에 대해서는 이 글에서 다루지 않으니 필요하다면 다른 구글 검색 결과를 참조하자.

nvm 설치가 완료되었다면 이제 설치가능한 node.js의 버전을 확인해보자. 아래와 같이 입력한다.

nvm ls-remote

이렇게 설치가능한 목록들이 나오는데 나는 다른 블로그에서 본 안정적으로 돌아가는 20.9.0 버전을 설치하기로 했다.

> nvm install 20.9.0

Downloading and installing node v21.5.0...
Downloading https://nodejs.org/dist/v21.5.0/node-v21.5.0-darwin-arm64.tar.xz...
####################################################################################################### 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v20.9.0 (npm v10.1.0)

맨 마지막줄에 방금 설치한 node v20.9.0 버전으로 바뀌었다는 메세지가 나온다.

하는 김에 가장 최신버전인 21.5.0도 설치해보자. 어차피 node.js 버전 매니징을 위해 연습할 겸 설치해본다.

> nvm install 21.5.0

Downloading and installing node v21.5.0...
Downloading https://nodejs.org/dist/v21.5.0/node-v21.5.0-darwin-arm64.tar.xz...
####################################################################################################### 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v21.5.0 (npm v10.2.4)

설치와 동시에 node v21.5.0으로 바뀌었다.

이제 버전을 변경해보자.



nvm으로 node.js 버전 변경하기

nvm이 변경해줄 수 있는 node.js의 버전 목록을 확인해보자. 설치가 되어 있는 node들의 목록이 뜬다.

nvm ls


위와 같이 변경가능한 버전들의 목록이 출력된다. 캡쳐를 보면 현재 나는 20.9.0과 21.5.0 그리고 마지막으로 system을 선택할 수 있다. (개인 환경에 따라 system은 없을 수도 있다.)

이 system은 nvm밖에서 설정되어 있는 node.js버전이다.
보통 nvm을 설치하기 전에는 homebrew로 node.js를 설치해서 사용했을텐데 그 homebrew로 설정해둔 node.js의 버전이 system이다.

현재 사용중인 v21.5.0은 punycode 모듈이 없다는 warning 메시지를 출력하므로 v20.9.0 버전으로 낮춰보자.

nvm use 20.9.0

그리고 node의 버전을 확인해보자.

node -v


변경이 잘 되었다.

node.js의 버전을 nvm의 관리하에 두기 위해서는 이렇게 nvm을 통해서 node.js를 설치해야 한다.



VScode에서 launch.json으로 환경 설정해주기

그런데 문제가 있다. 터미널에서 위와 같이 버전을 잘 바꿔주고 VS code로 와서 코드를 실행하면 여전히 DEBUG CONSOLE에서는 Warning이 뜬다.

해결방법은 launch.json 파일에 node.js의 버전을 명시해주는 것이다. launch.json파일은 디버깅 및 실행 환경설정파일이다. 처음에는 이 파일이 존재하지 않으므로 따로 생성해주어야 한다.

launch.json파일을 생성하기 위해 VScode의 왼쪽 메뉴바에서 벌레모양 아이콘(Run and Debug)를 클릭한다.

그럼 아래 이미지와 같이 뜨는데 노란 네모박스 안의 create a launch.json file.을 클릭하여 launch.json파일을 생성한다.

생성된 launch.json 파일을 열어서 제일 아래줄에 "runtimeVersion": "20.9.0"이 부분을 삽입한다. 실행환경의 버전을 정해주는 것이다.

그러면 아래와 같이 된다.

저장하고 다시 아까의 코드를 실행해보면 이제 DEBUG CONSOLE도 20.9.0버전의 node.js로 돌아가는 것을 볼 수 있다.

왼쪽의 탐색창을 보면 launch.json파일이 .vscode폴더 안에 존재하는 것을 볼 수 있다. 그 말은 이 설정은 이 프로젝트 안에서만 유효하다는 것이다.




여기서부터는 알아두면 좋은 내용으로 몰라도 상관없다.

homebrew로 설치한 node.js를 nvm으로 사용하기

만약 homebrew로 node.js를 설치한다면 어떻게 될까? brew로 설치한 node.js는 nvm과 따로 관리된다.

homebrew로 설치가능한 node.js의 버전을 확인하기 위해 아래와 같이 입력한다.

brew search nodejs

아래와 같이 설치가능한 node.js의 목록이 뜨는데 nvm ls-remote으로 확인한 nvm으로 설치가능한 node.js의 목록보다 현저하게 적은 것을 볼 수 있다.

brew로 설치한 node.js와 nvm으로 설치한 node.js의 관리가 어떻게 이루어지는지 확인하기 위해 node@16을 brew로 설치해보자.

brew install node@16

brew로 다시 확인해보면 방금 설치한 node@16에 체크표시가 되어 있다.

brew search nodejs

하지만 node.js의 버전을 확인해보면 방금 brew로 설치한 node@16이 아닌 nvm이 관리하는 버전이 뜰 것이다.

node -v


분명히 방금 homebrew로 node@16을 설치했는데 nvm이 관리하는 버전(v20.9.0)이 뜬다.

이는 homebrew로 설치한 node는 nvm에서 관리하는 node들과 구분되기 때문인 듯 하다.

homebrew로 설치한 node@16을 사용하고 싶다면 아래와 같이 입력한다.

  1. 먼저 brew에서 설치한 node.js의 링크를 연결해준다. 이렇게 하면 nvm ls-remote를 했을 때 brew로 설치한 node.js가 system으로 뜬다.
brew link --overwrite node@16

이제 nvm ls를 입력하면 system이 추가된 것이 보인다.
system을 사용하기로 한다.

nvm use system

이제 node -v로 node버전을 확인하면 brew의 node@16으로 잘 변경된 것을 볼 수 있다.

nvm ls

이렇게 brew가 관리하는 node.js와 nvm이 관리하는 node.js를 오갈 수 있다.




혼자 공부하면서 알아낸 사실들을 기록하는 곳이라 틀린 정보나 오류가 있을 수 있습니다. 지적해주시면 감사히 수정하겠습니다. :)

profile
{happiness: true}

0개의 댓글