개발자

"데노 vs. Node.js" JS 런타임 선택 가이드

Martin Heller | InfoWorld 2022.08.22
Node.js는 여전히 가장 널리 쓰이는 자바스크립트 런타임 환경이다. 그러나 데노(Deno)는 보안이 뛰어나고 더 현대적이다. 데노와 Node.js를 비교하고 실제 프로젝트에 어떤 것을 사용하는 것이 좋을지 판단하는 기준을 살펴보자.
 
ⓒ Getty Images Bank

구체적으로는 Node.js와 데노, 커먼JS(CommonJS)와 ECMA스크립트(ECMAScript) 모듈의 차이점, 타입스크립트와 데노 함께 사용하기, 데노 디플로이(Deno Deploy)를 사용한 빠른 배포에 대해 알아본다. 마지막엔 다음 개발 프로젝트에서 Node.js와 데노 중 무엇을 사용할지 선택하는 데 도움이 될 만한 조언을 제공한다. 
 

Node.js란

Node.js는 크로스 플랫폼 자바스크립트 런타임 환경으로, 서버와 데스크톱 애플리케이션에 모두 유용하다. Node.js는 연결을 처리하도록 시스템에 등록된 단일 스레드 이벤트 루프를 실행하며, 각각의 새 연결은 자바스크립트 콜백 함수 실행으로 이어진다. 콜백 함수는 논블로킹 I/O 호출로 요청을 처리할 수 있다. 필요한 경우 풀에서 스레드를 스폰해서 블로킹 또는 CPU 집약적인 작업을 실행하고 여러 CPU 코어로 부하를 분산시킬 수 있다. 

이처럼 콜백 함수를 사용해 확장하는 노드의 접근 방식은 아파치 HTTP 서버, 다양한 자바 애플리케이션 서버, IIS, ASP.NET, 루비 온 레일즈 등 스레드를 사용해 확장되는 대부분의 경쟁 아키텍처에 비해 메모리를 덜 요구하면서 더 많은 연결을 처리하는 장점이 있다.

또한, 노드 애플리케이션은 순수 자바스크립트만으로 제한되지 않는다. 예를 들어 타입스크립트, 커피스크립트와 같이 자바스크립트로 트랜스파일되는 모든 언어를 사용할 수 있다. 예를 들어, Node.js가 도입한 구글 크롬 V8 자바스크립트 엔진은 바벨(Babel)과 같은 ES6-ES5 트랜스파일러 없이 ECMA스크립트 2015(ES6) 구문을 지원한다. 

이처럼 노드가 가진 유용함의 주 원천은 npm 명령으로 액세스 가능한 방대한 패키지 라이브러리다. NPM(Node Package Manager)은 자체 웹사이트가 있지만 표준 Node.js 설치의 일부다. 라이언 달은 리눅스와 맥OS용 아파치 HTTP 서버에 비해 확장성이 더 높은 대안으로 자바스크립트 기반 Node.js 플랫폼을 만들어 2009년에 공개했다. 아이작 슐루터가 만든 NPM은 2010년에 출시됐다. Node.js의 네이티브 윈도우 버전은 2011년에 나왔다. 
 

데노란

데노는 웹어셈블리, 자바스크립트 XML(JSX), 그리고 자체 타입스크립트 확장인 TSX로 확장된 자바스크립트와 타입스크립트를 위한 안전한 런타임이다. Node.js의 창시자가 만든 데노는 타입스크립트 컴파일러를 포함해 2009년 이후 자바스크립트의 발전을 활용하도록 노드를 재창조한 것이다. 

데노는 Node.js와 마찬가지로 기본적으로 구글 V8 자바스크립트 엔진을 중심에 둔 셸이다. 노드와 달리 타입스크립트 컴파일러를 실행 파일 이미지 안에 포함한다. 두 런타임을 모두 만든 달은 Node.js의 3가지 주요 문제로 ▲ 중앙화된 배포에 기반한 잘못 설계된 모듈 시스템 ▲ 지원해야 하는 많은 수의 레거시 API ▲ 보안의 부재를 언급한 적이 있다. 데노는 이 3가지 문제를 모두 해결한다. 노드의 모듈 시스템 문제는 2022년 중반 업데이트로 해결됐다. 
 

