본문 바로가기
Backend2026년 4월 20일7분 읽기

Bun 2.0 풀스택 실전 — Built-in HTTP·SQLite·Redis·MCP 통합 가이드

YS
김영삼
조회 1
Bun 2.0 풀스택 실전 — Built-in HTTP·SQLite·Redis·MCP 통합 가이드

핵심 요약

Bun 2.0은 단순한 빠른 런타임을 넘어 풀스택 런타임 플랫폼을 지향한다. HTTP·SQLite·Redis·MCP·테스트·번들·패키지 매니저가 모두 단일 바이너리에 내장. node_modules 하나 없이도 동작하는 앱 작성이 현실 가능.

  • 버전: 2.0 (2026-02 출시)
  • 엔진: JavaScriptCore (V8 아님) + Zig 코어
  • 크기: 단일 바이너리 ~75MB
  • 속도: HTTP 185K req/s (M3 Max 기준)

1) Built-in HTTP 서버

// server.ts
Bun.serve({
  port: 3000,
  routes: {
    "/api/users/:id": async (req) => {
      return Response.json({ id: req.params.id })
    },
    "/health": () => new Response("OK")
  }
})

Express·Fastify 없이 라우팅·미들웨어 모두 지원. 성능은 Express 대비 약 5~10배.

2) Built-in SQLite

import { Database } from "bun:sqlite"
const db = new Database("app.sqlite")

db.run("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
const insert = db.prepare("INSERT INTO users (name) VALUES (?)")
insert.run("Alice")

const users = db.query("SELECT * FROM users").all()

better-sqlite3 같은 외부 패키지 불필요. WAL 모드 기본, prepared statement 캐시 자동.

3) Built-in Redis 클라이언트

import { redis } from "bun"

await redis.set("key", "value")
const value = await redis.get("key")

// pub/sub
const sub = redis.subscribe("channel")
for await (const msg of sub) {
  console.log(msg)
}

ioredis·redis 패키지 불필요. RESP3 프로토콜 네이티브.

4) Built-in MCP 클라이언트 (2.0 신규)

import { MCPClient } from "bun:mcp"

const client = await MCPClient.connect({
  command: "npx",
  args: ["@modelcontextprotocol/server-filesystem", "/data"]
})

const tools = await client.listTools()
const result = await client.callTool("read_file", { path: "config.json" })

Anthropic MCP 표준 직접 지원. AI 에이전트 도구 통합 시 별도 패키지 불필요.

5) 풀스택 예시 — 30줄 앱

import { Database } from "bun:sqlite"
const db = new Database("app.sqlite")
db.run("CREATE TABLE IF NOT EXISTS posts (id INTEGER PRIMARY KEY, title TEXT)")

Bun.serve({
  port: 3000,
  routes: {
    "/": () => new Response(Bun.file("./public/index.html")),
    "/api/posts": {
      GET: () => Response.json(db.query("SELECT * FROM posts").all()),
      POST: async (req) => {
        const { title } = await req.json()
        db.prepare("INSERT INTO posts (title) VALUES (?)").run(title)
        return Response.json({ ok: true })
      }
    }
  }
})

이 30줄로 정적 파일 서빙 + REST API + DB가 동작. 외부 패키지 0개.

실전 운영 체크리스트

  • 프로덕션 SQLite는 Litestream으로 S3 백업 권장
  • HTTP 서버는 PM2 또는 systemd로 관리
  • Bun 2.0+ 필수 (이전 버전은 prisma·일부 ORM 호환 이슈)
  • 크로스 플랫폼 빌드 — bun build --compile로 단일 실행 파일 생성 가능

한계

  • 일부 Node 네이티브 모듈 (예: canvas, sharp) 호환 미흡
  • 디버깅 도구 (chrome devtools 통합) 아직 Node 수준 아님
  • 윈도우 지원 베타 (1.x보다 안정성 향상되었으나 일부 기능 제한)

자주 묻는 질문

Node에서 Bun으로 마이그레이션 부담은?

Express·Fastify 대신 Bun.serve로 바꾸는 정도. SQLite·Redis 라이브러리도 built-in으로 교체 가능. WinterCG 표준 준수로 fetch·streams는 동일.

프로덕션에 안전한가?

HTTP 서버·SQLite는 검증됨. ORM (Prisma)은 6.20+ 권장. 큰 분산 시스템이라면 좀 더 관망 권장.

npm 생태계 호환?

약 95%. 일부 네이티브 모듈은 빌드 차이로 실패. bun pm trust <package>로 postinstall 활성화 필요한 경우 있음.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록