패키지 매니저란?
패키지 매니저는 애플리케이션의 의존적인 패키지를 관리해 준다.
라이브러리의 설치, 삭제, 업데이트등을 도와주고 여러 dependencies 환경에 설치하고 관리할 수 있게 해 준다.
0. 시작하며
대표적인 패키지 매니저로는 npm, pnpm, yarn (yarnBerry)가 있다.
오늘은 이 세 가지 패키지 매니저의 차이를 알아보고 각각의 장단점을 알아보고자 한다.
1. NPM
장점
- Node.js 설치 시 기존으로 함께 제공되는 공식 패키지 매니저
- 200만 개 이상의 패키지를 보유한 세계 최대 오픈소스 패키지 저장소
단점
- 설치속도가 느리다
- 의존성 하나하나를 실제로 node_modules 폴더에 복사한다.
- 특히 프로젝트가 커질수록 node_modules의 파일수가 증가하여 수만 개 이상이 되기도 한다. - 디스크 낭비
- 중복된 패키지를 여러 프로젝트에서 설치하면 같은 파일이 계속 저장된다. (캐시 재사용이 안 됨) - 의존성 오염-
패키지가 직접 설치하지 않은 모듈들도 모두 node_modules에 들어가기 때문에 실수로 숨은 의존성이 발생하기 쉽다. (환경이 다를 경우 버그 발생가능성이 있다.)
요약 : 쉽지만 가장 원시적이고 느리고 보안위험이 있다.
2. pnpm (Performant npm)
- 속도와 디스크 절약을 최우선으로 고려한 패키지 매니저
장점
- 빠른 설치 속도
- 이미 설치된 패키지는 다시 복사하지 않고 하드링크만 생성
- 수백 개의 의존성도 몇 초 안에 설치 가능 - 디스크 절약
- 전역. pnpm/store에 저장된 패키지를 모든 프로젝트에서 공유
- 동일한 버전의 react를 10개 프로젝트에서 써도 저장은 1번만 하면 됨 - 의존성 고립/ 업격한 구조
- 각 패키지 의존성은 자신의 디렉터리 내에서만 접근 가능
- 실수로 설치 안 한 패키지를 require()하면 바로 에러 발생(숨은 의존성 문제 방지) - 깔끔한 node_modules구조
- 내부적으로는 node_modules에 심볼릭 구조를 만들지만, 실제는. pnpm/store에 있는 전역파일을 하드링크로 연결한다.
단점
- 일부 레거시 툴과 호환성이 낮다.
- 진입장벽이 있다. pnpm-lock.yaml,. pnpm-store 등의 구조가 낯설 수 있다.
- 일부 기업/라이브러리에선 '표준'으로 채택되지 않았다.
🔗 하드링크(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"라고 부른다.
장점
- node_modules가 없는 구조 (PnP)
- 의존성은. zip파일의 형태로. yarn/cache에 저장된다.
-. pnp.cjs 파일이 모든 의존성 경로를 관리함으로써 설치가 빠르고 디스크를 절약한다. - zero-install 지원
-. yarn/cache와. pnp.cjs를 git에 커밋하면 나중에 별도 설치 없이 바로 실행가능하다.
(zip파일을 풀지 않고. pnp.cjs에 선언된 경로를 통해 바로 실행할 수 있다고 한다.) - 엄격한 의존성 관리
- 의존성을 설치하지 않으면 절대사용불가 => 숨은 의존성을 미연에 방지한다. - 모노레포에 친화적
- workspaces는 기본기능이고 , 병렬작업, 패키지 전파등을 지원한다고 한다.
단점
- 생태계 호환성 문제 : PnP를 지원하지 않는 일부도구들이 많기 때문에 추가 설정 없인 충돌할 수 있다.
- 초기설정 및 러닝커브 : 초기설정이 비교적 복잡하고 러닝커브가 있다.
- 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
Home page | Yarn
Yarn, the modern JavaScript package manager
yarnpkg.com
Motivation | pnpm
Saving disk space
pnpm.io
Benchmarks of JavaScript Package Managers | pnpm
Last benchmarked at04 AM (daily updated).
pnpm.io
'Develog > Study' 카테고리의 다른 글
서버컴포넌트와 클라이언트 컴포넌트 분리를 통해 성능 최적화 (with.Next.js) (0) | 2025.04.26 |
---|---|
서버컴포넌트와 클라이언트 컴포넌트 잘 사용하기 (with Next.js) (0) | 2025.04.24 |
React의 state는 동기인가 비동기인가. with 이벤트 루프 (0) | 2025.04.17 |
Cursor 사용 후기: 초보자도 웹사이트 만들기 가능한 AI 코드 에디터 체험기 (2) | 2025.04.06 |
프론트엔드 에러 핸들링 구조 정리 (Axios + CustomError 적용) (2) | 2025.04.05 |