본문 바로가기
Develop/Study

패키지 매니저(npm, pnpm, yarn)

by ys2ys2 2025. 6. 28.

pnpm vs npm vs yarn

 

 

최근에 새로운 프로젝트를 들어가면서 초기 환경설정을 했는데 궁금한 게 생겼다.

예전에 교육기관에서 하던 소규모 프로젝트에서는 CRA를 사용해서 리액트 프로젝트 환경설정을 했었다.

그때는 아무것도 모르고 그냥 npx create-react-app 하고 npm start를 하면 되는구나 하고 넘어갔는데,

왜 npx create-react-app을 하면 npm start가 됐는지, 지금 하는 프로젝트는 pnpm을 쓰는데 어떤 차이인 건지 궁금해졌다.

 


 

 

📦 패키지 매니저

패키지 매니저는 외부 라이브러리를 쉽고 체계적으로 설치, 업데이트, 삭제, 관리해주는 도구다.

명령어 한줄로 해결이 되니 개발 생산성도 높아지고 보안, 호환성, 협업 효율성 등 이점이 많다.

오픈소스 생태계와 현대 소프트웨어 개발에 반드시 필요한 핵심 도구라고 한다.

 

JavaScript나 TypeScript를 사용할 때 import 구문을 사용해서 외부 의존성을 참조하게 되는데

그걸 올바르게 참조할 수 있도록 보장해 주는 프로그램이라고 생각하면 된다.

 

보통 이렇게 import를 하는데

import React from 'react';

 

이렇게 하면 리액트가 18.0.1인지 19beta인지 무슨 버전인지 알 수가 없다. 

이런 정확한 정보는 package.json에서 제공한다.

{
  "dependencies": {
    "react": "^18.0.1"
  }
}

이렇게 package.json에 명시된 의존성 정보를 바탕으로 모든 코드들이 특정 버전의 라이브러리를 사용할 수 있도록 보장해 준다.

일반적으로 package.json에 dependencies를 명시하고, 패키지 라이브러리를 설치하면 해당 의존성의 명시된 버전을 설치하게 된다.

패키지 매니저가 이런 역할을 하는 것이라고 한다.

 


 

1. npm

npm은 Node Package Manager의 줄임말답게 Node.js의 공식 기본 패키지 매니저이다.

Node.js 설치하면 기본적으로 따라온다.

여기서 말하는 npm 라이브러리는 npm 레지스트리(https://registry.npmjs.org)에 등록된 오픈소스 or 비공개 코드의 패키지 또는 모듈 전체를 의미한다.

 

npm의 구조는 이렇게 되어있다

app
  ├─ package.json
  ├─ package-lock.json
  ├─ node_modules/
  ├─ src/
  └─ ...

 

 

  • package.json
    • 프로젝트에 필요한 모든 라이브러리 정보(dependencies),
      프로젝트 이름/버전, 실행 스크립트 등 필수 정보가 담긴 파일
    • "react": "^18.0.1" 처럼,
      리액트의 버전이 무엇인지 명확히 명시
  • package-lock.json
    • 실제 어떤 버전의 패키지가 설치됐는지
      (서브 의존성까지) 정확하게 잠궈놓는 파일
    • 프로젝트 협업/배포 시 버전 불일치 방지
  • node_modules/
    • 내가 설치한 모든 라이브러리가 실제로 깔리는 폴더

NPM의 장점

1. Node.js를 기본 제공하므로 대부분의 자바스크립트/타입스크립트 프로젝트에서 사용이 가능하다.

2. npmjs.com이라는 세계 최대 오픈소스 레지스트리 제공

3. 사용법이 간단,직관(npm install)

4. 커뮤니티 규모가 크다.

 

NPM의 단점

1. node_modules가 트리 구조로 저장되어서 디스크 용량을 많이 차지하고 의존성 충돌/설치 시간도 길다.

2. 대규모 프로젝트에서는 느릴 수 있다.

3. 중복 저장이 많고, 깨질 때 복구가 번거롭다.

 

 


 

 

2. pnpm

pnpm은 npm/yarn의 느린 속도, 용량 낭비 문제를 극복하기 위해 등장한 차세대 패키지 매니저다.

npm과 같은 역할이지만 하드링크라는 파일시스템 기능을 사용해 속도와 용량을 크게 개선했다.

 

pnpm의 구조는 이렇게 되어있다.

my-app/
 ├─ package.json
 ├─ pnpm-lock.yaml
 ├─ node_modules/ 
 └─ ...
.pnpm-store/

 

pnpm을 쓰면 프로젝트 구조는 비슷하지만 패키지 저장 방식이 다르다.

 

 

  • node_modules
    • 실제 코드가 아니라,
      전역 저장소(.pnpm-store)로부터 하드링크로 연결만 됨
    • 여러 프로젝트가 같은 패키지를 쓰면
      한 번만 다운받고 계속 재활용 → 디스크 용량 극대 절약
  • pnpm-lock.yaml
    • 모든 의존성 버전, 해시값 등
      정밀하게 기록(재현성 100% 보장)
  • .pnpm-store
    • 컴퓨터 전체에서 모든 프로젝트가
      같은 패키지를 한 번만 저장
      (디스크가 크게 절약됨)

 

pnpm의 장점

1. 설치 속도가 매우 빠르다.

2. 디스크 용량을 크게 개선했다.

3. npm, yarn의 거의 모든 라이브러리를 지원한다.

4. 의존성이 격리되어 예상치 못한 충돌을 방지한다

5. workspace 관리가 npm/yarn 보다 쉽고 강력하다.

 

pnpm의 단점

1. 레거시 라이브러리/도구에서 호환성 문제가 생길 수 있다.

2. npm, yarn에 비해 커뮤니티가 적다

 

 

 

 


 

 

그렇다면 어떤 패키지 매니저를 써야 할까?

이 질문에 딱 떨어지는 정답은 없는 것 같다. npm, yarn, pnpm 등등 각각의 특징이 분명하고, 각자 장단점이 있다.
npm은 기본값이고, 어디서나 쓰기 쉽다.
yarn은 npm보다 빠른 대체제였고, 지금도 여전히 잘 쓰인다.
pnpm은 요즘 개발자들 사이에서 관심 있게 지켜보는 속도와 용량 모두 챙긴 최신 패키지 매니저다.

사실 프로젝트를 시작할 때 "어떤 패키지 매니저를 써야만 한다"는 강박을 가질 필요는 없다.
팀에서 이미 정해둔 게 있다면 그냥 그걸 쓰면 되고,
혼자 진행하는 소규모 사이드 프로젝트라면 가장 익숙한 걸로 시작해도 충분하다.

그러나 프로젝트가 커지거나 여러 명이 동시에 작업해야 한다면

패키지 설치 속도가 얼마나 중요한지, 디스크 용량이 얼마나 아쉬운지, 의존성 충돌이 얼마나 짜증 나는지
이런 걸 한 번쯤은 다들 겪게 된다.

그럴 땐 한 번쯤 새로운 패키지 매니저(pnpm 같은)를 써보는 것도 나쁘지 않은 거 같다.


아무래도 뭘 써야 한다 보다는 프로젝트에 맞는 도구를 유연하게 선택할 수 있는 게 정답인 것 같다.

 

 

 

 

참고 : https://toss.tech/article/lightning-talks-package-manager

'Develop > Study' 카테고리의 다른 글

RTSP, RTP  (1) 2025.09.20
REST API 규칙  (2) 2025.06.09
UUID  (0) 2025.04.18
Deserialization Failure due to Date Format  (2) 2025.04.10
react, typescript  (0) 2025.03.22