개요 🔔

프로젝트를 진행하다보면,
종속성(Package) 을 설치 해야하는 경우가 다반수 이다.

그리고 npm install 을 통해
기존에 의존하고 있는 패키지들이 ./node_modules 안에 담기는 것을 확인할 수 있다.

만약 로컬 환경에서 개발 중,
설치한 의존성들이 충돌하여 캐시를 제거하고
.lock 파일과 ./node_modules 폴더를 제거한 기억이 있지 않은가 ❔
그리고,
이를 제거할 때 시간이 다소 오래 소요되진 않았던가 ❔
위와같은 문제를 해결하기 위해 패키지 매니저 들은 점차 보완이 되고 있으며,
pnpm 까지 등장한 것 이다 ❗
라는 포문으로 해당 포스팅을 시작하려 한다.


패키지 매니저란,
개발에 필요한 패키지를 설치하고 수정 및 업데이트 등의 작업을 편리하게 도와주는 도구 라고 할 수 있다.
JS 로 프로젝트를 진행하다 보면,
필요한 다양한 패키지들을 설치하고 관리해야 하는 경우가 있는데
이 패키지들을 의존성 있게 관리 해 주는 것이 패키지 매니저 이다.

즉, 패키지 매니저는 👉 프로젝트에 사용되는 패키지를 쉽게 관리하고 설치 해 주는 하나의 도구 ❗


Package Manager

가장 많이 사용되는 패키지 매니저로는,
npm, yarn, pnpm 이 있는데,
패키지 매니저들에 대해 간단한 특징과 어떤 장점이 있어 상황에 맞게 고를 수 있게 정리 해 보고자 한다.

1️⃣ npm

npm 은,
패키지 매니저의 시초이며 프로젝트의 의존성을 수동을 설치해야하는 번거로움을 해결하기 위해 등장했다.
node.js 에 내장되어 있어 추가적인 설치가 필요하지 않다.

즉, 별도의 설치가 필요가 없다는 것이 npm 의 가장 큰 장점이기도 하다.

또한,
가장 오래된 시초 인 만큼
직접 개발한 모듈뿐만 아니라 다른 사용자들이 불편함을 개선하고자 만들어 놓은 다양한 패키지들이 있어
비교적 생태계에서 얻을 수 있는 정보가 풍부하다는 장점이 있다.

하지만,
npm 의 경우 패키지들이 서로 의존하는 상관관계를 맺고 있기 때문에
하나의 패키지에서 문제가 발생한다면,
다른 패키지에서도 문제가 발생할 수 있다는 단점 😥 을 가지고 있다.

이를 관리하기 위해 package.json 파일이 필요하다.

npm init


2️⃣ yarn

yarn 의 경우,
기존의 npm 의 문제점 및 단점을 보완하여 등장한 패키지 매니저
페이스북과 구글 개발자들이 협업하여 탄생한 패키지 매니저 이다.

사실 두 패키지 매니저는 큰 차이가 없고, 프로세스도 거의 유사하지만
가장 큰 차이는 보안 이다.

npm 의 가장 큰 단점은 보안 이었는데,
이를 보완하여 탄생한 yarn 이며,
npm 의 취약점을 공략하여 보다 안정성을 보장한다는 장점이 있다.

1️⃣ Integrity 체크 👉 다운로드 한 패키지의 무결성을 체크 ✔
2️⃣ Lock 파일의 정확성 👉 yarn.lock 파일을 통해 보다 정확한 의존성 해결
3️⃣ 프록시 서버 지원 👉 패키지 다운로드 시 프록시 서버 를 통해 다운로드 하므로 외부 사용자의 공격에 보안 ⬆
4️⃣ 공통 의존성 최적화 👉 다수의 프로젝트에서 동일한 패키지를 공유함으로 인한 의존성 효율 최적화
5️⃣ 더 빠른 의존성 해결 👉 최적화된 알고리즘을 통해 속도 ⬆
6️⃣ 개발 환경에서 Offline 모드 👉 한번에 모든 패키지를 설치하고, 이후 저장된 캐시를 통해 오프라인 설치 지원 ✔

추가로,
yarn 의 매력적인 장점 요소로는 속도 이다.
여러 개의 패키지를 순차적으로 설치하는 것이 아닌,
병렬적으로 설치함으로 인해 속도 측면에서 npm 보다 우위의 장점을 보여주고 있다.