커먼JS와 ECMA스크립트 모듈 

노드가 처음 만들어졌을 당시 자바스크립트 모듈을 위한 사실상의 표준은 npm이 처음에 지원했던 커먼JS였다. 이후 ECMA스크립트 위원회는 jspm 패키지 관리자가 지원하는 ECMA스크립트 모듈(ES 모듈)을 공식적으로 승인했다. 데노 역시 ES 모듈을 지원한다. ES 모듈의 실험적 지원은 Node.js 12.12에 추가됐으며 Node.js 16부터 안정화 버전이다. 타입스크립트 4.7 역시 Node.js 16을 위한 ES 모듈을 지원한다. 

자바스크립트에서 커먼JS 모듈을 로드하는 방법은 require 문을 사용하는 것이다. ECMA스크립트 모듈은 import 문을 사용해 로드하고 export 문도 함께 사용된다. 최신 Node.js에는 커먼JS와 ES 모듈을 위한 로더가 포함돼 있다. 둘은 어떻게 다를까? 커먼JS 로더는 완전히 동기적이며 require() 호출을 처리하고 폴더를 모듈로 지원한다. 또한 require()호출에서 확장(.js, .json, 또는 .node)이 생략된 경우 추가한다. 커먼JS 로더는 ECMA스크립트 모듈을 로드하는 데는 사용할 수 없다. ES 모듈 로더는 비동기적이다. 가져오기 문과 import() 식을 처리하며 폴더를 모듈로 지원하지 않고(./startup/index.js와 같은 디렉터리 인덱스를 완전히 지정해야 함) 확장을 검색하지 않는다. 또한 자바스크립트 텍스트 파일로 .js, .mjs, .cjs 확장만 수락한다. ES 모듈은 자바스크립트 커먼JS 모듈을 로드하는 데 사용할 수 있다. 
 

데노의 보안이 더 뛰어난 이유

데노의 보안이 노드에 비해 개선됐다는 점은 잘 알려진 사실이다. 가장 큰 부분은 데노는 기본적으로 프로그램이 디스크, 네트워크, 서브프로세스 또는 환경 변수에 액세스하도록 허용하지 않는다는 데 있다. 이러한 액세스를 허용해야 하는 경우 명령줄 플래그로 원하는 세분화 수준에서 선택할 수 있다. 예를 들어 --allow-read=/tmp 또는 --allow-net=google.com이다. 데노의 또 다른 보안 개선은 포착되지 않은 오류가 발생하면 항상 종료된다는 점이다. 반면 노드는 포착되지 않은 오류가 발생해도 계속 실행하고 이로 인해 예측할 수 없는 결과가 일어난다. 
 

Node.js와 데노를 함께 사용할 수 있을까

서버 측 자바스크립트 프로젝트에 Node.js 또는 데노 사용을 고민한다면 둘을 함께 사용할 수 있는지 여부가 궁금할 것이다. 답은 “대체로 가능하다”는 것이다. 

우선, 많은 경우 데노에서 노드 패키지를 그냥 사용할 수 있다. 또한 여러 일반적인 문제를 위한 해결 방법이 있다. 구체적으로는 ▲ 데노 표준 라이브러리의 std/node 모듈을 사용해 노드의 내장 모듈을 “폴리필(polyfill)”하기 ▲ CDN을 사용해 데노에서 하는 방법대로 대다수 npm 패키지에 액세스하기 ▲ 가져오기 맵 사용하기 등이다. 또한 데노 1.15부터는 노드 호환성 모드도 있다. 

단점은 노드의 플러그인 시스템이 데노와 호환되지 않고 데노의 노드 호환성 모드가 타입스크립트를 지원하지 않으며 일부 내장 노드 모듈(vm 등)이 데노와 호환되지 않는다는 점이다. 노드 사용자이면서 데노로의 전환을 생각 중이라면 이 자료를 참고하는 것이 좋다.
 

타입스크립트와 데노 함께 사용하기 

