build-tools · medium priority
npm vs yarn vs pnpm — 패키지 매니저 비교
의존성 관리의 진화 — 왜 pnpm이 대세가 됐나
basic 난이도2시간토스당근카카오네이버
시작 전
이해도
매우 낮음
학습 개요
탄생 배경
쉬운 설명
복잡한 개념을 실생활 비유로 설명합니다.
“도서관 공유 책장”
pnpm은 중앙 도서관(~/.pnpm-store)에 책을 한 권씩 보관하고, 각 학생(프로젝트)에게는 그 책에 대한 독서 카드(하드링크)만 줍니다. npm/yarn은 각 학생이 같은 책을 복사해서 가지고 있는 구조입니다. pnpm 방식이 공간 효율적이고 빠릅니다.
핵심 개념
패키지 매니저 비교
| npm v7+ | yarn classic | yarn berry | pnpm | |
|---|---|---|---|---|
| 설치 속도 | 중간 | 빠름 | 빠름 | 매우 빠름 |
| disk 공간 | 많음 | 많음 | 중간 | 매우 적음 |
| 유령 의존성 | 있음 | 있음 | 없음 | 없음 |
| Workspaces | v7+ | v1+ | v2+ | v1+ |
| 실무 사용 | 기본값 | 레거시 | 일부 | 점점 증가 |
**유령 의존성(Phantom Dependency)**: package.json에 명시하지 않은 패키지를 사용할 수 있는 문제. npm/yarn은 의존성 hoisting으로 모든 패키지가 node_modules 최상위에 있어서 명시하지 않은 패키지도 import 가능합니다. pnpm은 심볼릭 링크 구조로 이를 원천 차단합니다.
실무 적용
어떤 상황에서 사용하는가
모노레포 프로젝트에서 패키지 매니저 선택
어떻게 적용하는가
토스, 카카오 등 대기업은 pnpm + Turborepo 조합을 많이 사용합니다. 빠른 설치, 적은 disk 사용, 엄격한 의존성 관리가 모노레포에 유리합니다. 기존 npm/yarn 프로젝트는 마이그레이션 비용 대비 효과를 고려해 결정합니다.
흔한 실수와 안티패턴
- pnpm으로 마이그레이션 시 유령 의존성 문제가 드러남 — package.json에 빠진 의존성 추가 필요
- CI에서 pnpm store 캐시 설정 없이 실행하면 매번 재설치로 느림
- yarn berry PnP 모드는 일부 도구와 호환 문제 있음
- lock 파일 충돌 시 수동 해결 필요 — 자동 병합 불가
면접 질문
기초토스당근
답변 방향 힌트
content-addressable store, 유령 의존성
반드시 언급할 키워드
- 하드링크로 disk 공간 절약
- 유령 의존성 방지
- 모노레포 지원
예상 꼬리 질문
- yarn berry의 PnP 모드는 어떻게 작동하나요?
- package.json의 peerDependencies는 무엇인가요?