패키지 매니저는 항상 습관적으로 npm을 썼었는데 이번에 사내 신규 프로젝트에서 pnpm을 쓰기로 하면서
여러 패키지 매니저들의 차이와 어떤 상황에서 쓰면 좋을 지에 대해 알아보게 되었다.
Package Manager?
패키지 매니저는 개발에 필요한 다양한 패키지를 설치하고 또 수정하고 업데이트하는 등의 작업을 편리하게 도와주는 도구라고 할 수 있다.
자바스크립트로 프로젝트를 진행하다 보면 해당 프로젝트에 필요한 다양한 패키지들이 있고 이 패키지들을 설치하고 또 관리해야 하는 경우가 있는데, 이 패키지들을 의존성 있게 관리해 주는 것이 바로 패키지 매니저다.
많이 쓰이는 것으로 npm, yarn이 있고 pnpm, yarn berry 도 새롭게 출시되었다.
즉, 패키지 매니저는 프로젝트에 사용되는 패키지를 쉽게 관리하고 설치해주는 하나의 도구와 같다.
1. npm
- npm은 노드 패키지 매니저로서 JavaScript 패키지를 관리하는 가장 기본적인 도구이자 패키지 매니저의 시초
- 노드.js 설치 시 함께 제공되므로 추가적인 설정 없이 사용 가능
- 의존성 트리를 단순하게 유지하며, node_modules 디렉터리에 패키지를 설치
- 보안, 속도, 의존성 문제로 npm 을 개선한 yarn이 새롭게 나오게 됨
npm의 경우에는 프로젝트의 의존성을 수동으로 다운로드해야 했던 불편함을 개선한 패키지 매니저로 node.js에 내장이 되어 있기 때문에 추가적인 설치가 필요하지 않다. 즉, 별도의 설치가 필요 없다는 것이 npm의 큰 장점이기도 하다.
더불어서, npm에는 직접 개발한 모듈뿐만 아니라 다른 사용자들이 만들어 놓은 다양한 모듈이 있기 때문에 이를 다운로드로 쉽게 사용할 수 있다는 특징이 있다.
npm의 가장 큰 특징이자 단점은, 아무래도 npm이 패키지 매니저의 시초와 같기 때문에 오랜 시간 아주 많은 사용자들이 사용을 해와서 생태계가 굉장히 풍부하다는 점이다.
다만, 앞서 말했듯이 npm의 경우 패키지들을 서로 의존하도록 하기 때문에 만약 하나의 문제가 발생한다면 다른 것들에도 문제가 발생할 수 있다는 단점이 있다. 따라서, 이 부분을 관리하기 위해서는 package.json이 필요하다.
2. yarn
- Yarn은 npm의 대안으로 등장한 패키지 매니저
- npm보다 빠르고 안정적인 패키지 설치를 제공
- 캐시 기능을 통해 반복적인 패키지 설치를 최적화
- 보다 효율적인 의존성 관리를 위해 Yarn.lock 파일을 사용
yarn은 기존의 npm의 단점을 보완하면서 등장한 패키지 매니저로, 2017년에 페이스북 개발자들과 구글 개발자들이 함께 내놓은 패키지 매니저다.
사실상 npm과 큰 차이점도 없고 프로세스도 거의 동일하지만, 아주 큰 차이점은 보안이다.
npm은 보안의 문제가 큰 단점이었는데 yarn에서는 npm의 취약점이었던 보안 문제를 해결해서 보다 안전성을 보장하고 있다는 아주 큰 장점을 가지고 있다.
더불어서, yarn의 또 다른 장점으로는 빠른 속도다.
여러 개의 패키지를 순차적으로 설치를 하는 것이 아니라 병렬적으로 설치를 해주기 때문에 속도 측면에서도 npm보다 개선된 모습을 보여주고 있다.
이러한 이유로 최근에는 npm보다 yarn을 더 많이 사용하고 있는 추세이다.
추가적으로, yarn berry라는 상위 버전을 통해서 여러 개발과 개선이 이루어지고 있는데 아직까지는 yarn berry보다는 yarn을 더 많이 사용하고 있는 것 같다!
yarn의 경우 npm 과는 달리 별도의 설치가 필요하기 때문에 npm을 통해 먼저 설치를 해야 한다.
npm install -g yarn
컴퓨터 모두에서 yarn을 사용할 수 있도록 global 키워드를 사용해서 설치를 해준다.
설치 후에는 yarn, yarn init 명령어를 통해서 yarn 폴더를 생성한 후 설정을 해주면 된다.
3. pnpm
- pnpm은 npm 및 Yarn의 대안으로 등장한 패키지 매니저
- 하나의 패키지를 여러 프로젝트에서 공유할 수 있도록 공유 패키지 설치를 지원
- 의존성을 공유하고, 중복 설치를 최소화하여 디스크 공간을 절약
pnpm은 2017년에 Zoltan Kochan이라는 개발자가 내놓은 패키지 매니저로 "performant npm"의 약자
즉, 효율적인 npm이라는 의미인데 말 그대로 효율성이라는 장점을 가진 패키지 매니저이다.
pnpm의 경우에는 프로젝트별로 node_modules에 매번 패키지를 설치했던 것과는 달리 global 저장소에 패키지를 한 번만 저장함으로써 저장 공간을 절약할 수 있다는 아주 큰 장점을 가지고 있다.
즉, pnpm을 사용한다면 똑같은 라이브러리를 중복해서 설치할 필요가 없다는 의미다.
다만, 주의할 점은 특정 패키지를 한 번만 설치하기 때문에 프로젝트별로 연결을 해놓으면 호환 문제가 발생할 수 있다.
따라서 프로젝트끼리 호한 문제가 발생하지 않도록 버전 관리를 반드시 해줄 필요가 있다.
- pnpm 설치
npm i -g pnpm
- 패키지 설치
pnpm install
- 패키지 추가
pnpm add <pkg>
공식 문서 참고
https://pnpm.io/ko/installation
4. yarn berry
- Yarn의 최신 버전으로서 전체적인 아키텍처가 변경됨
- 기존의 Yarn 과는 다르게 monorepo 구조를 지원
- Plug'n'Play(PnP) 시스템을 도입하여 node_modules 디렉터리를 사용하지 않고 의존성을 관리
- 더 빠른 설치 속도와 효율적인 캐시 기능을 제공
- 다양한 플러그인을 지원하여 개발 환경을 유연하게 확장 가능
신규 프로젝트에선 pnpm 으로 선택을 했지만 yarn berry도 모노레포 지원, Zero-install 등 장점들이 많아 보여 빠른 시일 내에 yarn berry도 다음 기회에 사용해보고 싶다.