
프로젝트를 진행하게 되면 프로젝트에 필요한 다양한 패키지들을 설치하고, 필요에 따라서 수정, 업데이트 및 삭제까지 관리해야 하는데 이 작업들을 편하게 할 수 있도록 도와주는 친구이다.
대표적인 패키지 매니저는 npm, yarn, pnpm이 있다.
프로젝트에서 사용하고 있는 패키지들은 전부 package.json에 명시되어 있다.

이 package.json파일을 가지고 있다면, 언제 어디서든 같은 환경에서 빌드할 수 있게 된다.
그래서 Github에서 repository를 clone한다음 npm install 또는 yarn install 명령어를 이용하여 개발자가 의도한 환경을 세팅한 뒤 실행시킬 수 있게 되는 것이다.
npm은 node.js에 내장되어있어 추가적인 설치가 필요하지 않다. 별도의 추가 설치 과정 없이 바로 사용할 수 있다는 장점이 있다.
하지만 단점도 존재했는데, 속도와 보안이다.
npm은 여러 개의 패키지가 있다면 순차적으로 설치를 진행한다.
-> 버전7 이상에서 workspaces 지원과 병렬 설치 방식을 도입하여 yarn과의 속도 차이는 많이 줄어들었다. 하지만 아직 yarn보다는 상대적으로 느린건 사실이다.
보안적인 측면에서도 현재는 package-lock.json파일이 등장하여 개선되었다. 초기에는 package.json파일만 참고하여 패키지들을 설치하다 보니 서로 의존하는 패키지가 있다면 같이 설치가 되었다. 그러다보니 하나의 패키지에서 문제가 발생하게 되면 그 패키지에 의존하던 다른 패키지에서도 문제가 발생할 수 있었다.
yarn은 기존 npm의 단점을 보완하여 등장했다.
일단 가장 큰 차이는 속도
패키지의 개수가 많을 때, 순차적으로 설치하는 npm과는 달리 병렬적으로 설치를 하기 때문에 속도측면에서 많이 개선이 되었다.(하지만 npm도 꾸준하게 발전함에 따라서 현재는 큰 차이가 없다..)
그리고 보안에서도 차이가 있는데, package.json만을 참고하는 기존 npm과는 달리 yarn.lock 파일을 참고하여 설치하기때문에 모든 환경에서 개발자가 의도한 버전의 패키지를 설치하는 것을 보장하기에 버전의 차이로 인해 생기는 버그를 방지해줄 수 있다.
"performant npm"의 약자로 말 그대로 효율적인 npm
package.json을 프로젝트 별로 구분해야할 때(예를 들면 monorepo..) 프로젝트마다 같은 package를 설치해야하는 문제가 있는데 이를 global저장소에 package를 한 번만 저장하면서 저장 공간 및 프로젝트의 크기를 절약할 수 있는 큰 장점이 있다. 추가적으로 각각의 프로젝트에 필요한 패키지만을 추가할수도 있어 규모가 큰 프로젝트에 아주 강점을 보인다.
나는 yarn을 주로 사용한다. 비록 처음 개발하는 사람들이나 개발환경을 세팅하는사람들은 npm intall -g yarn 또는 brew install yarn처럼 설치해주어야하는 번거로움이 있지만 그래도 yarn이 좋다. 이유는.. 모름..
사실 지금 시점에서 npm이 좋다 yarn이 좋다는 의미가 없는 것 같다. 취향따라 선택하고 프로젝트 특성에 따라 pnpm을 고려하는것도 괜찮아보인다.
예를 들어, 단일 프로젝트에서는 npm이나 Yarn이 적합할 수 있고, monorepo 환경이나 대규모 프로젝트에서는 pnpm이 더 효율적일 수 있다.
내 결론: 의미없다.. 취향에 맞는 걸 사용하자..
하지만 yarn.lock 파일을 사용할 때, 패키지 버전 문제가 발생하여 모듈이 업데이트되면 기존에 지원했던 기능들을 사용하지 못할 수도 있다. 이는 의존성이 있는 패키지 버전이 고정되어 있기 때문인데, 이러한 상황에서는 npm이 더 나은 선택지가 될 수도 있다.