
프론트엔드 개발을 하다 보면 가장 먼저 마주치는 도구 중 하나가 패키지 매니저다.
패키지 매니저는 프로젝트에 필요한 라이브러리를 설치하고, 버전을 관리해 주는 도구다.
대표적으로 npm, Yarn, pnpm, Bun이 있으며,
각각 설치 방식과 성능, 사용 목적에 차이가 있다.
이번 글에서는 네 가지 도구의 특징과 장단점을 정리해본다.
📦 npm (Node Package Manager)
- Node.js 공식 기본 패키지 관리자
- 설치 명령:
npm install - 장점
- 가장 널리 사용되는 표준
- Node.js 설치 시 기본 포함
- 단점
- 상대적으로 느린 설치 속도
node_modules디렉터리 크기 큼- npm은 패키지를 프로젝트 내
node_modules폴더에 통째로 복사해서 설치함 - 실제로 같은 파일이 여러 번 저장되기 때문에 디스크 공간을 많이 사용하고,
- 복사 작업 때문에 설치 속도도 상대적으로 느리다.
/project1/node_modules/packageA/index.js ← 완전 복사된 파일
/project2/node_modules/packageA/index.js ← 별도로 또 복사된 파일
📦 Yarn
- Facebook이 만든 npm 대안
- 설치 명령:
yarn install - 장점
- 병렬 처리로 빠른 설치 속도
yarn.lock으로 버전 고정 관리 편리- 직관적인 명령어 (
yarn add,yarn remove)
- 단점
- npm과 100% 호환되지 않음 (최근엔 거의 유사)
📦 pnpm
- 성능 최적화와 저장 공간 절약에 특화
- 설치 명령:
pnpm install
하드링크 기반
- 글로벌 캐시(
.pnpm-store)에 패키지를 한 번만 저장하고, - 각 프로젝트
node_modules에는 하드링크(파일을 공유하는 참조) 방식으로 연결
하드링크?
동일 파일을 여러 경로에서 참조하여 디스크 공간 절약
→ 같은 파일이 여러 번 저장되지 않으니,
→ 디스크 공간이 절약되고, 파일 복사/설치 속도도 빠르다!
/global-store/packageA/index.js <-- 실제 파일 1개
/project1/node_modules/packageA/index.js <-- 이 파일은 하드링크로 실제 파일을 가리킴
/project2/node_modules/packageA/index.js <-- 이 파일도 같은 실제 파일 가리킴
- 장점
- 디스크 공간 대폭 절약
- 빠른 설치 속도
- 얕고 단순한
node_modules구조 →require()탐색 속도 증가 - 모노레포에 강점
- 단점
- 사용자 수 상대적으로 적음
- 일부 패키지 호환성 문제 가능성
📦 Bun
- Rust로 개발된 최신 올인원 도구 (패키지 매니저 + 런타임 + 번들러)
- 설치 명령:
bun install
컴퓨터 프로그램을 만들 때는 속도도 중요하고, 프로그램이 안전하게 잘 작동하는지(버그 없이)도 매우 중요하다.
C, C++ 같은 언어는 엄청 빠르지만, 메모리 관리를 프로그래머가 직접 해야 해서 실수하면 프로그램이 터질 수 있다. (버그 발생)
JavaScript, Python 같은 언어는 안전하지만, 속도가 느릴 수 있다.
Rust?
- 엄청 빠르면서도 안전한 언어
- 프로그래머가 메모리 관리를 ‘실수 없이’ 하도록 컴파일러가 미리 검사해준다.
- 그래서 버그(특히 메모리 관련)를 줄이고, 프로그램이 더 튼튼하게 작동한다.
→ Bun은 빠른 속도가 중요한 도구라서, “안전하면서도 빠른” Rust로 핵심 기능들을 만들어서 속도와 안정성을 동시에 챙길 수 있다!
Rust 기반 통합 런타임
- 패키지 설치, 실행, 번들링, 트랜스파일 기능을 한 번에 제공
- 장점
- 설치 속도 최강
- 내장 JS 런타임과 번들러 (
bun run,bun dev) - 명령어 간결
- 단점
- 초기 단계, 생태계 미성숙
- 일부 npm 패키지 호환성 부족
도구별 장단점 요약
| 도구 | 장점 | 단점 |
|---|---|---|
| npm | - 가장 널리 사용됨 - 기본 제공 - 안정적 |
- 느린 설치 속도 - 비효율적 디스크 사용 |
| Yarn | - 병렬 설치로 빠름 - 락파일 안정적 - 직관적 명령어 |
- npm과 완벽 호환 아님 - 캐시 문제 가끔 발생 |
| pnpm | - 디스크 절약 - 빠른 설치 - 모노레포 최적화 |
- 구조가 생소함 - 일부 패키지 호환 문제 가능 |
| Bun | - 속도 최강 - 런타임 + 번들러 통합 - 간결한 명령어 |
- 초기 단계 - 일부 패키지 호환 부족 |
어떤 도구를 선택할까?
| 상황 | 추천 도구 |
|---|---|
| 무난하고 안정적으로 시작 | npm |
| 빠른 설치와 편리한 명령어 원함 | yarn |
| 저장 공간 절약, 대규모 프로젝트 | pnpm |
| 최신 기술 실험, 극한 속도 추구 | bun |
패키지 매니저에는 절대적인 정답은 없다.
프로젝트 규모, 팀 환경, 성능 요구사항에 따라 선택이 달라진다.
처음에는 npm이나 Yarn으로 시작해도 충분하고,
프로젝트가 커지거나 모노레포 환경이라면 pnpm이 좋은 선택이 될 수 있다.
Bun처럼 빠르게 발전하는 도구도 있으니, 상황에 맞게 비교하고 선택하는 것이 중요하다.
https://npm-compare.com/ko-KR/bun,npm,pnpm,yarn
pnpm vs npm vs yarn vs bun | "JavaScript 패키지 관리 도구" npm 패키지 비교
pnpm vs npm vs yarn vs bun "JavaScript 패키지 관리 도구" npm 패키지 비교
npm-compare.com
[✨FRONTEND/📍Next.js] - 내가 pnpm을 쓰는 이유
내가 pnpm을 쓰는 이유
사실 나는 pnpm을 쓰면서도 정확한 이유를 잘 알지 못했다.프로젝트를 시작할 때 그냥 자연스럽게 pnpm을 선택했다. 이유는 단순했다.“요즘 다 pnpm 쓴다던데?”“설치 속도가 빠르다던데?” 그 정
bori-note.tistory.com
'✨FRONTEND > 📍React' 카테고리의 다른 글
| React/Next.js 마크다운 목차 구현하기 (feat. 클릭 시 스크롤) (0) | 2026.03.16 |
|---|---|
| Tailwind Breakpoint 기준으로 useResponsive 훅 만들기 (0) | 2026.02.26 |
| shadcn/ui: 도입부터 커스텀까지 (0) | 2026.02.06 |
| React에서 map 쓰는 패턴 정리 (0) | 2025.12.02 |
| UI 컴포넌트 라이브러리 비교(feat. Ant Design, HeadlessUI) (2) | 2025.06.01 |