(๋ฒˆ์—ญ) Bun vs Node.js : ๋‹น์‹ ์ด ์•Œ์•„์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ๋“ค

์›๋ฌธ: Bun vs Node.js: Everything you need to know

9์›” 8์ผ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ƒˆ๋กœ์šด ์†Œ์‹์ด ๋“ค๋ ค์™”์Šต๋‹ˆ๋‹ค. Jarred Sumner๊ฐ€ ๋งŒ๋“  Bun v1.0์ด ์ถœ์‹œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ถ๊ธˆํ•ดํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Bun์˜ ๋ณธ์งˆ์€ ๋ฌด์—‡์ผ๊นŒ์š”? ์™œ ๋ชจ๋‘๊ฐ€ ์ด๋ฏธ ๊ฒ€์ฆ๋œ Node.js์™€ ๋น„๊ตํ•˜๋Š” ๊ฑธ๊นŒ์š”? Bun์€ ์ผ์‹œ์ ์ธ ํŠธ๋ Œ๋“œ์— ๋ถˆ๊ณผํ•œ ๊ฒƒ์ผ๊นŒ์š”? ์•„๋‹ˆ๋ฉด ๊ธฐ์กด์˜ ํŒ๋„๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ผ๊นŒ์š”? ์ด ๊ธ€์—์„œ๋Š” Bun๊ณผ ๊ทธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ , ํ™•๊ณ ํ•˜๊ฒŒ ์ž๋ฆฌ ์žก์€ Node.js์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Bun์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Bun์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์•ฑ์„ ์œ„ํ•œ ์ดˆ๊ณ ์† ์˜ฌ์ธ์› ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Bun์˜ ์žฅ์ ์€ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•˜์—ฌ ๊ทธ ์–ด๋А ๋•Œ๋ณด๋‹ค ์›ํ™œํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Bun์ด ๋‹จ์ˆœํ•œ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž, ๋ฒˆ๋“ค๋Ÿฌ, ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ์˜ ์—ญํ• ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. JS ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์Šค์œ„์Šค ๊ตฐ์šฉ ๋‚˜์ดํ”„๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. Bun์ด ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์—ญ์ž ์ฃผ : โ€œ์Šค์œ„์Šค ๊ตฐ์šฉ ๋‚˜์ดํ”„(Swiss Army knife)โ€œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ๋‹ค๋ชฉ์  ๋„๊ตฌ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.)

Bun์€ ๋ฌด์—‡์„ ํ•ด๊ฒฐํ•˜๋‚˜์š”?

2009๋…„ Node.js์˜ ๋“ฑ์žฅ์€ ํš๊ธฐ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŽ์€ ๊ธฐ์ˆ ์ด ๊ทธ๋ ‡๋“ฏ ๊ธฐ์ˆ ์ด ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ๋ณต์žก์„ฑ๋„ ํ•จ๊ป˜ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์‹œ๋ผ๊ณ  ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. ๋„์‹œ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ตํ†ต ํ˜ผ์žก์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bun์€ ์ด๋Ÿฌํ•œ ํ˜ผ์žก์„ ์™„ํ™”ํ•˜์—ฌ, ๋” ์›ํ™œํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์ธํ”„๋ผ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. Bun์€ ๊ธฐ์กด์˜ ๊ฒƒ์„ ์žฌ์ฐฝ์กฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐœ์„ ํ•จ์œผ๋กœ์จ ์†๋„์™€ ๋‹จ์ˆœ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋™์‹œ์—, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋…ํŠนํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋ณธ์งˆ์„ ์žƒ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Bun์€ ๋” ๋น ๋ฅด๊ณ  ๊ฐ„๊ฒฐํ•˜๋ฉฐ Node.js๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋” ํ˜„๋Œ€์ ์ธ ๋„๊ตฌ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ, ๋ช‡ ๊ฐ€์ง€ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ง„์งœ์ธ์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋จผ์ € ํ•œ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ฃผ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Node.js vs Deno vs Bun

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์˜ ๋ฐœ์ „์„ ๋…ผํ•  ๋•Œ 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!โ€์ด ๊ธฐ๋ก๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bun vs Node.js : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค.

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 ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ์„ค์ •์ž…๋‹ˆ๋‹ค.

