npm 과 yarn 은 뭐가 다를까 ?
개요

이전 시간에 npm 과 npx 에 대해 비교해봤다. 이번에는 npm과 yarn 에 대해 비교해본다. 평소에 JS 프로젝트를 진행하면서 npm 으로 패키지를 관리하는데, 뭔가 무겁다 정도의 느낌을 받을 정도로 개발을 해왔던, 조금이라도 그런 느낌을 받았다면 이 포스팅이 조금은 도움이 되리라.
본론
📍 npm

이전 시간에 "정의"에 대해서는 정리를 하였으니 간략하게.
- Node Package Manager(Javascript Node)
- Node.js 로 만들어진 모듈을 웹에서 받아서 설치하고 관리해주는 프로그램
- 온라인 데이터베이스(Registry)와 클라이언트(Node CLI)를 통해 접근 가능
장점 🔍
- 유용한 패키지들을 받아서 쉽게 사용가능
- 세계 최대 규모의 패키지들을 보유하고 있고 Node 생태계를 견고하게 해준다.
- 즉, 관련 커뮤니티도 이미 많이 활성화되어있어 접근성이 좋다.
단점 🔍
- 저장소의 취약한 보안이슈, 의존 패키지의 버저닝 이슈
- 패키지가 많아짐에 따라 빌드 성능이 떨어짐
📍 yarn

yarn 은 페이스북 에서 만든 역시, Javascript Package Manager 이다. 즉, npm 과 같은 기능을 수행한다. 그럼에도 yarn 이라는 것이 별도로 왜 탄생하였냐 ? yarn 은 기본적으로 npm 의 단점을 느꼈기 때문에 이를 향상시키기 위해 만들어진 매니징 툴이다. 여기서 말하는 npm의 단점으로는 크게 속도(performance), 안정성(stability), 보안성(security) 등이 있다.
속도(performance)
yarn은 다운받은 패키지 데이터를 캐시(cache)에 저장하여, 중복된 데이터는 다운로드 하지않고, 캐시에 저장된 파일을 활용함으로써, npm 에 비해 패키지 설치속도가 매우 빠르다.- 여러개의 패키지를 설치할 때 병렬로 처리하기 때문에 performance 와 speed가 증가된다. (npm 은 순차적)
React 설치를 예로 보자면

안정성(stability)/보안성(security)
- npm 은 패키지가 설치될 때 자동으로 코드와 의존성을 실행할 수 있도록 허용했다.
- 이 특징은 편리하면서도 안정성을 위협할 수 있다.
- 특히, 보장된 정책없이 등록한 패키지가 존재할 수 있다는 점에서 더욱 위험도가 높다.
- 반면, yarn은
yarn.lock이나package.json으로 부터 설치만 하면,yarn.lock은 모든 디바이스에서 같은 패키지를 설치하는 것을 보장하기 때문에 버전의 차이로 인한 버그를 방지할 수 있다.
📍 npm VS yarn
npm: Node를 설치하면 자동으로 설치된다.yarn: npm 을 설치하고 yarn을 설치해야한다.
npm install yarn --global
The Lock file
npm
package-lock.json파일을 생성한다.- 이 파일은 결정성과 단순성 사이의 균형 때문에 조금 더 복잡하다.
- 이러한 복잡성 때문에
package-lock.json파일은 다른 npm 버전에 대해 동일한node_modules폴더를 생성한다. - 모든 종속성(dependency)은
package-lock.json파일에 연관된 정확한 버전 번호를 갖고 있다.
yarn
- yarn은
yarn.lock파일을 생성한다. yarn.lock파일은 쉬운 병합에 도움이 된다.- 이 파일의 디자인 때문에 병합도 예측이 가능하다.
Output log
npm
- npm은 npm 명령의 방대한 출력 로그를 생성한다.
- 본질적으로 npm 이 하는 일에 대한 스택 추적의 뭉치이다.

yarn
- yarn 로그는 깨끗하고 시각적으로 구별 가능하며 간단하다.
- 이해를 돕기 위해 트리 형식으로 정렬된다.

Installing global dependencies
npm
npm install -g package_name@version_number
yarn
yarn global add package_name@version_number
Fetching packages
npm
- npm은 모든
npm install명렁을 통해 npm 레지스트리에서 종속성을 가져온다.
yarn
- yarn은 종속성을 로컬에 저장하고
yarn add명령을 통해 디스크에서 가져온다. - 종속성이 로컬에 있다고 가정한다.
npm 과 yarn 명령어 차이 & 공통


결론
npm, yarn 모두 Node 패키지 관리자 인 것은 알았다.
그럼, 무엇을 사용해야할까 ?
결론은, 상황에 맞게, 각자에게 편한 것을 사용하느 것이 가장 바름직하다.
yarn이 가시적으로npm보다 속도나 안정성이 뛰어났었다.(엄청난 차이는 아니었다.)- 하지만, npm 또한 몇년간에 발전을 거듭하며 단점을 보완했기 때문에 현재 npm/yarn의 performance와 stability 차이는 그리 크지 않다고 봐도 무방하다.(yarn 이 조금은 우세)
- 하지만, 여전히
yarn의 병렬적 패키지 설치로 인한 가벼움, 또한yarn.lock의 버전의 차이로 인한 버그 방지 등의 기능은 yarn이 npm 보다 더 좋은 툴이라고 설명하기 충분한 점이다. - 반대로, npm은 거대한 커뮤니티, 접근성 으로 인한 편리성과 확장성이라는 큰 장점을 가지고 있다.
둘의 장단점이 뚜렷하고 실질적인 성능에서는 yarn이 근소하게 앞서지만 만약 처음 Node 개발을 하는 사람이라면 npm 을 먼저 사용하는 것이 좋다고 본다. 이유는
- 먼저,
npm에 커뮤니티와 접근성의 소중함을 알고 - 이후에, 그럼에도
npm의 무거움의 느낌이 무엇인지 알게 되는 순간 yarn을 한번 사용해보면 좋을 것 같다는 생각을 한다.