Alert
์ด ๊ธ์ Claude Code์ ๋์์ ๋ฐ์ ์์ฑ๋์์ต๋๋ค
TL;DR
- Bun์ ๋ฐํ์ + ํจํค์ง ๋งค๋์ + ๋ฒ๋ค๋ฌ + ํ ์คํธ ๋ฌ๋๋ฅผ ํ๋๋ก ํฉ์น JavaScript ์ฌ์ธ์ ๋๊ตฌ
- Zig์ JavaScriptCore ์์ง ๊ธฐ๋ฐ์ผ๋ก Node.js ๋๋น ์ฝ 4๋ฐฐ ๋น ๋ฅธ ์คํ ์๋ ์ฃผ์ฅ
- SQLite/Redis/S3 ๋ฐ์ธ๋ฉ, WebSocket, ๋น๋ฐ๋ฒํธ ํด์ฑ, FFI๊น์ง ๋ด์ฅ๋์ด ์ธ๋ถ ์์กด์ฑ ์์ด ํ์คํ ์๋ฒ ๊ตฌ์ถ ๊ฐ๋ฅ
bun build --compile๋ก ๋จ๋ ์คํ ๋ฐ์ด๋๋ฆฌ ์์ฑ, Jest ํธํ ํ ์คํธ ๋ฌ๋ ๋ด์ฅ- ํจํค์ง ๋งค๋์ ๋ npm/yarn/pnpm๊ณผ ํธํ๋๋ฉด์ 10๋ฐฐ ์ด์ ๋น ๋ฆ
Source
1. Bun์ด๋
JavaScript๋ ์๋ ๋ธ๋ผ์ฐ์ ์์์๋ง ๋์ํ๋ ์ธ์ด์๋ค. ๋ธ๋ผ์ฐ์ ๋ฐ(์๋ฒ, CLI)์์ JavaScript๋ฅผ ์คํํ๋ ค๋ฉด ๋ฐํ์์ด ํ์ํ๋ฐ, ๊ทธ ์ญํ ์ ํด์จ ๊ฒ์ด Node.js๋ค. ๊ทธ๋ฐ๋ฐ ์ค์ ๊ฐ๋ฐ์์๋ ๋ฐํ์๋ง์ผ๋ก ๋ถ์กฑํด์ ๋๊ตฌ๊ฐ ๊ณ์ ๋์ด๋๋ค.
- ํจํค์ง ์ค์น: npm, yarn, pnpm
- ์ฝ๋ ๋ฒ๋ค๋ง: Webpack, Rollup, Vite
- ํ ์คํธ: Jest, Vitest
Bun์ ์ด ๋ค ๊ฐ์ง(๋ฐํ์, ํจํค์ง ๋งค๋์ , ๋ฒ๋ค๋ฌ, ํ ์คํธ ๋ฌ๋)๋ฅผ ํ๋์ ๋ฐ์ด๋๋ฆฌ๋ก ํฉ์น ๋๊ตฌ๋ค. Node.js๊ฐ C++์ V8 ์์ง์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ๊ณผ ๋ฌ๋ฆฌ, Bun์ Zig ์ธ์ด์ Apple์ JavaScriptCore ์์ง์ผ๋ก ์ฒ์๋ถํฐ ์๋ก ์์ฑ๋์๊ณ , Node.js ๋๋น ์ฝ 4๋ฐฐ ๋น ๋ฅธ ์คํ ์๋๋ฅผ ๋ด์ธ์ด๋ค.
# ์ค์น
curl -fsSL https://bun.sh/install | bash
# ํ๋ก์ ํธ ์์ฑ ๋ฐ ์คํ
bun init
bun run index.ts # TypeScript๋ ํธ๋์คํ์ผ ์์ด ๋ฐ๋ก ์คํ2. ๋ด์ฅ ์น ์๋ฒ
Bun.serve์ ๋ผ์ฐํธ ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ฉด ๋ฐ๋ก API ์๋ฒ๊ฐ ๋๋ค. TypeScript ํธ๋์คํ์ผ, JS/CSS ๋ฒ๋ค๋ง, TLS, ํซ ๋ฆฌ๋ก๋ฉ๊น์ง ์๋์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
Bun.serve({
routes: {
"/": homepage, // HTML ํ์ผ์ importํด์ ๊ทธ๋๋ก ์๋น
"/api/users": () => Response.json(users),
},
});์ฝํ ์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ๋ ๋ด์ฅ๋์ด ์๋ค.
- ๋งํฌ๋ค์ด ๋ณํ:
Bun.markdown์ผ๋ก.mdํ์ผ์ HTML๋ก ๋ณํํด ๋ฐ๋ก ์๋น ๊ฐ๋ฅ. ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค ๋ CMS ์์ด ์ฒ๋ฆฌํ ์ ์๋ค - HTMLRewriter: HTML์์ ํน์ ID/์ ๋ ํฐ๋ฅผ ์ฐพ์ ๋ด์ฉ์ ๋ฐ๊พธ๋ ํ ํ๋ฆฟ ์์ง ์ญํ . ์ฌ์ฉ์๋ณ๋ก ๋ค๋ฅธ ๋ด์ฉ์ ๋์ ์ผ๋ก ์๋นํ ๋ ์ฌ์ฉ
- ํ์ผ ํ์: YAML, JSON, TOML ํ์๊ฐ ๋ด์ฅ๋์ด ์ค์ ํ์ผ ์ฒ๋ฆฌ์ ๋ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ ์๋ค
3. ๋ฐ์ดํฐ ์ ์ฅ์ ๋ฐ์ธ๋ฉ
SQL, Redis, S3 ํธํ ์คํ ๋ฆฌ์ง์ ๋ํ ๋ฐ์ธ๋ฉ์ด ๋ด์ฅ๋์ด ์์ด ๋๋ผ์ด๋ฒ ํจํค์ง๋ฅผ ์ค์นํ์ง ์์๋ ๋๋ค.
- Redis: ์ธ๋ฉ๋ชจ๋ฆฌ ํค-๊ฐ ์ ์ฅ์ ์ง์ ์ฐ๊ฒฐ. ์์์์๋ IP๋ณ ์นด์ดํฐ๋ฅผ 60์ด TTL๋ก ์ฆ๊ฐ์ํค๋ rate limiter๋ฅผ ๋ช ์ค๋ก ๊ตฌํํ๋ ์์๋ฅผ ๋ณด์ฌ์ค๋ค
- SQLite:
bun:sqlite๋๋ผ์ด๋ฒ๋ก ์๋ฒ๋ CLI ์ฑ์ ํ์ผ ๊ธฐ๋ฐ DB๋ฅผ ๋ฐ๋ก ๋ถ์ผ ์ ์๋ค. ์ธ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋๋ ์ง์
import { Database } from "bun:sqlite";
const db = new Database("data.db"); // ":memory:"๋ก ์ธ๋ฉ๋ชจ๋ฆฌ ์คํ ๊ฐ๋ฅ4. ์ธ์ฆ๊ณผ ๋คํธ์ํน
๋ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์ธ์ฆ ๊ตฌํ์ ํ์ํ ๊ธฐ๋ณธ ์์๋ฅผ ์ ๊ณตํ๋ค.
- UUID v4/v7 ์์ฑ
Bun.password๋ก ๋น๋ฐ๋ฒํธ ํด์ฑ๊ณผ ๊ฒ์ฆ- ์์ฒญ ๊ฐ์ฒด์์ ์ฟ ํค๋ฅผ ๋ฐ๋ก ์ค์ ํ๋ฉด ์๋ต์ ์๋ ๋ฐ์๋๋ ์ธ์ ๊ด๋ฆฌ
๋คํธ์ํน ๊ณ์ธต๋ ํญ๋๊ฒ ๋ด์ฅ๋์ด ์๋ค.
fetch๋ก ์ธ๋ถ API ํธ์ถ- WebSocket: pub/sub ํจํด ๋ด์ฅ, Node.js ๋๋น ์ต๋ 7๋ฐฐ ๋น ๋ฅด๋ค๊ณ ์ฃผ์ฅ. ์ฑํ , ์ค์๊ฐ ์์น ์ถ์ ๊ฐ์ ์๋ฐฉํฅ ํต์ ์ ์ฌ์ฉ (ํ๋กํ ์ฝ ์์ฒด๊ฐ ๊ถ๊ธํ๋ฉด WebSocket ํ๋กํ ์ฝ ์ค๊ณ์ ๋น๋ฐ ์ฐธ๊ณ )
- TCP/UDP ์์ผ, DNS ๋ชจ๋ ๊ฐ์ ์ ์์ค ํ๋ฆฌ๋ฏธํฐ๋ธ ์ ๊ณต
5. FFI์ ์ ์์ค ์ฐ๋
์ฑ๋ฅ์ด ์ค์ํ ๋ถ๋ถ์ C, Rust, Zig๋ก ์์ฑํ ๋ค FFI(Foreign Function Interface)๋ก ํธ์ถํ ์ ์๋ค. ์์์์๋ ๋ฐฐ์ด ๋ง์ ์ C๋ก ์ฎ๊ฒจ ์ฝ 3๋ฐฐ ๋นจ๋ผ์ง ์ฌ๋ก๋ฅผ ๋ณด์ฌ์ค๋ค.
ํน์ดํ ์ ์ ๊ฒฝ๋ C ์ปดํ์ผ๋ฌ์ธ TinyCC๋ฅผ ๋ด์ฅํ๊ณ ์๋ค๋ ๊ฒ์ด๋ค. C ์์ค ํ์ผ์ importํ๋ฉด ๋ฐํ์์ ๋ฐ๋ก ์ปดํ์ผ๋๋ฏ๋ก, ์ผ๋ฐ์ ์ธ FFI์ฒ๋ผ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋น๋ํด๋ ํ์๊ฐ ์๋ค.
6. ๋ฒ๋ค๋ฌ์ ํ ์คํธ ๋ฌ๋
bun build ./index.ts --outdir ./dist # ๋ฒ๋ค๋ง (Rollup/Webpack ๋๋น 200๋ฐฐ ๋น ๋ฆ ์ฃผ์ฅ)
bun build ./cli.ts --compile --outfile mycli # ๋จ๋
์คํ ๋ฐ์ด๋๋ฆฌ ์์ฑ
bun test # Jest ํธํ ํ
์คํธ ๋ฌ๋
bun test --watch # ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋ ์ฌ์คํ
bun test --concurrent # ํ
์คํธ ๋ณ๋ ฌ ์คํ--compile ํ๋๊ทธ๋ ๋ฐํ์์ด ํฌํจ๋ ๋จ์ผ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ง๋ค์ด์ฃผ๋ฏ๋ก, ๊ณ ์์ค ์ธ์ด๋ก ํฌ๋ก์ค ํ๋ซํผ CLI ์ฑ์ ๋ฐฐํฌํ๋ ์ฉ๋๋ก ์ธ ์ ์๋ค.
7. ํจํค์ง ๋งค๋์
Bun์ ํจํค์ง ๋งค๋์ ๋ npm, yarn, pnpm๊ณผ ๊ธฐ๋ฅ ๋๋ฑ์ฑ์ ์ ์งํ๋ฉด์ 10๋ฐฐ ์ด์ ๋น ๋ฅด๋ค. package.json๊ณผ node_modules ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก, Bun ๋ฐํ์์ผ๋ก ์ ํํ์ง ์๊ณ ๊ธฐ์กด Node.js ํ๋ก์ ํธ์์ ์ค์น ์๋๋ง ๋์ด๋ ์ฉ๋๋ก๋ ์ธ ์ ์๋ค.
bun install # ๊ธฐ์กด Node ํ๋ก์ ํธ์์๋ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
bun add zodํจํค์ง ๋งค๋์ ์ํ๊ณ ์ ๋ฐ์ ๋น๊ต๋ Package Manager Landscape - Why npm and How Tools Get Distributed ์ฐธ๊ณ .
8. ๋์ ํ๋จ
์ธ์ ์ธ๊น
- ์ ํ์คํ ํ๋ก์ ํธ๋ CLI ๋๊ตฌ: ๋๊ตฌ ์ฒด์ธ์ด ํ๋๋ก ์ค์ด๋๋ ์ด์ ์ด ๊ฐ์ฅ ํผ
- ๊ธฐ์กด Node ํ๋ก์ ํธ:
bun install๋ง ๋จผ์ ๋์ ํด ์ค์น ์๋ ๊ฐ์ ๊ฐ๋ฅ- ์ฃผ์: Node.js ์ํ๊ณ์ ๋๋ถ๋ถ ํธํ๋์ง๋ง, ๋ค์ดํฐ๋ธ ์ ๋์จ ๋ฑ ์ผ๋ถ ํจํค์ง๋ ๋์์ด ๋ค๋ฅผ ์ ์์ด ์ด์ ์ ๊ฒ์ฆ ํ์