이러한 이유로 최근에는 npm 보다 yarn 을 더 많이 선호하는 추세이며,
yarn berry 라는 yarn 의 상위 버전을 통해 다양한 개발과 개선점이 보완되고 있는데,
아직까지는 yarn berry 보다는 yarn 을 더 많이 사용하고 있는 것 같다.

npm install -g yarn
yarn init

yarn 의 경우 npm 에 의존하기 때문에, npm 을 통해 먼저 설치 해 주어야 하며,
로컬 전역에서 사용 가능하도록 -g 옵션을 주어 global 설치를 해 준다.


3️⃣ pnpm

pnpm 은,
2017 년에 개발된 패키지 매니저로,
Performant npm(Performent Node Package Manager) 의 약자이다.
즉, 효율적인 npm 이라는 의미로
npm 이 가진 장점에 효율성을 추가로 더해 등장한 패키지 매니저 이다.

pnpm 의 경우,
프로젝트 별로 생성되는 ./node_modules 에 매번 패키지를 설치했던 것과는 달리
global 저장소에 패키지를 한 번만 저장함으로 인해 저장 공간을 절약할 수 있다는 아주 큰 장점을 가지고 있다.

즉, 똑같은 라이브러리를 매번 중복하여 설치할 필요가 없다는 의미이다.
다만, 특정 패키지를 한 번만 설치하기 때문에
프로젝트별로 연결을 해 놓으면 호환 에러가 발생할 가능성이 존재한다.
👉 버전관리 필수

이를 통해 빠르고, 효율적인 디스크 관리를 할 수 있기 때문에
최근 pnpm 은 2021 년 다운로드 수의 5배 이상을 넘긴것을 확인할 수 있다.

npm install -g pnpm
pnpm init

yarn 과 동일하게 pnpm 을 전역(global) 에서 사용할 수 있도록 먼저 설치 해 준다.


모노 레포 🚝

모노 레포란,
여러 프로젝트 혹은 패키지를 단일 저장소에서 관리하는 방식을 의미한다.

npm, yarn 과 비교했을 때
pnpm 로 추가한 패키지는 ./node_modules 폴더에 중복으로 저장되지 않는다.

예를들어 sample_1, sample_2, sample_n 이라는 프로젝트가 존재하고,
각 프로젝트는 ./node_modules 하위에 pkg_1 이라는 같은 파일을 모두 가지고 있다.

이는 중복된 메모리를 사용하여 불필요한 리소스가 발생함을 의미할 수 있다.

반면에 pnpm 의 경우,
별도의 저장소(.pnpm_store) 를 가지고 있고,
각 프로젝트에 존재하는 pkg_1 파일의 복사본(Symbolic link)을 만들어
이를 별도의 저장소에서 중앙으로 관리한다.

이를 통해
중복된 6MB (2MB * 3) 이라는 메모리로부터 중복된 저장공간을 효율화 시킬 수 있다.
👉 프로젝트가 많을수록 이 효과는 더욱 커지게 된다.

(공식 github 참조 👇)
https://github.com/pnpm/pnpm


속도 비교 💨

pnpm 의 공식 github 레포에 따르면,
pnpm 은, 다른 패키지 매니저 보다 최대 2배 이상 빠르다고 나와 있다.

(공식 github 참조 👇)
https://github.com/pnpm/pnpm

아래는 공식 레포에 게시된 각 패키지 매니저들이
명령어를 처리하는 속도에 대한 그래프를 시각적으로 나타낸 표 이며,
가로축은 실행 시간을 의미한다.

그래프를 확인 해 보면,
비 정상적으로 속도적인 부분에서 우위를 다루는 것을 확인할 수 있는데,
이는 의존성을 설치하는 명령어가 기존의 직렬 방식이 아닌 병렬 방식으로 수행되기 때문이다.


사실,
패키지 매니저 들은 현재 사용해도 전혀 손색이 없을 정도로 안정적인 상태이고,
계속해서 보완과 유지보수를 통해 업데이트를 하고 있다.
따라서
패키지 매니저 들을 직접 사용 해 보고,
본인 상황에 맞는 패키지 매니저 를 선택하여 프로젝트를 시작하는 것이 가장 현명한 방법일것 같다.


Reference 🌊

https://github.com/pnpm/pnpm
https://engineering.ab180.co/stories/yarn-to-pnpm
https://devscb.tistory.com/135
https://velog.io/@sebinn/%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%A7%A4%EB%8B%88%EC%A0%80-%EB%B9%84%EA%B5%90-npm-yarn-pnpm