로컬에서 npm 패키지를 설치할 때는 문제가 없었으나 원격 서버 환경에서 npm 패키지를 설치에 실패하는 이슈가 있었습니다.
원인부터 말씀드리자면 로컬에서는 node 20 버전을 사용했고 원격 서버에서는 12 버전을 사용했는데 npm 패키지 중 16버전 이상을 요구하는 패키지가 있어서 설치에 실패했습니다.
우선 원격 서버에서 nodejs를 설치한 뒤 버전을 확인하는 과정입니다.
apt update
apt install nodejs
node -v
nodejs를 설치하고 버전을 출력해보면 12버전이 나옵니다.

2024년 11월 14일 기준으로 버전이 22.11.0인 것을 확인하면 상당히 낮은 버전입니다.
일단 yarn을 설치합니다.
yarn을 설치하기 위해 npm을 설치해주고 yarn을 글로벌로 설치합니다.
apt update
apt install nodejs
node -v
yarn 명령어를 입력했을 때 다음과 같은 오류가 뜬다면 원격 서버에 재접속 해줍니다.

이제 yarn install을 해준다면 다음과 같은 에러가 발생합니다.

lib0@0.2.98 라이브러리를 사용하려면 노드의 버전이 16버전 이상이어야 하는데 12버전이라는 에러가 발생합니다.
그렇다면 왜 최신 버전이 아닌 12버전으로 설치되는 걸까요?
먼저 apt에 대해 알아봅시다.
apt란 Advanced Package Tool의 약자로 Debian 시스템에 포함된 핵심 도구들의 집합입니다.
즉, 우분투에서 쓰이는 데비안 계열의 패키지를 관리하는데 쓰이는 도구입니다.
apt를 사용하면 레포지토리라는 저장소를 통해 패키지들을 쉽게 관리할 수 있습니다.
기존에는 debian 기반 시스템에서 패키지를 관리하는 데 사용되었던 dpkg를 통해서 패키지를 관리할 수 있었습니다.
하지만 의존성 문제를 해결하지 못하여 apt를 통해 보완할 수 있었습니다.
레포지토리에는 패키지를 다운로드 할 수 있는 원격 저장소에 대한 정보가 담겨있습니다.
즉 nodejs를 설치할 때 12버전으로 설치된 이유는 제가 사용하는 운영체제의 레포지토리에 nodejs의 12버전이 존재하기 때문입니다.
제가 사용하는 운영체제는 ubuntu 22.04.4 LTS입니다.
아래처럼 packages.ubuntu.com 사이트에서 패키지를 검색하면 해당 운영체제가 지원하는 패키지의 버전 정보를 확인할 수 있습니다.
https://packages.ubuntu.com/search?keywords=nodejs

node 버전이 12.22.9인 것을 확인할 수 있습니다.
처음에는 단순히 node의 최신 버전이 설치될 것이라고 생각하여 node를 설치하고 버전을 확인하지 않았던 것이 문제의 원인이었습니다.
node 버전을 최신 버전으로 올리려면 번거롭지만 수동으로 설치해야 합니다.
버전 업그레이드 하는 방법에는 다양한 방법들이 있습니다.
첫 번째로 nodesource repository를 사용하는 방법입니다. https://deb.nodesource.com/
Nodesource Node.js DEB
Welcome to Node.js DEB repository This repository distributes the DEB packages for Node.js binaries for a comprehensive "How To Install" guide, we invite you to visit our GitHub repository Distributions
deb.nodesource.com
node 20버전으로 업그레이드 하고 싶다면 node 최신 버전을 제공해주는 nodesource 레포지토리를 연결해줍니다.
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
레포지토리를 연결해줬다면 apt를 통해 버전을 업그레이드 해주면 됩니다.
apt upgrade nodejs
node -v

docker 도입
지금까지 docker를 사용하지 않았으나 로컬 환경에서의 동작이 원격 환경에서 동작하지 않는 것을 보고 docker를 도입하기로 결정했습니다.
docker를 도입하여 서버 자체를 node 버전을 고정한 채로 container 환경에서 실행하였고 로컬 환경에서의 동작이 원격 환경에서의 동작을 보장할 수 있게 되었습니다.