권현우의 프로필 사진

Hyunwoo

Pnpm

pnpm 알아보기

2025.12.29

  • pkg-manager

배경

요즘 패키지 매니저로 pnpm을 많이 채택해서 사용하는 것 같다.
개인 프로젝트에서 yarn 은 사용해봤지만 pnpm은 사용해본적이 없어서 이번 기회에서 pnpm에 대해서 살펴보았다.

장점

디스크 공간 절약

npm 대신 pnpm을 사용하면 디스크 공간을 절약할 수 있다. 예를 들어 react 를 쓰는 프로젝트가 100개 이고 npm을 사용한다면 100개의 프로젝트 마다/node_modules하위에 react 사본이 생성되고 이는 디스크 공간을 잡아먹는다.

하지만 pnpm을 사용한다면 실제로 각 프로젝트마다 사본을 생성하지 않고 content-addressable 저장소에 깔려있는 react를 참조하기만 한다.

그렇다면 content-addressable 저장소는 어디에 그 실체가 있을까? 내 맥북으로 pnpm을 설치하고 pnpm store path 명령어를 실행하여 확인해보았다. /Users/user/Library/pnpm/store/v10 이라는 디렉토리를 확인할 수 있었다. 즉, 중앙에 설치된 저장소에서 깔려있는 패키지를 참조하기만 한다는 걸 알수 있었다. 이런 구조라면 프로젝트의 수가 많아지면 많아질 수록 디스크 공간을 절약할 수 있는 효과가 더 커질 것이다.

빠른 설치 속도

pnpm은 설치 속도가 기존의 전통적인 패키지 설치 방식보다 빠르다. 왜 빠를까? 에 대한 공식적인 문서를 찾지 못했지만 프로젝트에 필요한 모든 패키지를 설치하지 않고 이미 디스크에 존재하는 패키지라면 단순히 링크를 거는 방식을 이용하기 때문이라고 생각된다.

참고로 pnpm의 공식 문서에는 아래와 같은 패키지 설치 과정을 거친다고 나와있다.

  1. (Dependency resolution) 의존성 해결 -> 필요한 모든 의존성과 그 의존성의 버전을 확인하고 필요하다면 store에 다운로드
  2. node_modules 디렉토리 구조 계산 -> 의존성 기반으로 node_modules 디렉토리 구조를 계산
  3. 의존성 링크 작업 -> 스토어에 있는 패키지를 node_modules 디렉토리에 링크 (연결)

직관적인 의존성 트리

기본적으로npm 또는 yarn 클래식을 통해 패키지를 설치할 때, 모든 패키지는 node_modules 디렉토리의 루트에 그 의존성들이 설치된다. 따라서 package.json에 명시되지 않은 의존성들도 프로젝트 내부에서 참조하고 사용할 수 있다.

그런데 pnpm을 사용하면 프로젝트의 직접적인 의존성만을 모듈 디렉토리의 루트에 추가하기 때문에 package.json에 명시되지 않은 의존성들은 프로젝트 내부에서 참조하고 사용할 수 없다. (의도적으로 루트로 호이스팅이 가능하다고 되어 있긴 하지만 그래도 default는 내가 설명한 방식이다.) 정확히는 우리가 설치하려는 의존성들이 필요로 하는 또 다른 의존성들은 그 의존성 폴더 하위에 위치하게 된다.

이런 방식은 프로젝트의 직접적인 의존성만을 모듈 디렉토리의 루트에 추가하기 때문에 패키지 트리에 대한 예측성을 높이고 모듈 디렉토리의 구조를 더 예측 가능하게 만든다는 점에서 굉장히 매력적이라 생각한다.

느낀 점

pnpm을 이용하여 간단하게 프로젝트를 설치하고 까보면서 장점에 대해 알아보았는데, 너무 매력적이어서 내 개인프로젝트에 바로 적용하였다. 그리고 앞으로 새롭게 진행하는 프로젝트에서는 pnpm을 적극 도입해야 겠다는 생각이 들었다.

참고