데노는 타입스크립트를 자바스크립트 또는 웹어셈블리와 같은 1급 시민 언어로 취급한다. 데노는 내장된 타입스크립트 컴파일러와 swc라는 러스트 라이브러리를 함께 사용해 타입스크립트와 TSX 및 JSX를 자바스크립트로 변환한다. 코드는 형식 검사를 거치고(검사가 활성화된 경우) 변환되면 캐시에 저장된다. 즉, Node.js나 브라우저와 달리 데노용 타입스크립트를 tsc 컴파일러로 트랜스파일할 필요가 없다. 

데노 1.23부터는 기본적인 타입스크립트 형식 검사가 없다. 대부분 개발자가 편집기를 통해 형식 검사기를 다루므로 데노가 시작될 때 다시 형식 검사를 수행하는 것은 별 이득이 없기 때문이다. 원한다면 데노에 --check 플래그를 붙여 형식 검사를 활성화할 수 있다. 
 

더 빠른 배포를 위한 데노 디플로이 

데노 디플로이는 자바스크립트, 타입스크립트, 웹어셈블리를 전 세계의 사용자와 가까운 곳, 엣지에서 실행할 수 있게 해주는 분산 시스템이다. V8 런타임과 심층적으로 통합된 데노 디플로이 서버는 지연을 최소화하고 불필요한 추상화를 제거한다. 데노 CLI를 사용해 로컬에서 스크립트를 개발한 다음 데노 디플로이의 관리형 인프라에 배포할 수 있다. 1초도 채 걸리지 않고 아무것도 구성할 필요도 없다. 

데노 CLI와 같은 현대적 시스템을 기반으로 하는 데노 디플로이는 전 세계적으로 확장 가능한 방식으로 최신, 최고의 웹 기술을 제공한다. 
 
  • 웹 기반 : 브라우저와 같은 방식으로 페치(fetch), 웹소켓 또는 URL을 사용한다. 
  • 타입스크립트 및 JSX 기본 지원 : 형식 안전 코드, 빌드 단계가 없는 직관적인 서버 측 렌더링 
  • 웹 호환 ECMA스크립트 모듈 : 브라우저와 같은 방식으로 종속 항목을 가져오며 명시적 설치가 불필요하다. 
  • 깃허브 통합 : 브랜치로 푸시하고 배포된 프리뷰를 검토하고 병합해서 프로덕션으로 릴리스한다.
  • 매우 빠른 속도 : 배포에 1초가 채 걸리지 않으며 전 세계적으로 사용자 가까이에서 작동한다.
  • URL에서 배포 : URL만으로 코드를 배포한다.

데노 디플로이에는 2가지 티어가 있다. 무료 티어는 하루 요청 수 10만 개, 한달 데이터 전송 100GiB, 요청당 10ms의 CPU 시간 제한이 적용된다. 프로 티어는 월 10달러이며 월 요청 수 500만 개와 월 100GiB 데이터 전송을 제공하고 월별 추가 요청 100만 개 당 2달러, 포함된 데이터 전송 할당량 초과 시 GiB당 0.3달러의 요금이 적용된다. 또한 프로 티어는 요청당 50ms의 CPU 시간을 허용한다. 

한편 데노 측에 다르면 슬랙, 네트리파이(Netlify), 깃허브, 수파베이스(Supabase)에서 프로덕션에 데노를 사용 중이다. 그러나 이들 기업이 데노를 어떻게 사용하고 있는지에 관한 사례 연구는 아직 알려진 것이 없다.
 

Node.js와 데노, 무엇을 선택할까

예상할 수 있는 답이지만 개별 사용 사례에 더 적합한 기술을 결정 짓는 요소는 다양하다. 개인적인 제안은 문제없이 작동하는 기존 Node.js 환경이 있다면 굳이 뜯어 고치지 말라는 것이다. 그러나 타입스크립트로 작성하고자 하는 새 프로젝트가 있다면 필자는 데노를 적극적으로 고려할 것이다. 반면 타입스크립트 프로젝트가 데노에 대응 요소가 없는 여러 Node.js 패키지를 사용해야 한다면 데노 프로젝트가 타당한지 신중히 판단해야 한다. 개념 증명부터 시작하는 것이 거의 필수적이다. 개념 증명 없이 어떤 Node.js 패키지가 데노에서 작동하는지 예측하기는 어렵기 때문이다.
editor@itworld.co.kr
Sponsored

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.