DENO란? / Node에 관해 후회하는 10가지

💻 참고 사이트 : https://www.youtube.com/watch?v=BVScm6JeDk0

Deno 란?

Deno에 대해서는 Node 개발자라면 한번쯤 들어봤을법하다. 또한 Node를 Deno가 대체할 거라는 말도 들어봤을것이다. 나 또한 이런 말을 어디선가 들어봤으며 따라서 Deno가 무엇인지 간단하게나마 살펴보려고 한다.

위키피디아 문서를 보면 Deno에 대해 자세히 설명되어있다.

Deno는 V8 JavaScript 엔진 및 Rust 프로그래밍 언어를 기반으로하는 JavaScript 및 TypeScript 용 런타임이다.

Node가 C++을 사용했다는 점에서 Deno는 특이하게 Rust를 사용하고 있으며 추가적으로 TypeScript를 처음부터 지원하는 모양이다. Node의 원저자인 Ryan Dahl이 만들었다고 하며 공식발음은 디노라고 한다. (데노라고도 많이 부르던데 잘 모르겠다)


왜 Deno가 탄생했는가

Deno가 만들어지게 된 배경에는 2018 년 "Node.js에 관해 후회하는 10가지" 강연을 보면 될 거 같다. (참고)

영어를 잘하지 못해서 간단하게나마 다른 블로그를 보고 중요한 점만 정리해봤다.

  1. Promises를 고집하지 않은 것 : Node의 비동기 호출은 여전히 콜백 방식으로 되어있다. Promises는 Async, Await을 제공하기 위해 필수였는데, 라이언 딜은 자신이 Promises를 계속 고집하지 않은것에 대해 후회했다고 한다.

  2. 보안 문제에 더 신경쓰지 못한 것 : 불행하게도 노드는 모든걸 그대로 보여주기 때문에 보안이라고는 1도 없다. 노드 프로그램을 실행하면 모든 시스템 콜에 접근할 수 있다.

  3. 빌드시스템(GYP) 1 : 가장 후회되는 부분이라고 한다. 처음 노드를 만들 때 크롬 브라우저가 GYP라는 메타 빌드 시스템을 사용하다가 GN으로 업그레이드한 반면, Node.js는 GN으로 변경하지 않아 이를 후회했다.

  4. 빌드시스템(GYP) 2 : GYP를 이용해 빌드 시스템을 만들면서 네이티브 콜을 하기 위해서 사용자가 필수적으로 C++ 바인딩을 하도록 했는데, FFI(Foreign Function Interface)를 제공했어야 했다는 아쉬움을 토로했다.

  5. 패키지 매니저 파일(package.json) 1 : 노드는 npm이라는 패키지 매니저가 관리하는 package.json 파일이 main() 함수에서 찾도록 되어있어 npm에 의존적인 커뮤니티로 만들었다는 점을 스스로 비판했다. 또한 package.json 파일은 모듈을 찾을 때 명시적이지 않다는 단점도 있다. 아래 그림을 참고하면 될 듯하다.

  6. 패키지 매니저 파일(package.json) 2 : package.json 파일의 모듈 시스템이 파일 디렉터리를 기준으로 잡히도록 만들어서 라이선스, 리포지터리, 설명 등 모듈 시스템 자체만으로는 필요 없는 정보까지 다 포함시켜 너무 무거워졌다고 한다.

  7. 모듈 시스템(node_modules) : 파일 디렉터리 기반 모듈 시스템의 약점과 마찬가지로 모듈을 가져오는 알고리즘이 복잡해졌다. (정말 아래 그림처럼 무거운 건가?)

  8. Require 문법을 쓸 때 js 확장자를 안 써도 되게 한 것 : 브라우저 내 자바스크립트가 작동하는 것과 표준이 달라서 모듈 로더가 사용자의 의도를 파악하기 위해 많은 고민을 해야 한다는 점을 언급했다.

  9. index.js : 브라우저가 index.html을 default로 갖기 때문에 index.js를 지정한 것이 당시엔 괜찮은 생각 같았으나, 결과적으로 모듈 로딩 시스템을 더 복잡하게 만들었다고 한다. (뭐가 복잡해졌는지는 모르겠지만...)

  10. Deno : 라이언 달이 Node에 관한 후회에 대해 발표를 한 후 새로 만들고 있는 프로젝트를 공개했는데 그것이 바로 Deno였다.

음... 나같은 애기 개발자는 이걸보고도 무슨 소리인지 막 체감되지 않는다ㅠㅠ 어떤건 이해를 하겠고, 어떤건 잘 이해가 안되는 부분이 있네. 근데 어쨌거나 중요한 사실은 Node에서 더 이상 고치기 힘들기 때문에 Deno라는걸 발표했다는 거?


Deno에서는 뭐가 달라졌나

깃허브 : https://github.com/denoland/deno
공식문서 : https://deno.land/

어느샌가 1.13.2 버전까지 발표되었다. 간단하게 Node와의 차이점을 보자면 다음과 같다. (위키 참고)

  • ES 모듈 사용(require 사용 안함)
  • 브라우저처럼 URLs(원격) / 파일경로(로컬)로 모듈 의존성 불러오기
  • npm 사용 안함 (URLs / file paths 로 모듈 레퍼런스 함)
  • package.json 모듈 해석 알고리즘 사용안함
  • 모든 비동기 액션이 Promise를 반환함
  • 파일, 네트워크, 환경(변수) 접근에 대해 명시적으로 권한설정 필요
  • 예상하지 못한 error 발생 시 무조건 죽음
  • 내장 타입스크립트 지원

공식문서 예시로 다음과 같이 사용된다고 한다.

import { listenAndServe } from "https://deno.land/[email protected]/http/server.ts";

console.log("http://localhost:8000/");
listenAndServe(":8000", (req) => new Response("Hello World\n"));

후기

나같은 개발자 입장에서는 그냥 Node로 서버만 잘 동작하게 하면 되지? 라는 생각을 가지고 있었고 그에 있어서 별로 불편함을 못 느꼈는데 Node 창시자가 Node를 만들면서 후회한 10가지 생각과 Deno가 왜 탄생하게 되었고 무엇이 바뀌는 중인지 솔직히 자세히는 이해하지 못하겠지만 그래도 조금이나마 이해할 수 있어서 좋은 시간이었던거 같다.

다음 시간에는 Deno를 설치하고 사용해보는 실습을 하던가 아니면 다른 무엇가를 해볼 생각이다. 그럼 ㅂㅇ~


기타 참고 사이트

좋은 웹페이지 즐겨찾기