라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목자바스크립트 런타임 : Bun2022-08-16 04:22
작성자user icon Level 4

88x31.png


현재 해외 자바스크립트 커뮤니티는 Bun.js 이야기로 떠들썩 합니다. Bun이 무엇이길래 이렇게 핫이슈로 떠오른 걸까요?



Bun은 올해 7월에 새로 나온 자바스크립트 런타임 입니다. V8 엔진을 기반으로 하는 node, deno와 달리 bun은 WebKit의 JavaScriptCore 엔진을 사용합니다. 메모리에 친화적인 Zig 언어로 제작되어 기존 Node.js나 Deno보다 속도면에서 훨씬 앞선다고 합니다.


 


실제로 그런지 성능 테스트를 해보겠습니다. 우선 다음 명령어를 통해 bun을 설치합니다.

$ curl https://bun.sh/install | bash 


.bashrc 파일을 열고 환경변수를 설정해주세요.

 $ sudo nano ~/.bashrc

 export BUN_INSTALL="$HOME/.bun" 

 export PATH="$BUN_INSTALL/bin:$PATH"


배쉬파일을 소싱하여 변경내용을 반영해주세요.

 $ source ~/.bashrc


bun이 설치되었습니다. bun에서 패키지는 bun install [패키지명] 으로 설치할 수 있으며, npm의 대다수 모듈과 호환됩니다. 다음 명령어로 express를 설치합니다.


 $ bun install express


다음 코드를 작성합니다.


app.js

const express = require('express');


const app = express();


app.get('/', (req, res) => {

    res.end('Hello world!');

});


app.listen(3000);


bun을 통해 웹서버를 실행시키세요.

 $ bun app.js


이제 wrk를 통해 벤치마크를 해보겠습니다. 10개의 쓰레드를 256개 연결하여 30초동안 리퀘스트를 보냅니다.

 


결과를 확인해보면 초당 평균 10000개의 요청을 처리하는 것을 확인할 수 있습니다.


이번에는 노드를 통해 웹서버를 실행시켜 보겠습니다. 노드로 웹서버를 실행시키고 동일한 조건으로 벤치마크했습니다.

 $ node app.js



노드는 초당 평균 6500개의 요청을 처리하는 것을 확인할 수 있습니다. bun이 약 1.5배 더 빠릅니다.


이번에는 express가 아닌 원시 서버를 통해 벤치마크를 해보겠습니다.


 Nodejs는 다음과 같은 코드를 사용합니다.

const http = require('node:http');


const server = http.createServer((req, res) => {

    res.end('Hello World!');

});


server.listen(3000);


 


초당 평균 18000개의 요청을 처리합니다. 약 3배 정도 빨라졌습니다.


이번에는 bun의 원시 서버를 통해 테스트 하겠습니다. bun은 다음과 같이 코드를 작성합니다.

 export default {

    port: 3000,

    fetch(req) {

        return new Response('Hello world!');

    }

}


코드가 엄청 심플합니다. 포트를 지정하고 fetch만 해주면 웹서버가 생성됩니다...


 


벤치마크의 결과 초당 평균 39000개의 요청을 처리합니다. 노드 원시 서버보다 2배 이상 더 빠르다는 것을 확인할 수 있습니다.


서버도 빠르지만 패키지 매니저의 속도 또한 npm보다 4 ~ 80배 정도 빠르다고 합니다. 실제로 react를 설치해보면 체감속도가 느껴질 정도로 차이가 납니다. deno와 달리 node_modules를 그대로 이용하기때문에 기존 자바스크립트나 타입스크립트 코드를 그대로 사용할 수 있다는 장점 또한 있습니다.


bun은 성능 뿐만 아니라 기존의 node가 이루지 못한 all-in-one 컨셉 또한 내세우고 있습니다. 자바스크립트 런타임 외에도 번들링, 트랜스파일링, 패키지 관리 등 모두 bun에서 처리할 수 있다고 합니다. 실제로 타입스크립트로 코드를 작성하고 bun으로 실행시키면 webpack, typescript compiler가 없어도 타입스크립트 파일만으로 실행되는 것을 확인할 수 있습니다.


 


 


또한 dotenv 같은 외장 패키지 없이도 자체적으로 env 파일을 불러올 수 있습니다.


 


 


react나 next 프로젝트 또한 손쉽게 만들 수 있습니다.


$ bun create react ./react

$ cd react

$ bun dev




단 3문장 만으로 리액트 서버가 만들어졌습니다... 패키지 설치 속도 또한 엄청 빠르기 때문에 설치부터 작동까지 10초가 걸리지 않았습니다..


$ bun create next ../next

$ cd ../next

$ bun dev


역시 3문장 만으로 next 서버가 만들어졌습니다. 과연 해외 커뮤니티에서 bun에 열광할만 합니다.


이뿐만이 아닙니다. bun은 기존 node보다 3배 가량 빠른 sqlite DB를 내장하고 있습니다.


 


아래 코드는 예제 코드입니다.

import { Database } from "bun:sqlite";


const db = new Database("mydb.sqlite");

db.run(

  "CREATE TABLE IF NOT EXISTS foo (id INTEGER PRIMARY KEY AUTOINCREMENT, greeting TEXT)"

);

db.run("INSERT INTO foo (greeting) VALUES (?)", "Welcome to bun!");

db.run("INSERT INTO foo (greeting) VALUES (?)", "Hello World!");


// get the first row

db.query("SELECT * FROM foo").get();

// { id: 1, greeting: "Welcome to bun!" }


// get all rows

db.query("SELECT * FROM foo").all();

// [

//   { id: 1, greeting: "Welcome to bun!" },

//   { id: 2, greeting: "Hello World!" },

// ]


// get all rows matching a condition

db.query("SELECT * FROM foo WHERE greeting = ?").all("Welcome to bun!");

// [

//   { id: 1, greeting: "Welcome to bun!" },

// ]


// get first row matching a named condition

db.query("SELECT * FROM foo WHERE greeting = $greeting").get({

  $greeting: "Welcome to bun!",

});

// [

//   { id: 1, greeting: "Welcome to bun!" },

// ]


이제 막 나온 신생 소프트웨어이기에 아직까지는 개발문서도 많이 없고 지켜보아야 할 점이 많지만 잠깐 살펴본 것 만으로도 앞으로의 미래가 기대됩니다.

#Bun
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)