본문 바로가기

Develog/Study

Node.js 패키지 매니저 선택(npm& yarn & pnpm 비교)

 
 
 

패키지 매니저란?

패키지 매니저는 애플리케이션의 의존적인 패키지를 관리해 준다.
라이브러리의 설치, 삭제, 업데이트등을 도와주고 여러 dependencies 환경에 설치하고 관리할 수 있게 해 준다.

0. 시작하며

npm이 압도적으로 느리다!

 

대표적인 패키지 매니저로는 npm, pnpm, yarn (yarnBerry)가 있다.

오늘은 이 세 가지 패키지 매니저의 차이를 알아보고 각각의 장단점을 알아보고자 한다.

1. NPM

장점

  1. Node.js 설치 시 기존으로 함께 제공되는 공식 패키지 매니저
  2. 200만 개 이상의 패키지를 보유한 세계 최대 오픈소스 패키지 저장소

단점

  1. 설치속도가 느리다
    - 의존성 하나하나를 실제로 node_modules 폴더에 복사한다.
    - 특히 프로젝트가 커질수록 node_modules의 파일수가 증가하여 수만 개 이상이 되기도 한다.
  2. 디스크 낭비
    - 중복된 패키지를 여러 프로젝트에서 설치하면 같은 파일이 계속 저장된다. (캐시 재사용이 안 됨)
  3. 의존성 오염- 
    패키지가 직접 설치하지 않은 모듈들도 모두 node_modules에 들어가기 때문에 실수로 숨은 의존성이 발생하기 쉽다. (환경이 다를 경우 버그 발생가능성이 있다.)

요약 : 쉽지만 가장 원시적이고 느리고 보안위험이 있다.

2. pnpm (Performant npm)

  • 속도와 디스크 절약을 최우선으로 고려한 패키지 매니저

장점

  1. 빠른 설치 속도
    - 이미 설치된 패키지는 다시 복사하지 않고 하드링크만 생성
    - 수백 개의 의존성도 몇 초 안에 설치 가능
  2. 디스크 절약
    - 전역. pnpm/store에 저장된 패키지를 모든 프로젝트에서 공유
    - 동일한 버전의 react를 10개 프로젝트에서 써도 저장은 1번만 하면 됨
  3. 의존성 고립/ 업격한 구조
    - 각 패키지 의존성은 자신의 디렉터리 내에서만 접근 가능
    - 실수로 설치 안 한 패키지를 require()하면 바로 에러 발생(숨은 의존성 문제 방지)
  4. 깔끔한 node_modules구조
    - 내부적으로는 node_modules에 심볼릭 구조를 만들지만, 실제는. pnpm/store에 있는 전역파일을 하드링크로 연결한다.

단점

  1. 일부 레거시 툴과 호환성이 낮다.
  2. 진입장벽이 있다. pnpm-lock.yaml,. pnpm-store 등의 구조가 낯설 수 있다.
  3. 일부 기업/라이브러리에선 '표준'으로 채택되지 않았다.

 

🔗 하드링크(Hardlink)란?

여러 파일이 하나의 물리적 파일을 공유하게 만드는 OS 기능이다

예를 들어서:

A라는 파일이 있고 lodash를 저장하면.
B라는 이름으로 lodash를 저장하면 하드링크가 만들어지고, A와 B는 같은 파일을 가리킨다.

즉, pnpm은 로컬 저장소에 lodash를 딱 한 번만 저장하고,
프로젝트의 node_modules/lodash는 그걸 가리키는 하드링크만 만들어둔다.

3. YarnBerry

  • yarn의 v2로 시작된 차세대 패키지 매니저
  • PnP(Plug'n'Play), Zero-insatll 등 혁신적인 기능을 도입
  • yarn v1 은 "classic"이라고 하고 v2이상은 "Berry"라고 부른다.

