패키지 매니저 - pnpm
pnpm이란?
pnpm은 npm, Yarn과 같은 패키지 매니저로, 의존성을 설치하고 관리하는 데 사용됩니다. 하지만 pnpm은 기존 패키지 매니저들이 가진 문제를 해결하기 위해 독특한 방식을 도입했습니다.
pnpm의 등장 배경
JavaScript 생태계에서 npm은 가장 오래되고 널리 사용되는 패키지 매니저입니다. 하지만 npm의 의존성 관리 방식은 프로젝트마다 동일한 의존성을 반복적으로 저장하여 디스크 공간 낭비와 설치 속도 저하를 초래했습니다. 이를 개선하기 위해 Yarn이 등장했지만, Yarn 역시 의존성 중복 문제를 완전히 해결하지 못했고, 설치 속도나 모노레포 지원 측면에서 아쉬움이 있었습니다.
pnpm은 이러한 한계를 극복하기 위해 개발되었습니다. 핵심 아이디어는 하드 링크(hard link)를 사용해 동일한 의존성을 여러 프로젝트에서 공유함으로써 디스크 공간을 절약하고 설치 속도를 크게 향상시키는 것입니다. 또한, 모노레포 환경에서의 효율적인 의존성 관리를 목표로 개발되어, 대규모 프로젝트에서 특히 유용합니다.
pnpm의 특징
- 하드 링크를 활용한 디스크 공간 절약: pnpm은 프로젝트마다 의존성을 복사하지 않고, 글로벌 저장소에서 하드 링크를 생성해 디스크 공간을 절약합니다.
- npm: 각 프로젝트에 모든 의존성을 복사해 저장하므로, 동일한 패키지를 여러 프로젝트에서 사용할 경우 디스크 공간이 낭비됩니다.
- Yarn: 디스크 공간 절약을 위해 일부 최적화를 제공하지만, 완전하지는 않습니다.
- pnpm: 의존성을 글로벌 저장소에 한 번만 설치하고, 각 프로젝트에는 하드 링크를 생성합니다. 이를 통해 대규모 프로젝트에서도 디스크 공간을 효율적으로 사용할 수 있습니다.
- 빠른 설치 속도: 기존 방식보다 의존성을 빠르게 설치합니다. 캐시를 적극적으로 활용하고 하드 링크를 통해 의존성을 재사용하므로, npm과 Yarn보다 설치 속도가 훨씬 빠릅니다.
- 모노레포 지원: pnpm workspaces 기능을 통해 여러 프로젝트를 하나의 저장소에서 효율적으로 관리할 수 있습니다. 모노레포 환경을 염두에 두고 설계되었으며, 프로젝트 간 의존성을 효율적으로 공유할 수 있습니다. 추가 설정 없이 간단히 설정할 수 있어 대규모 프로젝트에 적합합니다.
- 잠금 파일의 안정성: pnpm-lock.yaml은 의존성 버전을 엄격히 고정해 예측 가능한 빌드를 제공합니다.
pnpm 설치
- npm을 이용한 설치
npm install -g pnpm
- brew를 이용한 설치 (brew 설치 필요)
brew install pnpm
- corepack을 이용한 설치 (Node.js 16.10 이상)
corepack enable
# corepack prepare pnpm@<버전> --activate
corepack prepare pnpm@stable --activate
pnpm으로 프로젝트 시작하기
pnpm을 사용해 새로운 프로젝트를 시작하는 방법은 매우 간단합니다. 아래는 pnpm을 통해 프로젝트를 초기화하고 패키지를 설치하는 기본적인 예제입니다.
# Yarn 초기화
pnpm init
# 패키지 설치
pnpm add [패키지명]
# 개발 의존성 설치
pnpm add [패키지명] -D
# 프로젝트 실행 스크립트 실행
pnpm [스크립트명]
언제 pnpm을 사용해야 할까?
Yarn과 pnpm은 모두 성능과 기능 면에서 뛰어난 패키지 매니저입니다. 따라서 어떤 도구를 사용할지는 프로젝트의 요구 사항에 따라 다를 수 있습니다. 아래는 pnpm이 Yarn과 비교했을 때 가지는 주요 차별점입니다.
1. 디스크 공간 사용의 효율성
- Yarn: Zero-Install 기능을 통해 프로젝트 디렉토리 내에서 패키지를 캐싱하지만, 각 프로젝트가 고유의 node_modules(또는 yarn) 디렉토리를 가지므로 중복 저장 문제가 발생할 수 있습니다.
- pnpm: 글로벌 스토리지와 하드 링크를 활용하여 중복 저장을 방지하고, 여러 프로젝트 간 의존성을 효율적으로 공유합니다. 대규모 모노레포 프로젝트에서는 특히 큰 이점을 제공합니다.
2. 설치 속도
- Yarn: Yarn은 병렬 다운로드를 통해 npm보다 빠른 속도를 제공하지만, 동일한 패키지를 반복적으로 설치해야 하는 경우 시간이 소요될 수 있습니다.
- pnpm: 이미 캐싱된 패키지를 재사용하고 하드 링크를 통해 설치 과정을 최적화하기 때문에 설치 속도가 더 빠릅니다.
3. 모노레포 지원
- Yarn: Yarn workspaces는 모노레포 지원을 제공하지만, 대규모 프로젝트에서는 설정 및 유지보수가 복잡해질 수 있습니다.
- pnpm: pnpm workspaces는 간단한 설정으로 프로젝트 간 의존성을 공유하며, 중복 설치를 방지해 모노레포 환경에서의 작업을 더 효율적으로 만듭니다.
결론적으로, pnpm은 더 나은 디스크 공간 관리, 빠른 설치 속도, 모노레포 지원에서 강점을 가지며, 특히 대규모 프로젝트에서 효율성을 극대화할 수 있는 도구입니다. 하지만 선택은 프로젝트 요구 사항과 기존 워크플로우에 따라 결정되어야 합니다.
이렇게만 보면 pnpm이 모든 측면에서 우수하기 때문에 pnpm을 선택해야 될 것 같습니다. 하지만, 모노레포를 사용하지 않거나 의존성을 설치하는 속도와 의존성의 크기에 민감한 것이 아니라면 어느 것을 선택해도 좋은 선택이라고 생각합니다. 특히나 Zero-Install을 적극적으로 활용하고 싶다면 Yarn이 좋은 선택이 될 수 있겠습니다.