좋아, 이렇게 상상해 봐: 오후 11시, 찬 동시에 뜨거운 커피 한 잔을 들고 있고(내가 마스터한 기술이야), 자바스크립트 런타임의 토끼 굴로 빠져들고 있어. 그래, 알아, 미친 금요일 밤이지? 하지만 소프트웨어 엔지니어가 되면 “재미”의 개념이 가끔은 고양이가 방 건너편에서 나를 판단하는 동안 Deno와 Node.js를 비교하는 것과 관련이 있어.
이 개념에 대한 배경 이야기를 하자면, 나는 몇 년 동안 Node.js와 함께 해왔어. 마치 너의 옷장에 있는 낡은 옷들처럼, 여전히 작동(품질) 상태라서 도저히 버릴 수 없는 그런 느낌이야. 편안하지만, 가끔은 시장에서 유행하는 비슷한 것들을 사고 싶다는 생각이 들어 — 개정된 새로운 변형들 말이지, 알지?
주제로 돌아가서, 모두가 떠들고 있는 현대의 라이벌 Deno가 등장해. 몇 년 동안 Node.js에 익숙해져 있어서, 이 요소를 깊이 탐구하고 내가 직접 그것이 모든 과대 광고에 걸맞는지, 아니면 동등하거나 더 나은 런타임을 가지고 있는지 확인하는 것은 자연스러운 본능이야. 그러니, 좀 더 잘 이해하기 위해서 분석해 볼까?
첫인상: 도대체 누가 이런 것들을 이름 짓는 거지?
2000년대 후반, 기술이 아직 유아기였던 시절에 Node.js는 2009년부터 산업에 존재해 왔습니다. 크롬의 V8 엔진을 기반으로 한 Node.js는 우리가 확장 가능한 앱을 구축하는 데 꾸준히 도움을 주었습니다. 이는 모든 사람들이 선호하고 신뢰하는 자바스크립트의 한 버전으로 이해할 수 있습니다.
최근에는 2018년에 Deno가 출시되었습니다. 그리고, 네, Deno는 같은 사람인 라이언 달에 의해 개발되었습니다. 그는 원래의 인기 Node.js의 창시자입니다. 플롯의 반전이죠? 그는 돌아와서 Node에서 자신이 잘못했다고 생각한 모든 것을 지적한 후, “내 커피 좀 맡아줘. 내가 고칠게.”라고 말했습니다. Deno는 보안, 단순성, 현대적 기능을 핵심으로 태어났습니다. 이름에 대해 궁금하시다면… 솔직히 잘 모르겠습니다. 하지만 Deno는 Node의 애너그램이니 그 점을 참고하세요.
1라운드: 보안
보안에 대해 이야기해봅시다. 왜냐하면 만약 당신이 저와 비슷하다면, 적어도 한 번은 “오, 안돼, 실수로 API 키를 노출시켰어”라는 순간을 경험했을 것이기 때문입니다. (우리는 그 프로젝트에 대해 더 이상 이야기하지 않습니다.)
Node.js는 보안을 개발자에게 맡기는 경향이 있어서, .env 파일과 권한에 대해 잘 알고 있어야 합니다. 그렇지 않으면 문제가 생길 수 있습니다. 반면 Deno는? 우리가 가지고 있는 모든 사이트 믿음이 강한 친구들 중 하나처럼 이중 잠금 확인을 계속 하는 친구와 같습니다. 어쨌든, Deno는 기본적으로 코드가 네트워크, 파일 시스템 또는 환경 변수에 액세스할 수 없는 보호된 샌드박스에서 작동하며, 명시적인 허가가 없는 한 허용하지 않습니다.
다음은 예시입니다.
Node.js
const fs = require('fs');
fs.writeFileSync('./hello.txt', 'Hello, World!');
console.log('File written successfully!');
Deno
const encoder = new TextEncoder();
await Deno.writeFile('hello.txt', encoder.encode('Hello, World!'));
console.log('File written successfully!');
하지만 허가 없이 Deno 코드를 실행하려고 하면 큰 오류 메시지가 표시됩니다.
PermissionDenied: Requires write access to "hello.txt".
맞습니다. Deno는 농담을 잘 하지 않습니다. 스크립트를 실행할 때 --allow-write
와 같은 플래그를 명시적으로 전달해야 합니다. 약간 귀찮습니까? 그렇습니다. 하지만 혼란을 우연히 풀어내는 일을 막아줍니다.
라운드 2: 성능
제가 속도 열정가는 사람은 아니지만, 런타임에서 성능은 중요합니다. “피자 먹을 사람?”이라고 물어볼 때 앱이 친구들보다 빠르게 응답하기를 원합니다.
Node.js와 Deno 모두 V8 엔진을 사용하므로 빠릅니다. 하지만 Deno는 Rust로 작성되어 있어 성능과 신뢰성 면에서 약간의 우위를 제공합니다. Rust의 메모리 안전 기능과 동시성 모델은 내부적으로 강력한 성능을 발휘하게 합니다. 그럼에도 불구하고 Node.js는 더 오래된 기술로, 그 성능 최적화는 전투 테스트를 거쳤습니다.
저는 몇 가지 벤치마크를 실행해 보았습니다. 왜냐하면, 음, nerd니까요:
Node.js의 기본 HTTP 서버:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from Node.js!');
});
server.listen(3000, () => console.log('Node server running on port 3000'));
Deno의 기본 HTTP 서버:
import { serve } from "https://deno.land/std/http/server.ts";
const server = serve({ port: 3000 });
console.log("Deno server running on port 3000");
for await (const req of server) {
req.respond({ body: "Hello from Deno!" });
}
결과는? Deno가 요청 처리에서 약간 더 빠르긴 했지만, 밀리초 단위의 차이입니다. 대부분의 실제 애플리케이션에서는 이 차이가 게임 체인저가 되지는 않을 것입니다—당신이 다음 Twitter(또는 X? 지금은 그렇게 부르나요?)를 만들려고 하지 않는 한요.
3라운드: 개발자 경험
자, 이 부분은 저에게 큰 충격이었습니다. Node.js를 사용해 본 적이 있다면, npm이 당신의 프로젝트의 생명선이라는 것을 잘 알고 있을 것입니다. 그것은 패키지를 설치하고, 종속성을 관리하며, 가끔 node_modules
가 2GB로 커질 때 화면에 소리 지르는 방법입니다.
Deno는 “아니, 우리는 여기서 npm을 사용하지 않습니다.”라고 말했습니다. 대신, 분산 모듈 시스템을 사용합니다. 이렇게 URL을 통해 직접 모듈을 가져옵니다:
import * as _ from "https://deno.land/x/lodash/mod.ts";
console.log(_.chunk([1, 2, 3, 4], 2));
처음에는 “잠깐, 뭐라고?” 라고 생각했지만, 점점 그 멋진 점을 깨달았습니다. 더 이상 부풀어 오른 node_modules
폴더는 없습니다! 패키지 버전 불일치에 대해 걱정할 필요도 없습니다! 그냥 깔끔하고 간단한 임포트만 있습니다. 그래도 인정하겠습니다: npm의 편리함과 제공하는 다양한 패키지들이 그리웠습니다. 옛 습관은 쉽게 사라지지 않네요.
빠른 비교
여기 Deno와 Node.js의 문법과 스타일이 어떻게 다른지 보여주는 간단한 비교가 있습니다:
파일 읽기
Node.js:
const fs = require('fs');
const data = fs.readFileSync('./file.txt', 'utf8');
console.log(data);
Deno:
const data = await Deno.readTextFile('./file.txt');
console.log(data);
HTTP 요청 만들기
Node.js (axios 사용):
const axios = require('axios');
const response = await axios.get('https://api.example.com/data');
console.log(response.data);
Deno (내장 Fetch):
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
그럼, 무엇을 선택해야 할까요?
좀 더 분석할 시간을 가져봅시다. Node.js 프로젝트에 깊이 몰두하고 있다고 가정했을 때, 우선순위를 고려하세요; 모든 것이 잘 돌아가고 있다면 배를 바꿀 필요는 없습니다. Node.js는 이제 성숙했으며 방대한 생태계를 가지고 있어서 모든 작업을 처리할 수 있습니다. 하지만 새롭게 시작하거나 보안 측면을 강조하는 무언가를 만들고 싶다면 Deno는 고려할 가치가 있습니다. 마치 유명해지기 전에 인디 밴드를 듣는 Node의 멋지고 현대적인 사촌 같은 존재입니다.
저는? 아마 두 가지 모두를 계속 다뤄볼 것 같습니다. 현재 Node.js는 저에게 집처럼 느껴지지만, Deno는 반짝이는 새 장난감을 가진 매력이 있습니다. 게다가, 저는 더 미래 지향적인 코드를 작성하는 개념에 실제로 끌리고 있습니다.
나는 지금 마음을 정리한 후에, 현재 약 90%가 오류 팝업 창의 스크린샷과 무작위 코드 조각으로 차지되어 있는 모니터를 이동하고 청소해야 합니다. 전형적인 경우, 맞지?
당신 차례!
아직 Deno를 시도해 보셨나요, 아니면 Node.js를 계속 사용하고 계신가요? 아래에 의견을 남겨 주세요 — 좋은 기술 토론에 항상 참여하겠습니다 (만약 미미를 포함한다면 보너스 포인트가 있습니다).
Source:
https://dzone.com/articles/deno-vs-nodejs-the-showdown-nobody-asked-for