deno 소개
deno는 node.js 제작자인 Ryan Dahl이 만든, typescript를 실행할 수 있는 server-side 런타임 엔진이다. node.js를 만들면서 이런 부분은 고쳤으면 좋겠다고 생각했던 점들을 반영했다고 한다.
물론 javascript도 실행할 수 있다. 아래에 'Hello World'의 http server 버전 예제를 중심으로 node와 deno를 비교해보자.
// node.js
var http = require("http");
http.createServer(function(req, res) {
res.write("Hello World\n");
res.end();
}).listen(8000, function() {
console.log("http://localhost:8000/");
});
// deno.js
import { http } from "https://deno.land/std@v0.12/http/server.ts";
const body = new TextEncoder().encode("Hello World\n");
const s = http(":8000");
window.onload = async () => {
console.log("http://localhost:8000/");
for await (const req of s) {
req.respond({ body });
}
};
대략 다음과 같이 세 가지 차이점이 눈에 띈다.
- module URL reference: npm과 같은 중앙 집중형 패키지 관리자 대신 분산 기반으로 모듈을 호출한다. node에서는 npm 중앙서버로부터 외부 패키지를 가져와
node_modules/
밑에 설치하여 사용하였다. 반면 deno에서는 위 코드에서 보는 바와 같이 코드 위치를 URL로 지정하면 실행 단계에서 자동으로 모듈을 다운로드하여 설치한다. 또한 모듈 시스템으로 ES 모듈만 사용한다. - callback function vs. Promise (
async
,await
): node.js 초기에는 callback 함수를 사용했지만 다들 아시다시피 callback 함수 지옥은 악명이 높았다. Javascript에 Promise가 도입되면서 node.js에서도 callback 함수 대신async
,await
를 사용할 수 있었다. deno에서는 처음부터 Promise를 활용한다. - browser compatibility (
window
): server-side에서 실행하던 코드를 추가 수정 없이 브라우저에서 실행할 수 있다.
또한 컴퓨팅 자원 접근에 대한 보안이 강화되어 I/O, networking 접근 시 접근 권한을 확인하는 질의를 런타임 시에 볼 수 있다. 물론 실행 시 command line 파라미터로 사전에 지정해줄도 수 있다.
$ deno deno.js
️⚠️ Deno requests network access to ":8000". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)] y
http://localhost:8000/
내부적으로 node.js와 같이 V8 javascript 엔진을 사용하고 있고, 그 외 부분은 C++ 대신 Rust를 이용하여 구현하고 있어서 비동기 스케줄러도 Rust로 작성한 tokio를 사용하고 있다.
node.js 대비 초기 시작 속도는 약 3배 정도 빠르지만, I/O 쪽은 아직 개선의 여지가 있다고 한다. 이 부분만 개선되면 올해 내로 1.0 버전을 내놓을 계획이라고 한다.
— END OF POST.