장점

  1. node_modules가 없는 구조 (PnP)
    - 의존성은. zip파일의 형태로. yarn/cache에 저장된다.
    -. pnp.cjs 파일이 모든 의존성 경로를 관리함으로써 설치가 빠르고 디스크를 절약한다.
  2. zero-install 지원
    -. yarn/cache와. pnp.cjs를 git에 커밋하면 나중에 별도 설치 없이 바로 실행가능하다.
    (zip파일을 풀지 않고. pnp.cjs에 선언된 경로를 통해 바로 실행할 수 있다고 한다.)
  3. 엄격한 의존성 관리
    - 의존성을 설치하지 않으면 절대사용불가 => 숨은 의존성을 미연에 방지한다.
  4. 모노레포에 친화적
    - workspaces는 기본기능이고 , 병렬작업, 패키지 전파등을 지원한다고 한다.

단점

  1. 생태계 호환성 문제 : PnP를 지원하지 않는 일부도구들이 많기 때문에 추가 설정 없인 충돌할 수 있다.
  2. 초기설정 및 러닝커브 : 초기설정이 비교적 복잡하고 러닝커브가 있다.
  3. git/commit 크기증가

 

요약

🐢 npm은 가장 친숙하지만 느리고 중복이 많다.
⚡ pnpm은 빠르고 효율적이지만 구조 이해가 필요하고,
🧠 Yarn Berry는 가장 구조적이고 스마트하지만, 진입 장벽이 높다.

 

주요 기능 비교

항목 npm pnpm Yarn Berry
설치 속도 🐢 느림 ⚡ 매우 빠름 🚀 빠름
디스크 절약 ❌ 낮음 ✅ 하드링크 기반 절약 ✅ zip 캐시 절약
node_modules ✅ 사용 ✅ 하드링크 구조 ❌ 사용 안함 (PnP)
Zero-install ❌ 미지원 ✅ 가능 (설정 필요) ✅ 완벽 지원
모노레포 지원 🔸 제한적 ✅ 강력 ✅ 매우 강력
생태계 호환성 ✅ 가장 넓음 ✅ 대부분 호환 ⚠️ 일부 설정 필요
설정 난이도 🔰 매우 낮음 🔸 중간 🔺 높음 (YAML, PnP, plugin 등)

 

어떤 걸 선택해야 할까?

추천 매니저 상황
npm 소규모 프로젝트, 빠른시작
pnpm 속도와 디스크 최적화 중요
Yarn Berry CI 최적화, 팀 협업, 대규모 모노레포에 유리

 

 

마치며

- 현재는 작고 소규모 프로젝트여서 npm을 사용했지만, pnpm을 사용해서 디스크 최적화를 해보는 것도 좋을 것 같다.

- YarnBerry까지는 투머치라서 고려하지 않았지만, 패키지 매니저의 구조자체가 zip파일로 바뀌어서 작동하는 건 참신하고 편리할 것 같다.

- 충돌이 나지 않길 빌며 pnpm으로 마이그레이션 해봐야겠다.

 

reference : 

https://toss.tech/article/lightning-talks-package-manager

 

패키지 매니저의 과거, 토스의 선택, 그리고 미래

토스는 왜 패키지 매니저로 Yarn을 선택했을까요? 이번 라이트닝 토크에서는 JavaScript의 패키지 매니저, 동작 방식, 그리고 토스의 선택과 앞으로의 방향성에 대해 이야기해 보려고 해요.

toss.tech

 

https://html-jc.tistory.com/676

 

왜 기업들은 Yarn Berry를 많이 사용할까? - (1) (feat : npm)

여러 기업들의 기술 블로그를 보다보면 많이 나오는 것들 중 하나가 'Yarn Berry'이다. 이번에는 Yarn Berry에 대해 알아보자 Yarn berry는 다양한 기업에서 사용하고 있다. node_modules로부터 우리를 구원

html-jc.tistory.com

https://yarnpkg.com/

 

Home page | Yarn

Yarn, the modern JavaScript package manager

yarnpkg.com

https://pnpm.io/motivation

 

Motivation | pnpm

Saving disk space

pnpm.io

https://pnpm.io/benchmarks

 

Benchmarks of JavaScript Package Managers | pnpm

Last benchmarked at04 AM (daily updated).

pnpm.io