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 ์ƒํƒœ๊ณ„์™€ ๋Œ€๋ถ€๋ถ„ ํ˜ธํ™˜๋˜์ง€๋งŒ, ๋„ค์ดํ‹ฐ๋ธŒ ์• ๋“œ์˜จ ๋“ฑ ์ผ๋ถ€ ํŒจํ‚ค์ง€๋Š” ๋™์ž‘์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด ์šด์˜ ์ „ ๊ฒ€์ฆ ํ•„์š”