1. ์„ค์น˜

npm install -D typescript ts-node

2. ์Šคํฌ๋ฆฝํŠธ ์„ค์ •

package.json์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "scripts": {
    "start": "ts-node ./path/to/your/file.ts"
  }
}

3. ์‹คํ–‰

์œ„์˜ ์Šคํฌ๋ฆฝํŠธ์™€ ํ•จ๊ป˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm start

์ด์™€๋Š” ๋Œ€์กฐ์ ์œผ๋กœ Bun์€ ๋ณด๋‹ค ๊ฐ„์†Œํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด .js, .ts, .jsx ๋ฐ .tsx ํŒŒ์ผ์„ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Bun์— ๋‚ด์žฅ๋œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์›ํ™œํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถ”๊ฐ€ ๋‹จ๊ณ„ ์—†์ด ์ฆ‰์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

bun index.ts

Node.js๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ๋•Œ ์†๋„ ์ฐจ์ด๊ฐ€ ๋” ๋ฒŒ์–ด์ง‘๋‹ˆ๋‹ค.

ESM ๋ฐ CommonJS ํ˜ธํ™˜์„ฑ

๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ๊ทธ๋จผํŠธ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ 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 ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ, ๋‘ ๊ฐ€์ง€ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. package.json์— "type": "module"์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. .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

๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์ˆ˜์ ์ธ ์›น 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 ๋ฐ ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๋ฏ€๋กœ ๋ณด๋‹ค ์›ํ™œํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Node.js ํ˜ธํ™˜์„ฑ

์ƒˆ๋กœ์šด ๋Ÿฐํƒ€์ž„์ด๋‚˜ ํ™˜๊ฒฝ์œผ๋กœ ์ „ํ™˜ํ•  ๋•Œ, ํ˜ธํ™˜์„ฑ์€ ๊ฐœ๋ฐœ์ž์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค. 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๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Bun API

Bun.file()

ํŒŒ์ผ์„ ๋А๋ฆฌ๊ฒŒ ๋กœ๋“œํ•˜๊ณ  ๋‹ค์–‘ํ•œ ํ˜•์‹์œผ๋กœ ์ฝ˜ํ…์ธ ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ 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');

Bun.write()

๋ฌธ์ž์—ด๋ถ€ํ„ฐ ๋ธ”๋กญ(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/>');

Bun.serve()

์›น ํ‘œ์ค€ 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 vs Node.js: ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž

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์€ ์†๋„ ๋ฉด์—์„œ ์ •๋ง ๊ฐ•๋ ฅํ•˜๋ฉฐ ๋งค๋ ฅ์ ์ธ ๋Œ€์•ˆ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Bun vs Node.js: ๋ฒˆ๋“ค๋Ÿฌ

๋ฒˆ๋“ค๋ง์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์ถ•์†Œํ•˜์—ฌ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๋“ฑ์˜ ๋ณ€ํ™˜ ์ž‘์—…๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 vs Node.js : ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ

ํ…Œ์ŠคํŠธ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ์ค‘์š”ํ•œ ์ธก๋ฉด์œผ๋กœ, ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „์— ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. 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๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€ ๊ตฌ์„ฑ์ด๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Jest ๋˜๋Š” Vitest์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ

ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ 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/)์„ ๊ตฌ๋…ํ•ด์ฃผ์„ธ์š”!


[Ykss]
Written by@[Ykss]
๊ณ ์ด๊ฒŒ ๋‘์ง€ ์•Š๊ณ  ํ˜๋ ค๋ณด๋‚ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์ž.

GitHubInstagramLinkedIn