처음 컴퓨터에 세팅할때면 흔히 npm -v 라는 명령어로 뭐가 제대로 설치됐는지 확인하고는 했는데, 정확히 npm이 무엇인지, 뭔데 Node.js를 설치하면 따라오는지 자세히는 모르는 상태로 사용하고는 했다..!
이번 사이드프로젝트를 진행하면서 bun을 사용했고, bun 또한 무엇이길래 npm install 대신에 쓰는지 이번 기회에 알아보고자 한다.
개발을 하다 보면 React부터 사소한 라이브러리들까지 남이 만들어 둔 코드(라이브러리)를 가져다 쓸 일이 매우 많다. 만약 이런 패키지 매니저들이 없다면 node_modules 에 있는 수많은 파일들을 USB에 담거나 메일로 주고받는다면 관리가 불가능해진다.
이럴때 패키지 매니저(자바스크립트 매니저)를 사용할 수 있다.
요리를 할 때(개발), 쌀이나 야채 같은 재료(남이 만들어둔 코드/라이브러리)를 직접 농사지어서 구하는 것이 아니라, 마트에서 손쉽게 사오고 관리해주는 '구매 대행 비서'와 같은 역할을 패키지 매니저가 수행하게 된다.
npm install react 명령어 한 줄이면 리액트 라이브러리를 인터넷(저장소)에서 내 컴퓨터로 다운로드 할 수 있다.package.json이라는 파일에 "우리 프로젝트는 A 라이브러리 1.2 버전이 필요해"라고 명시해둔뒤npm start, npm build 같이 약속된 단축 명령어를 실행할 수 있다.프로젝트를 진행하면서 package.json 와 node_modules 는 누구나 한번씩 만나봤을 친구들인데, 그 친구들에 간단하게 정의하면 아래와 같다.
package.json : (라이브러리) 버전 관리를 위한 리스트
node_modules : package.json 에 따른 라이브러리들의 코드들이 실제로 담기는 바구니 (폴더)
node_modules를 만드는 과정개발자가 터미널에 npm install이라고 치면, 패키지 매니저는 다음과 같은 일을 수행하여 node_modules 폴더를 생성(혹은 갱신)한다.
package.json을 읽고 필요한 라이브러리 목록을 확인한다. (예: React, TypeScript 등)node_modules라는 이름의 폴더 안에 차곡차곡 정리해서 넣는다.node_modules에 넣는다.node_modules 폴더는 엄청나게 커지게 된다.
node_modules가 필요한가?코드에서 import 문을 쓸 때, 컴퓨터는 그 파일을 어디서 찾을까?
import React from 'react'; // "react를 가져와!"
이 코드를 실행하면 자바스크립트(Node.js)는 무조건 node_modules 폴더 안을 뒤지기 시작한다.
"react라는 폴더가 있나? 아, 여기 있네!" 하고 찾아서 코드를 가져오게 된다.
즉, 패키지 매니저는 코드가 실행될 수 있도록 node_modules라는 약속된 장소에 파일들을 배달해 주는 역할을 한다!
패키지 매니저가 왜 필요하고, 뭔지는 이제 알았으니 그 다음으로는 이 패키지매니저의 종류에 대해 알아볼 수 있다. 패키지 매니저에는 우리가 널리 아는 npm 외에도 yarn, pnpm, bun 등 다양한 종류들이 있다.
npm (Node Package Manager):Yarn (Yet Another Resource Negotiator):Classic(v1)과 Berry(v2 이상)로 나뉘며, 최근에는 Berry 버전을 많이 사용한다.pnpm (Performant npm):Bun:yarn.lock 파일을 처음으로 도입하여, 모든 팀원이 완벽하게 동일한 버전의 패키지를 설치하도록 보장했다. (나중에 npm도 이를 따라 package-lock.json을 만듦)Yarn Classic (v1)과 완전히 새로 설계된 Yarn Berry (v2 이상)로 나뉜다. Berry는 굉장히 혁신적이지만 설정이 까다로워 호불호가 갈린다고 한다.bun install)뿐만 아니라 실행(node 대체), 번들러(webpack 대체), 테스트 도구(jest 대체)가 하나로 합쳐져 있다.| 구분 | npm | Yarn | pnpm | Bun |
|---|---|---|---|---|
| 핵심 키워드 | 표준, 안정성 | 안정적 개선, 기능 | 디스크 절약, 효율 | 초고속, 올인원 |
| 속도 | 보통 | 빠름 | 매우 빠름 | 압도적으로 빠름 |
| 디스크 효율 | 낮음 | 낮음 | 최상 (공유 사용) | 낮음 (캐시 방식) |
| 추천 대상 | 입문자 | 기존 Yarn 사용자 | 용량 부족한 분 | 속도 중시 |
이렇게 4가지 종류의 패키지 매니저를 보고 나서 의문이 들었던게, 그럼 npm (패키지매니저) 만 npm https://www.npmjs.com/과 연결되어 있는건가? 라는 의문이 들었다. 그럼 나머지 매니저들은 너무 부실하지 않나? 라는 생각…
하지만 세상은 그렇게 쉽게 굴러가지 않았다!
다른 도구들(yarn, pnpm, bun)은 그저 배송기사의 역할만 바꾼것 뿐이였다!
창고는 그대로이고 (npm 웹사이트) 그걸 우리에게 가져다주는 배송기사(패키지 매니저)의 역할만 바꿨기때문에 어떤 패키지매니저를 써도 npm에 있는 엄청나게 다양한 오픈소스들을 우리가 손쉽게 가져다쓸 수 있는 구조이다.
그럼 이제 내가 사용하고자 하는 Bun에 대해서 조금만 더 자세히 알아보려고 한다!

