개요
새로 시작하게 될 프로젝트의 Node.js 패키지 매니저를 pnpm으로 정했습니다. 사실 pnpm은 npm 보다 좋다고 말만 들어봤지 정확히 어떤 부분에서 좋은지 분석해보지는 않았는데요. 이번 글에서는 npm으로 환경 구성된 프로토 타입을 pnpm으로 마이그레이션 하면서 알게 된 npm과 pnpm의 차이점, 장/단점에 대해서 기록하고 다음 글에서는 마이그레이션 과정을 정리해보고자 합니다.
npm이란?
자바스크립트 생태계에서 npm(Node Package Magner)은 Npde.js와 함께 배포되는 기본 패키지 매니저입니다.
Node.js가 처음 등장했을 때, 개발자들이 다양한 모듈 및 라이브러리들을 공유하기 위한 저장소가 필요했는데 그 결과가 npm 레지스트리와 이를 다루는 CLI 도구인 npm이 됐습니다.
npm의 핵심 역할
- 패키지 설치(`npm install`)
- 프로젝트 의존성 설치(`package.json`)
- 스크립트 실행(`npm run`)
- 전 세계 개발자들이 만든 라이브러리 연결
즉, npm은 Javascript 생태계의 기본 뼈대 역할을 합니다.
pnpm의 등장
npm은 오랫동안 Node.js의 표준이었지만, 몇 가지 문제점이 있었는데 아래와 같습니다.
- 디스크 공간 낭비
- 여러 프로젝트에서 같은 패키지를 사용해도, 각 프로젝트의 `node_modules`와 같은 복사본을 따로 저장했습니다.
예를 들어, `lodash` 하나만 수십 번 중복 설치되는 일이 흔했습니다. - 설치 속도가 느림
- 수천 개의 패키지를 복사 및 설치하기 때문에 시간이 오래 걸립니다. - 의존성 트리 문제
- npm은 `node_modules`를 평탄화해서 설치하기 때문에, 어떤 경우에는 잘못된 `peerDependencies`가 있어도 그냥 넘어가버리는 일이 있었습니다. 그래서 내 로컬에서는 되는데, 배포 환경에서는 깨지는 버그가 발생하기도 했다고 합니다.
이런 문제들을 해결하기 위해 등장한 게 바로 pnpm(Perforamant npm)입니다.
pnpm의 특징
- 모든 패키지를 전역 저장소(`.pnpm-store`)에 저장
- 프로젝트별로 패키지를 복사하지 않고 링크(하드링크/심볼릭)해서 연결
- 의존성 트리를 엄격하게 관리하여 잘못된 의존성 구조를 미리 확인
npm과 pnpm의 차이
| 구분 | npm | pnpm |
| 저장 방식 | 프로젝트마다 패키지 복사 | 전역 저장소에 한 번만 설치 후 링크 |
| 디스크 효율 | 중복 발생 -> 낭비 | 공유 저장소 활용 -> 절약 |
| 설치 속도 | 상대적으로 느림 | 빠름 |
| 의존성 관리 | 관리가 느슨하여 버그가 알려지지 않음 | 관리가 엄격하여 버그를 초기에 발견 |
| 호환성 | 모든 패키지 완벽 지원 | 드물게 구식 패키지에서는 충돌 발생 |
pnpm의 좋은 점
- 성능과 효율성
- 큰 프로젝트에서 `npm install`은 시간이 오래 걸릴 수 있지만 pnpm에서는 몇 초 단위로 끝날 수 있습니다.
- SSD 용량을 아끼고 CI/CD 서버에서도 빌드 시간을 단축할 수 있습니다. - 모노레포(Monorepo) 친화적
- 요즘의 대규모 프로젝트는 여러 패키지를 하나의 레포지토리에서 관리하는 모노레포 구조를 많이 사용합니다.
pnpm은 `pnpm workspaces` 기능으로 모노레포 관리에 최적화되어 있습니다. - 엄격한 의존성 관리
- pnpm은 의존성을 트리 구조 그대로 설치하기 때문에 `peerDependencies 충돌` 같은 문제를 빨리 발견할 수 있습니다.
- 개발 초기 단계에서 에러를 잡아주므로 장기적으로 프로젝트 안정성이 올라갑니다. - 커뮤니티 트렌드
- Vite, Vue, Next.js, Angluar 팀 등 많은 오픈소스 프로젝트가 pnpm으로 마이그레이션 하고 있습니다.
- 대기업(예: Microsoft, Tencent 등)에서도 CI/CD 최적화 때문에 pnpm을 채택하고 있는 사례가 늘고 있습니다.
npm, pnpm 중에 고르자면
- npm을 선택하면 좋은 경우
-> 작은 프로젝트, 별도 설정 없이 바로 시작하고 싶을 때, - pnpm을 선택하면 좋을 경우
-> 대규모 프로젝트, 협업 환경, 빌드/배포 속도가 중요한 경우
'개발' 카테고리의 다른 글
| 프론트엔드 영역에서 헤드리스(Headless) UI란 무엇일까 (3) | 2025.10.25 |
|---|---|
| npm에서 pmpm으로 마이그레이션 하기 (0) | 2025.09.19 |
| ProseMirror 뜯어보기 - prosemirror-model의 fragment.ts (1) | 2025.08.18 |
| ProseMirror 뜯어보기 - prosemirror-model의 node.ts (3) | 2025.08.12 |
| 자바스크립트 환경에서 모바일 대응하기 (2) | 2025.06.17 |