October 04, 2023
9์ 8์ผ, ์๋ฐ์คํฌ๋ฆฝํธ ์ปค๋ฎค๋ํฐ์ ์๋ก์ด ์์์ด ๋ค๋ ค์์ต๋๋ค. Jarred Sumner๊ฐ ๋ง๋ Bun v1.0์ด ์ถ์๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ๊ถ๊ธํดํ๋ ๊ฒ์ด ์์ต๋๋ค. Bun์ ๋ณธ์ง์ ๋ฌด์์ผ๊น์? ์ ๋ชจ๋๊ฐ ์ด๋ฏธ ๊ฒ์ฆ๋ Node.js์ ๋น๊ตํ๋ ๊ฑธ๊น์? Bun์ ์ผ์์ ์ธ ํธ๋ ๋์ ๋ถ๊ณผํ ๊ฒ์ผ๊น์? ์๋๋ฉด ๊ธฐ์กด์ ํ๋๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ผ๊น์? ์ด ๊ธ์์๋ Bun๊ณผ ๊ทธ ๊ธฐ๋ฅ์ ๋ํด ์์ธํ ์์๋ณด๊ณ , ํ๊ณ ํ๊ฒ ์๋ฆฌ ์ก์ Node.js์ ์ด๋ป๊ฒ ๋น๊ต๋๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
Bun์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ ํ์ ์คํฌ๋ฆฝํธ ์ฑ์ ์ํ ์ด๊ณ ์ ์ฌ์ธ์ ๋๊ตฌ์ ๋๋ค. Bun์ ์ฅ์ ์ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ์ฌ ๊ทธ ์ด๋ ๋๋ณด๋ค ์ํํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์๋ค๋ ์ ์ ๋๋ค. ์ด๋ Bun์ด ๋จ์ํ ๋ฐํ์์ด ์๋๋ผ ํจํค์ง ๊ด๋ฆฌ์, ๋ฒ๋ค๋ฌ, ํ ์คํธ ๋ฌ๋์ ์ญํ ์ ๋์์ ์ํํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค. JS ๊ฐ๋ฐ์ ์ํ ์ค์์ค ๊ตฐ์ฉ ๋์ดํ๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. Bun์ด ๋ฐ๋ก ๊ทธ๊ฒ์ ๋๋ค.
(์ญ์ ์ฃผ : โ์ค์์ค ๊ตฐ์ฉ ๋์ดํ(Swiss Army knife)โ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ค๋ชฉ์ ๋๊ตฌ๋ฅผ ๋งํฉ๋๋ค.)
2009๋ Node.js์ ๋ฑ์ฅ์ ํ๊ธฐ์ ์ด์์ต๋๋ค. ํ์ง๋ง ๋ง์ ๊ธฐ์ ์ด ๊ทธ๋ ๋ฏ ๊ธฐ์ ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ ๋ณต์ก์ฑ๋ ํจ๊ป ์ฆ๊ฐํ์ต๋๋ค. ๋์๋ผ๊ณ ์๊ฐํด ๋ณด์ธ์. ๋์๊ฐ ์ปค์ง์๋ก ๊ตํต ํผ์ก์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
Bun์ ์ด๋ฌํ ํผ์ก์ ์ํํ์ฌ, ๋ ์ํํ๊ณ ๋น ๋ฅด๊ฒ ์์ง์ผ ์ ์๋ ์๋ก์ด ์ธํ๋ผ๊ฐ ๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. Bun์ ๊ธฐ์กด์ ๊ฒ์ ์ฌ์ฐฝ์กฐํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ํจ์ผ๋ก์จ ์๋์ ๋จ์์ฑ์ ํ๋ณดํ๋ ๋์์, ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ ํนํ๊ณ ๊ฐ๋ ฅํ ๋ณธ์ง์ ์์ง ์๋๋ก ํฉ๋๋ค.
Bun์ ๋ ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ๋ฉฐ Node.js๋ฅผ ๋์ฒดํ ์ ์๋ ๋ ํ๋์ ์ธ ๋๊ตฌ๋ก ์ค๊ณ๋์๋ค๊ณ ํ์ผ๋, ๋ช ๊ฐ์ง ๋น๊ต๋ฅผ ํตํด ์ง์ง์ธ์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ์ง๋ง ๋จผ์ ํ ๊ฐ์ง ๋ค๋ฅธ ์ฃผ์ ์ ๋ํด ๋ ผ์ํด ๋ณด๊ฒ ์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์ ๋ฐ์ ์ ๋ ผํ ๋ Deno๋ฅผ ๊ฐ๊ณผํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. Node.js์ ์ฐฝ์์์ธ Ryan Dahl์ Node.js์ ๋ฌธ์ ์ ๊ณผ ์์ฌ์ด ์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ์๋ก์ด ๋ฐํ์์ผ๋ก Deno๋ฅผ ์๊ฐํ์ต๋๋ค.
Deno๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ์์ ํ ๋ฐํ์์ ๋๋ค. ์ด ๋ฐํ์์ Node.js์ ์ฌ๋ฌ ๋จ์ ์ ์ง์ ์ ์ผ๋ก ํด๊ฒฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Deno๋ ์ธ๋ถ ๋๊ตฌ ์์ด๋ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํฉ๋๋ค. ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ด๋ฒ์ํ ๊ถํ์ด ๋ถ์ฌ๋๋ Node.js์ ๋ฌ๋ฆฌ, Deno๋ ๊ฐ๋ฐ์๊ฐ ํ์ผ ์์คํ ์ ๊ทผ ๋๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ๊ณผ ๊ฐ์ด ์ ์ฌ์ ์ผ๋ก ๋ฏผ๊ฐํ ์์ ์ ๋ํ ๊ถํ์ ๋ช ์์ ์ผ๋ก ๋ถ์ฌํด์ผ ํ๋ ๋ณด์ ์ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํฉ๋๋ค.
Deno๋ Node.js์ ๋ํ ๊ฐ๋ ฅํ ๋์์ ์ ์ํ์ง๋ง, Node.js๋งํผ ๊ด๋ฒ์ํ๊ฒ ์ฑํ๋์ง๋ ๋ชปํ์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ธ์์๋ Bun๊ณผ ํ๊ณ ํ๊ฒ ์๋ฆฌ ์ก์ Node.js๋ฅผ ๋์กฐํ๋ ๋ฐ ์ค์ ์ ๋์์ต๋๋ค.
Bun์ ์ฌ์ฉํ๋ฉด bun init -y
๋ช
๋ น์ผ๋ก ๋น ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ ํ์ผ์ด ์์ฑ๋์์ผ๋ฉฐ, index.ts์ console.log("Hello, Bun!")
๋ผ๋ ์ค์ ์ถ๊ฐํฉ๋๋ค. ํฐ๋ฏธ๋์์ bun index.ts
๋ช
๋ น์ ์คํํ๋ฉด โHello, Bun!โ์ด ๊ธฐ๋ก๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๊ณ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณตํ๋ ํ๊ฒฝ์ ๋๋ค.
Node.js์ Bun์ ๋ชจ๋ ๋ฐํ์์ ๋๋ค. Node.js๋ ์ฃผ๋ก C++๋ก ์์ฑ๋์ง๋ง, Bun์ ๋ก์ฐ ๋ ๋ฒจ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ Zig๋ก ์์ฑ๋์์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ๋น์ฐ์ ์ผ๊ฐ์ ๋ถ๊ณผํฉ๋๋ค. Bun์ ๋ฐํ์์ผ๋ก๋ง ์ทจ๊ธํ ๋์ ๋ค๋ฅธ ์ ์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ปดํจํฐ๊ฐ ํน์ ์์ ์ ์ํํ ์ ์๋ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ๋ณํํ๋ ํ๋ก๊ทธ๋จ์ ๋๋ค.
Node.js๋ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ตฌ๋ํ๋ ๊ตฌ๊ธ์ V8 ์์ง์ ์ฌ์ฉํ๋ ๋ฐ๋ฉด, Bun์ ์ ํ์์ ์ฌํ๋ฆฌ์ฉ์ผ๋ก ๊ฐ๋ฐํ ์คํ ์์ค ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ธ JavaScriptCore(JSC)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
V8๊ณผ JSC๋ ์ํคํ ์ฒ์ ์ต์ ํ ์ ๋ต์ด ๋ค๋ฆ ๋๋ค. JSC๋ ์คํ ์๊ฐ์ ์ฝ๊ฐ ๋๋ฆฌ์ง๋ง, ๋น ๋ฅธ ์์ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์๋ฅผ ์ฐ์ ์ํฉ๋๋ค. ๋ฐ๋ฉด V8์ ๋ฐํ์ ์ต์ ํ๋ฅผ ํตํด ๋น ๋ฅธ ์คํ์ ์ฐ์ ์ํ๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ด๋ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Bun์ Node.js๋ณด๋ค ์ต๋ 4๋ฐฐ ๋ ๋น ๋ฅด๊ฒ ์์ํ ์ ์์ต๋๋ค.
์์ฝ: bun์ deno๋ณด๋ค 2.19๋ฐฐ, node๋ณด๋ค 4.81๋ฐฐ ๋น ๋ฅด๊ฒ ์คํ๋์์ต๋๋ค.
Node.js๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋ฐํ์์ด์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ํ์
์คํฌ๋ฆฝํธ ํ์ผ์ ์ง์ํ์ง๋ ์์ต๋๋ค. Node.js ํ๊ฒฝ์์ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ค๋ฉด ์ธ๋ถ ์ข
์์ฑ์ด ํ์ํฉ๋๋ค. ํ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋น๋ ๋จ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ํ์
์คํฌ๋ฆฝํธ(TS)๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ(JS)๋ก ํธ๋์คํ์ผํ ๋ค์, ๊ฒฐ๊ณผ JS ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์
๋๋ค. ๋ค์์ ts-node
ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ค์ ์
๋๋ค.
npm install -D typescript ts-node
package.json
์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ํ์ฌ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ ์ ์์ต๋๋ค.
{
"scripts": {
"start": "ts-node ./path/to/your/file.ts"
}
}
์์ ์คํฌ๋ฆฝํธ์ ํจ๊ป ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฝ๊ฒ ์คํํ ์ ์์ต๋๋ค.
npm start
์ด์๋ ๋์กฐ์ ์ผ๋ก Bun์ ๋ณด๋ค ๊ฐ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ๋ฐํ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํธ๋์คํ์ผ๋ฌ๊ฐ ํตํฉ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ํตํด .js, .ts, .jsx
๋ฐ .tsx
ํ์ผ์ ์ง์ ์คํํ ์ ์์ต๋๋ค. Bun์ ๋ด์ฅ๋ ํธ๋์คํ์ผ๋ฌ๋ ์ด๋ฌํ ํ์ผ์ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ํํ๊ฒ ๋ณํํ์ฌ ์ถ๊ฐ ๋จ๊ณ ์์ด ์ฆ์ ์คํํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
bun index.ts
Node.js๋ฅผ ์คํํ๊ธฐ ์ ์ ๋ณํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ฏ๋ก, ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํํ ๋ ์๋ ์ฐจ์ด๊ฐ ๋ ๋ฒ์ด์ง๋๋ค.
๋ชจ๋ ์์คํ
์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ ์ธ๊ทธ๋จผํธ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ ๊ฐ์ง ์ฃผ์ ๋ชจ๋ ์์คํ
์ CommonJS์ ES Module(ESM)์
๋๋ค. Node.js์์ ์์๋ CommonJS๋ ๋๊ธฐ์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ์ํด require
์ module.exports
๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์๋ฒ ์ฌ์ด๋ ์์
์ ์ด์์ ์
๋๋ค.
ES6์ ๋์
๋ ESM์ import
๋ฐ export
๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ต์ ๋น๋ ๋๊ตฌ์ ์ต์ ํ๋ ๋ณด๋ค ์ ์ ์ด๊ณ ๋น๋๊ธฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ ์์คํ
์ ๋ ์ ์ดํดํ๊ธฐ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ ๊ฐ์ง ํจํค์ง์ธ CommonJS์ colors
ํจํค์ง์ ESM์ chalk
ํจํค์ง๋ฅผ ์ด์ฉํ์ฌ ์ฝ์์ ์์์ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
Node.js๋ ์ ํต์ ์ผ๋ก CommonJS ๋ชจ๋ ์์คํ ๊ณผ ์ฐ๊ด๋์ด ์์ต๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์์์ ๋๋ค.
// Node.js์์์ CommonJS (index.js)
const colors = require('colors');
console.log(colors.green('Hello, world!'));
Node.js์ ES ๋ชจ๋์ ๊ฒฝ์ฐ, ๋ ๊ฐ์ง ์ต์ ์ค ํ๋๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.
package.json
์ "type": "module"
์ ํฌํจํด์ผ ํฉ๋๋ค..mjs
ํ์ฅ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.// Node.js์์์ ESM (index.mjs)
import chalk from 'chalk';
console.log(chalk.blue('Hello, world!'));
CommonJS์์ ES Module(ESM)๋ก์ ์ ํ์ ๋ณต์กํ ์ฌ์ ์ด์์ต๋๋ค. Node.js๋ ESM์ด ๋์ ๋ ์ง ๋ฐ๋ ์ด ์ง๋ ํ์์ผ ์คํ์ (experimental) ํ๋๊ทธ ์์ด ESM์ ์ง์ํ๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ CommonJS๋ ์ฌ์ ํ ์ํ๊ณ์์ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
Bun์ ํน๋ณํ ์ค์ ์์ด ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ง์ํ์ฌ ๋ชจ๋ ์์คํ
์ ๊ฐ์ํํฉ๋๋ค. Bun์ ๋ฐ์ด๋ ๊ธฐ๋ฅ์ ๋์ผํ ํ์ผ์์ import
์ require()
๋ฅผ ๋ชจ๋ ์ง์ํ ์ ์๋ค๋ ์ ์ธ๋ฐ, ์ด๋ Node.js์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ ๊ธฐ๋ฅ์
๋๋ค.
// Bun์์์ ํผํฉ ๋ชจ๋ (index.js)
import chalk from 'chalk';
const colors = require('colors');
console.log(chalk.magenta('Hello from chalk!'));
console.log(colors.cyan('Hello from colors!'));
๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ํ์์ ์ธ ์น API๋ ์น ์ํธ ์์ฉ์ ์ํ fetch
๋ฐ WebSocket
๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๋ธ๋ผ์ฐ์ ํ์ค์ด ๋์์ง๋ง, Node.js์ ๊ฐ์ ์๋ฒ ์ฌ์ด๋ ํ๊ฒฝ์์์ ์ง์์ ์ผ๊ด์ฑ์ด ์์์ต๋๋ค.
์ด์ ๋ฒ์ ์ Node.js์์๋ ๋ธ๋ผ์ฐ์ ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์น ํ์ค API๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋์ง ์์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ด ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ์ํด node-fetch
์ ๊ฐ์ ์๋ํํฐ ํจํค์ง์ ์์กดํด์ผ ํ์ต๋๋ค. ํ์ง๋ง Node.js v18๋ถํฐ๋ fetch
API๊ฐ ์คํ์ ์ผ๋ก ์ง์๋์ด ์ด๋ฌํ ํจํค์ง๊ฐ ํ์ํ์ง ์๊ฒ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
Bun์ ์ด๋ฌํ ์น ํ์ค API์ ๋ํ ๊ธฐ๋ณธ ์ง์์ ์ ๊ณตํ์ฌ ์ด ๊ณผ์ ์ ๊ฐ์ํํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์ถ๊ฐ ํจํค์ง ์์ด๋ ์์ ์ ์ธ fetch
, Request
, Response
, WebSocket
๋ฐ ๊ธฐํ ๋ธ๋ผ์ฐ์ ์ ์ ์ฌํ API๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ, Bun์ ์ด๋ฌํ ์น API๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์๋ํํฐ ๋์์ ๋นํด ๋ ๋น ๋ฅด๊ณ ์์ ์ ์
๋๋ค.
๋ค์์ Node.js(v18 ์ด์) ๋ฐ Bun๊ณผ ๋ชจ๋ ํธํ๋๋ ์์ ์ ๋๋ค. Node.js์์๋ ์คํ์ ์ด์ง๋ง, Bun์์๋ ๋์ผํ ๊ธฐ๋ฅ์ด ์์ ์ ์ผ๋ก ์๋ํฉ๋๋ค.
// Node.js(v18 ์ด์)์ ์คํ์ fetch ๋ฐ Bun์ ๋ด์ฅ fetch
async function fetchUserData() {
const response = await fetch('https://jsonplaceholder.typicode.com/users/1');
const user = await response.json();
console.log(user.name);
}
fetchUserData(); // Leanne Graham
ํซ ๋ฆฌ๋ก๋ฉ์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ ์ฒด ์ฌ์์ ์์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ๋ฅผ ์ค์๊ฐ์ผ๋ก ์๋์ผ๋ก ์๋ก ๊ณ ์น๊ฑฐ๋ ๋ค์ ๋ก๋ํ์ฌ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ๋์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค.
Node.js ์ํ๊ณ์๋ ํซ ๋ฆฌ๋ก๋ฉ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ต์
์ด ์์ต๋๋ค. ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋๊ตฌ ์ค ํ๋๋ ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ฌ์์ํ๋ nodemon
์
๋๋ค.
nodemon index.js
๋๋ Node.js v18๋ถํฐ ์คํ์ ์ผ๋ก --watch
ํ๋๊ทธ๊ฐ ๋์
๋์์ต๋๋ค.
node --watch index.js
๋ ๋ฐฉ๋ฒ ๋ชจ๋ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์๊ฐ์ผ๋ก ๋ค์ ๋ก๋ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํน์ ํ๊ฒฝ์ด๋ ์๋๋ฆฌ์ค์์๋ ์๋ก ๋ค๋ฅธ ๋์์ ๋ณด์ผ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, nodemon
์ HTTP ๋ฐ ์น์์ผ ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ ๋ฑ์ ์ฅ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฉฐ, --watch
ํ๋๊ทธ๋ ์คํ ์ค์ด๋ฏ๋ก ์ ์ฒด ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ ์ ์์ผ๋ฉฐ, GitHub ์ด์์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ณด๊ณ ๋์์ต๋๋ค.
Bun์ ํซ ๋ฆฌ๋ก๋ฉ ๊ธฐ๋ฅ์ ํ ๋จ๊ณ ๋ ๋ฐ์ ์์ผฐ์ต๋๋ค. --hot
ํ๋๊ทธ์ ํจ๊ป Bun์ ์คํํ๋ฉด ํซ ๋ฆฌ๋ก๋ฉ์ด ํ์ฑํ๋ฉ๋๋ค.
bun --hot index.ts
์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํด์ผ ํ๋ Node.js ๋ฉ์๋์ ๋ฌ๋ฆฌ Bun์ ์ด์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ์ง ์๊ณ ์ ์๋ฆฌ์์ ์ฝ๋๋ฅผ ๋ค์ ๋ก๋ํฉ๋๋ค. ๋ฐ๋ผ์ HTTP ๋ฐ ์น์์ผ ์ฐ๊ฒฐ์ด ์ค๋จ๋์ง ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ํ๊ฐ ์ ์ง๋๋ฏ๋ก ๋ณด๋ค ์ํํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
์๋ก์ด ๋ฐํ์์ด๋ ํ๊ฒฝ์ผ๋ก ์ ํํ ๋, ํธํ์ฑ์ ๊ฐ๋ฐ์์ ์ฃผ์ ๊ด์ฌ์ฌ์ ๋๋ค. Bun์ Node.js๋ฅผ ๋์ฒดํ๋ ๋๊ตฌ๋ก ํฌ์ง์ ๋ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ฆ, ๊ธฐ์กด Node.js ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ npm ํจํค์ง๋ฅผ ์์ ํ์ง ์๊ณ ๋ Bun๊ณผ ์ํํ๊ฒ ํตํฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํธํ์ฑ์ ๋ณด์ฅํ๋ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
fs
,path
,net
๊ณผ ๊ฐ์ ๋ด์ฅ Node.js ๋ชจ๋์ ์ง์ํฉ๋๋ค.__dirname
๊ณผ process
๊ฐ์ ์ ์ญ ๋ณ์๋ฅผ ์ธ์ํฉ๋๋ค.node_modules
๊ตฌ์กฐ๋ฅผ ํฌํจํ Node.js ๋ชจ๋ ํ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ํฉ๋๋ค.Bun์ ๊ณ์ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ ํ๋๋ก ๋ง์ถคํ๋์ด ์์ผ๋ฉฐ, ์๋ฒ๋ฆฌ์ค ๊ธฐ๋ฅ๊ณผ ๊ฐ์ด ๋ฆฌ์์ค๊ฐ ์ ํ๋ ํ๊ฒฝ์ ์ด์์ ์ ๋๋ค. Bun์ ๊ฐ๋ฐํ์ ํฌ๊ด์ ์ธ Node.js ํธํ์ฑ๊ณผ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ์์ ๋ ๋์ ํตํฉ์ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
Bun์ Node.js์์ ํธํ์ฑ์ ๋ณด์ฅํ์ง๋ง ๊ฑฐ๊ธฐ์ ๋ฉ์ถ์ง ์์ต๋๋ค. Bun์ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ํ์ํ ๊ธฐ๋ฅ์ ์ํด ๊ณ ๋๋ก ์ต์ ํ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ API๋ฅผ ํจ๊ป ์ ๊ณตํฉ๋๋ค.
ํ์ผ์ ๋๋ฆฌ๊ฒ ๋ก๋ํ๊ณ ๋ค์ํ ํ์์ผ๋ก ์ฝํ ์ธ ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ Node.js๋ณด๋ค ์ต๋ 10๋ฐฐ ๋น ๋ฆ ๋๋ค.
// Bun (index.ts)
const file = Bun.file('package.json');
await file.text();
// Node.js (index.mjs)
const fs = require('fs/promises');
const fileContents = await fs.readFile('package.json', 'utf-8');
๋ฌธ์์ด๋ถํฐ ๋ธ๋กญ(Blob)๊น์ง ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ธ ์ ์๋ ๋ค์ฉ๋ API์ ๋๋ค. Node.js๋ณด๋ค ์ต๋ 3๋ฐฐ ๋น ๋ฅด๊ฒ ๊ธฐ๋กํฉ๋๋ค.
// Bun (index.ts)
await Bun.write('index.html', '<html/>');
// Node.js (index.mjs)
const fs = require('fs/promises');
await fs.writeFile('index.html', '<html/>');
์น ํ์ค API๋ฅผ ์ฌ์ฉํ์ฌ HTTP ์๋ฒ ๋๋ ์น์์ผ ์๋ฒ๋ฅผ ์ค์ ํฉ๋๋ค. Node.js๋ณด๋ค ์ด๋น 4๋ฐฐ ๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ Node.js์ ws
ํจํค์ง๋ณด๋ค 5๋ฐฐ ๋ ๋ง์ ์น์์ผ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด ๋ฐฑ์๋ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ์๊ฐ Node.js์์ Express๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ์ง๋ง, Bun์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํตํด ์ถ๊ฐ์ ์ธ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
// Bun (index.ts)
Bun.serve({
port: 3000,
fetch(request) {
return new Response('Hello from Bun!');
},
});
// Node.js (index.mjs)
import http from 'http';
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from Node.js!');
});
server.listen(3000);
Bun์ ๋ํ sqlite์ password๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
Bun์ ๋จ์ํ ๋ฐํ์์ด ์๋๋ผ ๊ฐ๋ ฅํ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ํฌํจ๋ ๊ณ ๊ธ ๋๊ตฌ์ ๋๋ค. ์ข ์์ฑ์ ์ค์นํ๋ ๋์ ์ธ๋ด์ฌ์ ๊ฐ๊ณ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒฝํ์ด ์๋ค๋ฉด Bun์ ๋๋๋๋ก ๋น ๋ฅธ ๋์์ ์ ๊ณตํฉ๋๋ค. Bun์ ๋ฐํ์์ผ๋ก ์ฌ์ฉํ์ง ์๋๋ผ๋, ๋ด์ฅ๋ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
์๋ ํ์์ Bun ์ปค๋งจ๋๋ฅผ Node์ ํจํค์ง ๊ด๋ฆฌ์ npm๊ณผ ๋น๊ตํด ๋ณด์ธ์.
Bun | npm | ๋ชฉ์ |
---|---|---|
bun install |
npm install |
package.json ์ ๋ชจ๋ ์ข
์์ฑ ์ค์น |
bun add <package> |
npm install <package> |
ํ๋ก์ ํธ์ ์ ํจํค์ง ์ถ๊ฐ |
bun add <package> --dev |
npm install <package> --dev |
์ ๊ฐ๋ฐ ์ ์ฉ ํจํค์ง ์ถ๊ฐ |
bun remove <package> |
npm uninstall <package> |
ํ๋ก์ ํธ์์ ํจํค์ง ์ ๊ฑฐ |
bun update <package> |
npm update <package> |
ํน์ ํจํค์ง๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ |
bun run <script> |
npm run <script> |
package.json ์์ ์ง์ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ |
์ธ๋ป ๋ณด๊ธฐ์ Bun์ ๋ช ๋ น์ ์ต์ํด ๋ณด์ด์ง๋ง ๊ฒฝํ์ ์ ํ ํ๋ฒํ์ง ์์ต๋๋ค. Bun์ npm๋ณด๋ค ๋ช ๋ฐฐ๋ ๋น ๋ฅธ ์ค์น ์๋๋ฅผ ์๋ํฉ๋๋ค. ์ด๋ ์ ์ญ ๋ชจ๋ ์บ์๋ฅผ ํ์ฉํ์ฌ npm ๋ ์ง์คํธ๋ฆฌ์์ ์ค๋ณต ๋ค์ด๋ก๋๋ฅผ ์ ๊ฑฐํจ์ผ๋ก์จ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ๋ํ Bun์ ๊ฐ ์ด์ ์ฒด์ ์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ์์คํ ํธ์ถ์ ์ฌ์ฉํ์ฌ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.
๋ค์์ ์บ์์์ Remix ํ๋ก์ ํธ ์คํํฐ์ ์ข
์ ์์๋ฅผ ์ค์นํ๋ ์๋ ๋น๊ต๋ก, Bun๊ณผ npm์ ๋น๊ตํ ๊ฒ์
๋๋ค.
bun
CLI์๋npm
,yarn
,pnpm
์ ํ๊ธฐ์ ์ผ๋ก ๋น ๋ฅด๊ฒ ๋์ฒดํ ์ ์๋๋ก ์ค๊ณ๋ Node.js์ ํธํ ๊ฐ๋ฅํ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๋ํ, bun run <command>
๋ 7ms๋ฐ์ ๊ฑธ๋ฆฌ์ง ์๋ ๋ฐ๋ฉด, npm run <command>
๋ 176ms๊ฐ ๊ฑธ๋ฆฝ๋๋ค. Node.js์ npm์ ์๋
๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํจํค์ง ๊ด๋ฆฌ์ ํ์ค์ด์์ง๋ง, Bun์ ์๋ ๋ฉด์์ ์ ๋ง ๊ฐ๋ ฅํ๋ฉฐ ๋งค๋ ฅ์ ์ธ ๋์์ ์ ์ํฉ๋๋ค.
๋ฒ๋ค๋ง์ ์ฌ๋ฌ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ฐ์ ธ์์ ํ๋ ์ด์์ ์ต์ ํ๋ ๋ฒ๋ค๋ก ๋ณํฉํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ด ๊ณผ์ ์๋ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํํ๊ฑฐ๋ ์ฝ๋๋ฅผ ์ถ์ํ์ฌ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฑ์ ๋ณํ ์์ ๋ ํฌํจ๋ ์ ์์ต๋๋ค.
Node.js ์ํ๊ณ์์ ๋ฒ๋ค๋ง์ ์ผ๋ฐ์ ์ผ๋ก Node.js ์์ฒด๋ณด๋ค๋ ์๋ํํฐ ๋๊ตฌ๋ฅผ ํตํด ์ฒ๋ฆฌํฉ๋๋ค. Node.js ์ธ๊ณ์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ฒ๋ค๋ฌ๋ก๋ ์ฝ๋ ๋ถํ , ํธ๋ฆฌ ์์ดํน, ํซ ๋ชจ๋ ๊ต์ฒด์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Webpack, Rollup, Parcel ๋ฑ์ด ์์ต๋๋ค.
๋ฐ๋ฉด์ Bun์ ๋ฐํ์์ด์ ํจํค์ง ๊ด๋ฆฌ์์ผ ๋ฟ๋ง ์๋๋ผ ๊ทธ ์์ฒด๋ก ๋ฒ๋ค๋ฌ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ํ๋ฐํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ (React ๋๋ Next.js ์ ํ๋ฆฌ์ผ์ด์ ) ๋ฐ Node.js๋ฅผ ๋น๋กฏํ ๋ค์ํ ํ๋ซํผ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ฒ๋ค๋งํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
Bun์ผ๋ก ๋ฒ๋ค๋งํ๋ ค๋ฉด ๊ฐ๋จํ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
bun build ./index.ts --outdir ./build
์ด ๋ช
๋ น์ index.ts
ํ์ผ์ ๋ฒ๋ค๋งํ์ฌ ./build
๋๋ ํฐ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๋ฒ๋ค๋ง ํ๋ก์ธ์ค๋ ๋งค์ฐ ๋น ๋ฅด๋ฉฐ, Bun์ esbuild๋ณด๋ค 1.75๋ฐฐ ๋น ๋ฅด๋ฉฐ Parcel ๋ฐ Webpack๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฒ๋ค๋ฌ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ
๋๋ค.
Bun์ 0.17์ด, esbuild๋ 0.3์ด, rspack์ 4.45์ด, Parcel 2๋ 26.32์ด, Rollup์ 32์ด, Webpack 5๋ 38.02์ด๊ฐ ์์๋ฉ๋๋ค.
Bun์์ ๋์ ๋๋ ๊ธฐ๋ฅ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋งคํฌ๋ก๋ฅผ ๋์ ํ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฒ๋ค๋ง ์ค์ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ฅผ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ต์ข ๋ฒ๋ค์ ์ง์ ํฌํจํ ์ ์์ต๋๋ค. ์ด ๋ฉ์ปค๋์ฆ์ ๋ฒ๋ค๋ง์ ๋ํ ์๋ก์ด ๊ด์ ์ ์ ๊ณตํฉ๋๋ค.
Bun์ ์๋ฐ์คํฌ๋ฆฝํธ ๋งคํฌ๋ก๋ฅผ ํ์ฉํ์ฌ ๋ฒ๋ค๋ง ํ๋ก์ธ์ค ์ค์ ์ฌ์ฉ์ ์ด๋ฆ์ ๊ฐ์ ธ์ค๋ ์ด ์์๋ฅผ ํ์ธํด ๋ณด์ธ์. ๋งคํฌ๋ก๋ ๋ฐํ์ API๋ฅผ ํธ์ถํ๋ ๋์ ๋ฒ๋ค ํ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ฒฐ๊ณผ๋ฅผ ์ต์ข ์ถ๋ ฅ์ ์ง์ ํฌํจ์ํต๋๋ค.
// users.ts
export async function getUsername() {
const response = await fetch("https://jsonplaceholder.typicode.com/users/1");
const user = await response.json();
return user.name;
}
// index.ts
import { getUsername } from "./users.ts" with { type: "macro" };
const username = await getUsername();
// build/index.js
var user = await "Leanne Graham";
console.log(user);
Node.js์๋ ์ด๋ฏธ ํ๊ณ ํ ๋ฒ๋ค๋ง ๋๊ตฌ๊ฐ ์์ง๋ง, Bun์ ๋ฒ๋ค๋ง ํ๊ฒฝ์ ์ฌํธํ ์ ์๋ ํตํฉ์ ์ด๊ณ ๋น ๋ฅด๋ฉฐ ํ์ ์ ์ธ ๋์์ ์ ๊ณตํฉ๋๋ค.
ํ ์คํธ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ค์ํ ์ธก๋ฉด์ผ๋ก, ์ฝ๋๊ฐ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ณ , ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ํ๋ก๋์ ๋ฐฐํฌ ์ ์ ํฌ์ฐฉํฉ๋๋ค. Bun์ ๋ฐํ์, ํจํค์ง ๊ด๋ฆฌ์, ๋ฒ๋ค๋ฌ์ผ ๋ฟ ์๋๋ผ ํ ์คํธ ๋ฌ๋ ์ญํ ๋ ์ํํฉ๋๋ค.
Node.js ๊ฐ๋ฐ์๋ ์ ํต์ ์ผ๋ก ํ ์คํธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด Jest์ ์์กดํด ์์ง๋ง, Bun์ ์๋, ํธํ์ฑ ๋ฐ ์ต์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ๋ง๋ ๋ค์ํ ๊ธฐ๋ฅ์ ๋ณด์ฅํ๋ ๋ด์ฅ๋ ํ ์คํธ ๋ฌ๋๋ฅผ ๋์ ํ์ต๋๋ค.
Bun์ ํ
์คํธ ๋ฌ๋์ธ bun:test
๋ โexpectโ ์คํ์ผ API๋ก ์ ์๋ ค์ง ํ
์คํธ ํ๋ ์์ํฌ์ธ Jest์ ์๋ฒฝํ๊ฒ ํธํ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด๋ฌํ ํธํ์ฑ ๋๋ถ์ Jest์ ์ต์ํ ๊ฐ๋ฐ์๋ ๊ฐํ๋ฅธ ํ์ต ๊ณก์ ์์ด๋ Bun์ผ๋ก ์ฝ๊ฒ ์ ํํ ์ ์์ต๋๋ค.
import { test, expect } from 'bun:test';
test('2 + 2', () => {
expect(2 + 2).toBe(4);
});
bun test
๋ช
๋ น์ผ๋ก ๊ฐ๋จํ๊ฒ ํ
์คํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๋ํ Bun์ ๋ฐํ์์ ํ์
์คํฌ๋ฆฝํธ์ JSX๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ฏ๋ก ์ถ๊ฐ ๊ตฌ์ฑ์ด๋ ํ๋ฌ๊ทธ์ธ์ด ํ์ํ์ง ์์ต๋๋ค.
ํธํ์ฑ์ ๋ํ Bun์ ๋
ธ๋ ฅ์ Jest์ ์ ์ญ ์ํฌํธ ์ง์์ ํตํด ๋น์ ๋ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, @jest/global
๋๋ vitest
์์ ์ํฌํธํ๋ฉด ๋ด๋ถ์ ์ผ๋ก bun:test
๋ก ๋ค์ ๋งคํ๋ฉ๋๋ค. ์ฆ, ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ธฐ์กด ํ
์คํธ ์ค์ํธ(suties)๋ฅผ Bun์์ ์คํํ ์ ์์ต๋๋ค.
// index.test.ts
import { test } from '@jest/globals';
describe('test suite', () => {
test('addition', () => {
expect(1 + 1).toBe(2);
});
});
Bun์ ํ
์คํธ ๋ฌ๋๋ ํธํ์ฑ๋ฟ๋ง ์๋๋ผ ์๋๋ ๋ฐ์ด๋ฉ๋๋ค. Zod ํ
์คํธ ์ค์ํธ์ ๋ํ ๋ฒค์น๋งํฌ์์ Bun์ Jest๋ณด๋ค 13๋ฐฐ, Vitest๋ณด๋ค 8๋ฐฐ ๋น ๋ฅธ ๊ฒ์ผ๋ก ์
์ฆ๋์์ต๋๋ค. ์ด๋ฌํ ์๋ ์ฐ์๋ ๋น ๋ฅธ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๊ตฌํ๋ Bun์ ๋งค์ฒ(matchers)๋ฅผ ํตํด ๋์ฑ ๋๋๋ฌ์ง๋๋ค. ์๋ฅผ ๋ค์ด, Bun์ expect().toEqual()
์ Jest๋ณด๋ค ๋ฌด๋ ค 100๋ฐฐ, Vitest๋ณด๋ค 10๋ฐฐ ๋น ๋ฆ
๋๋ค.
๊ธฐ์กด ํ ์คํธ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ , Bun์ ์ต์ ๊ฐ๋ฐ ์๊ตฌ์ฌํญ์ ๋ถํฉํ๋ ๊ฐ๋ ฅํ ํ ์คํธ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
Node.js๋ ์ค๋ซ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ๊ณ์์ ๊ธฐ์ค์ด ๋์ด ๊ฐ๋ฐ์๋ฅผ ์๋ดํ๋ ์ด์ ์ญํ ์ ํด์์ต๋๋ค. ํ์ง๋ง Bun์ ์ฃผ๋ชฉํ ๋งํ ๋์ ์๋ก ๋ฑ์ฅํ์ฌ ๊ฒฝ๊ณ๋ฅผ ํ๋ฌผ๊ณ ์์ต๋๋ค.
์์ง์ ์ด๊ธฐ ๋จ๊ณ์ด์ง๋ง Bun์ด ๋ถ๋ฌ์ผ์ผํค๊ณ ์๋ ํ์ ๋ ๋ถ์ ํ ์ ์์ต๋๋ค. ํ์ฌ MacOS์ Linux์ ์ต์ ํ๋์ด ์์ผ๋ฉฐ, Windows ์ง์๋ ์งํ ์ค์ด์ง๋ง ์ผ๋ถ ๊ธฐ๋ฅ์ ๊ณง ์ถ๊ฐ๋ ์์ ์ ๋๋ค. ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Bun์ ๊ผญ ํ ๋ฒ ์ดํด๋ด์ผ ํ ๋๊ตฌ์ ๋๋ค.
๐ ํ๊ตญ์ด๋ก ๋ ํ๋ฐํธ์๋ ์ํฐํด์ ๋น ๋ฅด๊ฒ ๋ฐ์๋ณด๊ณ ์ถ๋ค๋ฉด Korean FE Article(https://kofearticle.substack.com/)์ ๊ตฌ๋ ํด์ฃผ์ธ์!