bun 뭐냐고 gemini한테 물어보니
Node.js를 대체하기 위해 태어난, 스테로이드를 맞은 런타임
라고 하는데, 설명을 들으니 왜 스테로이드를 맞았다는지 알겠다!
우리가 Node.js를 사용해서 개발할 때, 실제로는 수많은 도구를 덕지덕지 붙여서 사용한다.
Node.jsnpmJestWebpack이나 Vitets-node
Bun은 이 모든 것을 하나의 실행 파일(bun)에 다 넣어버렸다!
bun의 아주 큰 장점 중 하나는 빠르다는 것인데, 그럼 도대체 왜 이렇게 빠른지 알아보려고 한다.
node index.js 대신 bun index.js)npm install 대신 bun installbun build 명령어 하나로 수십만 줄의 코드를 눈 깜짝할 새(0.x초 단위)에 번들링한다. esbuild보다 더 빠르다고 주장한다고 한다.bun test 명령어를 사용합니다. Jest와 문법이 거의 호환되면서 속도는 훨씬 빠르다.Bun은 초기에는 속도를 위해 바이너리 파일(bun.lockb)을 사용했지만, 최신 버전부터는 텍스트 기반의 bun.lock을 기본으로 사용한다.
git diff를 통해 패키지 버전 변경 사항을 눈으로 직접 확인할 수 있다.
| 구분 | 내용 |
|---|---|
| ✅ 장점 | • 압도적인 속도 (설치, 실행, 빌드, 테스트 전 분야) • TypeScript 네이티브 (설정 없이 바로 실행) • 설정 지옥 탈출 (All-in-One 툴킷) • Node.js 호환성 (기존 npm 패키지 사용 가능) |
| ❌ 단점 | • 초기 단계 (Node.js에 비해 검증 기간이 짧음, 버그 가능성) • 생태계 호환성 (특수 기능을 쓰는 일부 라이브러리 미지원) • 정보 부족 (에러 발생 시 레퍼런스가 적음) |
여기서 말하는 단점 : 생태계 호환성은 아래와 같은 이유로 발생한다.
엔진의 차이 (V8 vs JavaScriptCore)
v8 모듈 등)를 직접 사용하게 된다.C++ 네이티브 모듈
node_modules 안에는 자바스크립트 파일만 있는 게 아니라, 성능이 중요한 라이브러리(이미지 처리, 암호화 등)는 C++로 짜인 파일을 포함하게 된다.Bun이 좋다, 빠르다는 말은 여러 번 들었고 사이드 프로젝트에서 써보기도 했지만, 정작 왜 빠른지, 왜 쓰는 건지 깊게 생각해보진 않았던 것 같다.
이번 기회에 정리하면서 도전적이고 새로운 기술을 써보는 재미를 다시 한번 느꼈다! 😘😘