💻 프로그래밍

pnpm

pnpm

빠르고 디스크 효율적인 Node.js 패키지 매니저. 하드 링크 활용.

📖 상세 설명

pnpm(performant npm)은 npm, Yarn과 함께 Node.js 생태계의 주요 패키지 매니저 중 하나입니다. 가장 큰 특징은 하드 링크와 심볼릭 링크를 활용한 독특한 저장 방식으로, 디스크 공간을 획기적으로 절약합니다.

pnpm은 글로벌 저장소에 패키지를 한 번만 저장하고, 각 프로젝트에서는 하드 링크로 연결합니다. 예를 들어 10개 프로젝트에서 같은 버전의 lodash를 사용해도 실제로는 한 번만 다운로드됩니다. 이는 대규모 모노레포에서 특히 효과적입니다.

또한 pnpm은 엄격한 node_modules 구조를 사용합니다. 패키지는 자신의 dependencies만 접근할 수 있어 유령 의존성(phantom dependencies) 문제를 방지합니다. 이는 package.json에 명시되지 않은 패키지를 실수로 사용하는 것을 막아줍니다.

설치 속도도 빠릅니다. 콘텐츠 주소 기반 저장소와 병렬 설치 덕분에 npm보다 최대 2배 이상 빠른 설치가 가능합니다. workspace 기능도 내장되어 있어 모노레포 관리에 최적화되어 있습니다.

💻 코드 예제

Bash
# pnpm 설치
npm install -g pnpm

# 프로젝트 의존성 설치
pnpm install

# 패키지 추가
pnpm add express
pnpm add -D typescript  # devDependencies로 추가

# 워크스페이스에서 특정 패키지에 설치
pnpm add lodash --filter @myorg/api

# 스크립트 실행
pnpm run build
pnpm test

# 모든 워크스페이스에서 명령 실행
pnpm -r run build  # recursive

# 패키지 업데이트
pnpm update
pnpm update --interactive  # 대화형 업데이트

# 불필요한 패키지 정리
pnpm prune

# 저장소 크기 확인
pnpm store status

🗣️ 실무 대화 예시

DevOps 엔지니어
"CI 파이프라인에서 npm install이 너무 오래 걸립니다. node_modules 캐싱해도 5분 넘게 걸리네요."
시니어 개발자
"pnpm으로 마이그레이션하면 어떨까요? 캐시 효율이 훨씬 좋고, 디스크 공간도 절약돼서 빌드 서버 관리도 편해질 겁니다."
DevOps 엔지니어
"좋네요. 모노레포도 구축 예정이었는데, pnpm workspace 기능이 있으니 Lerna 없이도 가능하겠어요."
면접관
"npm, Yarn, pnpm의 차이점과 각각 어떤 상황에서 선택하실지 설명해주세요."
지원자
"npm은 기본이고 호환성이 좋습니다. Yarn은 워크스페이스와 PnP 모드가 강점이고, pnpm은 디스크 효율과 엄격한 의존성 관리가 특징입니다. 모노레포라면 pnpm을 선호합니다."
면접관
"pnpm의 엄격한 모드가 어떤 문제를 예방하나요?"
지원자
"유령 의존성 문제를 방지합니다. package.json에 명시하지 않은 패키지를 하위 의존성에서 가져다 쓰면, 버전이 바뀌거나 제거될 때 런타임 에러가 발생하는데 pnpm은 이를 설치 시점에 차단합니다."
리뷰어
"package-lock.json이 있는데 pnpm-lock.yaml도 있네요. 하나로 통일하는 게 좋겠어요."
작성자
"아, npm에서 마이그레이션하면서 남은 거네요. package-lock.json 삭제하고 .npmrc에 패키지 매니저 설정 추가하겠습니다."
리뷰어
"packageManager 필드도 package.json에 추가해주세요. Corepack이 자동으로 pnpm 버전을 맞춰줄 겁니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기