nodejs

pnpm

문앵 2025. 3. 5. 21:05

Next 공식문서에서는 Next를 설치할때 npm의 업그레이드 버전인 pnpm을 사용하라고 권고하고 있다.

왤까?

 

*pnpm

npm의 상위 호환.

npm은 node_modules 파일에다가 설치된 라이브러리 파일을 모아서 쓰는 방식이고,

pnpm은 한번 다운 받은 라이브러리 파일들을 중앙 저장소에 저장해놓고 각 프로젝트 파일에서 가져다 쓰는 방식이다.

 

 

예를들어, 토이플젝1, 토이플젝2 두개의 플젝에서 lodash 패키지를 써야하는 상황이라고 가정해보자.

 

1. 기존 npm 방식 : 각각의 프로젝트 폴더의 node_modules 하위에 lodash 관련 파일을 저장 (두번 저장)

2. pnpm 방식 : 중앙 저장소에 lodash 관련 파일이 저장되고, 각 프로젝트 폴더의 node_modules 하위에는 lodash의 하드 링크만 저장된다. (한번 저장)

 

이런 식으로 설치된 패키지의 주소값만 가지고 여러 프로젝트에서 사용할 수 있어서 디스크 공간을 절약할 수 있다.

 

 

pnpm 중앙 저장소의 크기는 가변적이며, 패키지가 많이 설치될 수록 사용 공간이 늘어나고 공간이 부족하면 오래된 파일부터 지운다.

 

 

* pnpm 시스템

중앙 저장소에는 패키지별로 저장되는것이 아닌 컨텐츠별로 저장된다.

즉, 폴더구조가  ~/.pnpm/lodash 또는 ~/.pnpm/axios 라는 식이 아니라 

~/.pnpm/index.js 또는 ~/.pnpm/handler.js라는 식으로 저장되어, 여러 패키지에서 사용이 가능하다.

( index.js -> lodash, axios 에서 모두 사용, handler.js -> axios에서만 사용 이런식)

 

저장되는 파일명은 파일 내용의 해시값으로 저장되어 중복 저장을 피하고 최적화된다.

업데이트시에도 새로운 버전 파일 전체를 저장하는것이 아니라, 마찬가지로 변경된 파일만 저장하고 같은 내용의 파일은 그대로 사용한다. 

 

 


 

설명만 보면 무조건 pnpm을 사용하는게 좋을것 같은데.. 왜 다들 npm 쓰지?

 

지피티에게 물어봤다.

 

 

1. node_modules 구조가 일반적인 npm/yarn과 다르다

pnpm은 node_modules 폴더를 납작한(flat) 구조가 아니라 하드 링크 + 심볼릭 링크 방식을 사용해. 일부 패키지(특히 오래된 패키지)는 이 구조를 제대로 지원하지 않을 수도 있어.
해결 방법: node-linker=hoisted 옵션을 사용하여 npm과 비슷한 방식으로 설치 가능.

pnpm install --node-linker=hoisted

하지만 이 방식은 pnpm의 장점(공간 절약)을 일부 포기하는 거라 가급적 기본 설정을 유지하는 게 좋아.

 

2. 글로벌 설치된 패키지 관리가 복잡함.

npm은 npm install -g로 글로벌 패키지를 쉽게 설치할 수 있어. 하지만 pnpm은 글로벌 패키지를 따로 격리된 환경에서 관리하기 때문에, 사용법이 좀 다름.

해결 방법: pnpm env use 명령어를 사용하여 직접 실행 가능.

pnpm install -g eslint  # 글로벌 설치
pnpm env use eslint  # 실행
 
 
만약 글로벌로 설치된 패키지를 프로젝트에서 require('') 해서 사용하고 싶다면 어찌됐든 node_modules에 추가해줘야하는데 이때는 
pnpm link --global lodash

 

해주면 자동으로 연결해줌.

 

 

 

3. 작은 생태계 & 커뮤니티 

npm 사용자가 많다보니.. 근데 점점 성장중이라고 함.

 

 

 

4. CI/CD 에서 기본지원되지 않는 경우가 있음.

npm과 yarn은 대부분의 CI/CD 환경(GitHub Actions, GitLab CI 등)에서 기본 지원됨. 하지만 pnpm은 일부 플랫폼에서 기본적으로 설치되어 있지 않아서, 추가 설정이 필요할 수 있음.
해결 방법: CI/CD 환경에서 pnpm을 미리 설치하는 스크립트를 추가해야 함.

steps:
  - uses: actions/setup-node@v3
    with:
      node-version: 18
      cache: 'pnpm'  # npm 대신 pnpm 캐시 사용
  - run: corepack enable  # pnpm 활성화
  - run: pnpm install

 

 

 

 

그럼에도 불구하고 사람들이 pnpm을 사용하는 이유?
단점이 있긴 하지만, 대부분 해결 가능한 문제들이기때문.
그리고 대규모 프로젝트, 모노레포(monorepo), 속도 & 디스크 절약이 중요한 경우에는 pnpm이 훨씬 유리함.
그래서 요즘 Vercel, Shopify, Turborepo 같은 회사들도 pnpm을 공식적으로 도입하고 있음

 

모든 프로젝트에서 무조건 pnpm을 써야 하는 건 아니고, 
✔ 작고 빠르게 시작하는 프로젝트 → npm
✔ 대규모 프로젝트, 모노레포, 성능 최적화 필요 → pnpm

 

 

반응형