[2026] Bun 완벽 가이드 | 초고속 JavaScript 런타임·패키지 관리자·번들러·테스트·실전 활용
이 글의 핵심
Bun으로 빠른 JavaScript 개발을 구현하는 완벽 가이드입니다. Node.js 대안, 빠른 패키지 설치, 내장 번들러, 테스트 러너까지 실전 예제로 정리했습니다.
실무 경험 공유: Node.js에서 Bun으로 전환하면서, 패키지 설치가 10배 빨라지고 테스트 실행이 5배 빨라진 경험을 공유합니다.
들어가며: “Node.js가 느려요”
실무 문제 시나리오
시나리오 1: npm install이 너무 느려요
npm은 느립니다. Bun은 10배 빠릅니다.
시나리오 2: 번들러 설정이 복잡해요
Webpack은 복잡합니다. Bun은 내장 번들러를 제공합니다.
시나리오 3: 테스트가 느려요
Jest는 느립니다. Bun은 5배 빠릅니다.
1. Bun이란?
핵심 특징
Bun은 초고속 JavaScript 런타임입니다. 주요 장점:
- 빠른 속도: Node.js보다 4배 빠름
- 올인원: 런타임 + 패키지 관리자 + 번들러 + 테스트
- Node.js 호환: 대부분 호환
- TypeScript: 네이티브 지원
- Web API: fetch, WebSocket 내장 성능 비교:
- Node.js: 100ms
- Deno: 80ms
- Bun: 25ms
2. 설치 및 기본 사용
설치
아래 코드는 bash를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
# macOS/Linux
curl -fsSL https://bun.sh/install | bash
# Windows
powershell -c "irm bun.sh/install.ps1 | iex"
기본 명령어
아래 코드는 bash를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
# 파일 실행
bun run index.ts
# REPL
bun
# 버전 확인
bun --version
3. 패키지 관리
패키지 설치
아래 코드는 bash를 사용한 구현 예제입니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.
# 의존성 설치
bun install
# 패키지 추가
bun add express
bun add -d typescript
# 패키지 제거
bun remove express
# 전역 설치
bun add -g typescript
속도 비교:
- npm: 60초
- pnpm: 20초
- bun: 6초
4. 웹 서버
HTTP 서버
다음은 typescript를 활용한 상세한 구현 코드입니다. 조건문으로 분기 처리를 수행합니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.
// server.ts
const server = Bun.serve({
port: 3000,
fetch(req) {
const url = new URL(req.url);
if (url.pathname === '/') {
return new Response('Hello Bun!');
}
if (url.pathname === '/api/users') {
return Response.json([
{ id: 1, name: 'John' },
{ id: 2, name: 'Jane' },
]);
}
return new Response('Not Found', { status: 404 });
},
});
console.log(`Server running on http://localhost:${server.port}`);
Express 사용
아래 코드는 typescript를 사용한 구현 예제입니다. 필요한 모듈을 import하고. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.
import express from 'express';
const app = express();
app.get('/', (req, res) => {
res.send('Hello Bun with Express!');
});
app.listen(3000, () => {
console.log('Server running on :3000');
});
5. 번들러
기본 번들링
아래 코드는 typescript를 사용한 구현 예제입니다. 비동기 처리를 통해 효율적으로 작업을 수행합니다, 에러 처리를 통해 안정성을 확보합니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
// build.ts
await Bun.build({
entrypoints: ['./src/index.ts'],
outdir: './dist',
target: 'browser',
minify: true,
sourcemap: 'external',
});
React 번들링
아래 코드는 typescript를 사용한 구현 예제입니다. 비동기 처리를 통해 효율적으로 작업을 수행합니다, 에러 처리를 통해 안정성을 확보합니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.
await Bun.build({
entrypoints: ['./src/index.tsx'],
outdir: './dist',
target: 'browser',
minify: true,
splitting: true,
loader: {
'.png': 'file',
'.svg': 'file',
},
});
6. 테스트
기본 테스트
아래 코드는 typescript를 사용한 구현 예제입니다. 필요한 모듈을 import하고. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.
// math.test.ts
import { expect, test, describe } from 'bun:test';
describe('Math', () => {
test('add', () => {
expect(1 + 2).toBe(3);
});
test('multiply', () => {
expect(2 * 3).toBe(6);
});
});
비동기 테스트
아래 코드는 typescript를 사용한 구현 예제입니다. 필요한 모듈을 import하고, 비동기 처리를 통해 효율적으로 작업을 수행합니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
import { expect, test } from 'bun:test';
test('fetch users', async () => {
const response = await fetch('https://api.example.com/users');
const users = await response.json();
expect(users).toBeArray();
expect(users.length).toBeGreaterThan(0);
});
실행
bun test
7. 파일 시스템
파일 읽기
아래 코드는 typescript를 사용한 구현 예제입니다. 비동기 처리를 통해 효율적으로 작업을 수행합니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
// 텍스트 파일
const text = await Bun.file('data.txt').text();
// JSON 파일
const json = await Bun.file('data.json').json();
// 바이너리 파일
const buffer = await Bun.file('image.png').arrayBuffer();
파일 쓰기
await Bun.write('output.txt', 'Hello Bun!');
await Bun.write('data.json', JSON.stringify({ name: 'John' }));
8. 환경 변수
아래 코드는 typescript를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.
// .env
DATABASE_URL=postgresql://localhost:5432/mydb
API_KEY=secret123
// 사용
console.log(process.env.DATABASE_URL);
console.log(Bun.env.API_KEY);
9. Hot Reload
bun --watch server.ts
10. 실전 예제
REST API
다음은 typescript를 활용한 상세한 구현 코드입니다. 비동기 처리를 통해 효율적으로 작업을 수행합니다, 조건문으로 분기 처리를 수행합니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.
// api/server.ts
const server = Bun.serve({
port: 3000,
async fetch(req) {
const url = new URL(req.url);
if (url.pathname === '/api/users' && req.method === 'GET') {
const users = await db.select().from(usersTable);
return Response.json(users);
}
if (url.pathname === '/api/users' && req.method === 'POST') {
const body = await req.json();
const user = await db.insert(usersTable).values(body).returning();
return Response.json(user[0], { status: 201 });
}
return new Response('Not Found', { status: 404 });
},
});
정리 및 체크리스트
핵심 요약
- Bun: 초고속 JavaScript 런타임
- 올인원: 런타임 + 패키지 관리자 + 번들러 + 테스트
- 빠른 속도: Node.js보다 4배 빠름
- TypeScript: 네이티브 지원
- Node.js 호환: 대부분 호환
- Web API: fetch, WebSocket 내장
구현 체크리스트
- Bun 설치
- 프로젝트 초기화
- 웹 서버 구현
- 번들링 설정
- 테스트 작성
- 파일 시스템 활용
- 배포
같이 보면 좋은 글
- pnpm 완벽 가이드
- Vite 5 완벽 가이드
- Vitest 완벽 가이드
이 글에서 다루는 키워드
Bun, JavaScript, Runtime, Package Manager, Bundler, Performance, Node.js
자주 묻는 질문 (FAQ)
Q. Node.js를 완전히 대체할 수 있나요?
A. 대부분의 경우 가능하지만, 일부 네이티브 모듈은 호환되지 않을 수 있습니다.
Q. 프로덕션에서 사용해도 되나요?
A. 아직 1.0 버전이지만, 많은 프로젝트에서 사용하고 있습니다. 안정성을 중요시한다면 Node.js를 권장합니다.
Q. npm 패키지를 사용할 수 있나요?
A. 네, 대부분의 npm 패키지가 호환됩니다.
Q. Windows를 지원하나요?
A. 네, Windows도 지원합니다.