Deno 2.0 vs Node.js, 실무에서 비교해봤다
사이드 프로젝트에 Deno 2.0을 써보고 Node.js와 직접 비교한 기록
Deno가 2.0이 됐길래
Deno 2.0이 나왔을 때 "이번에는 진짜 쓸 만해졌나" 싶어서 사이드 프로젝트에 넣어봤다. 간단한 REST API 서버, 엔드포인트 12개짜리. 같은 스펙으로 Node.js 버전도 만들어서 비교했다.
솔직히 Deno 1.x 때 한 번 시도했다가 npm 호환성 때문에 포기한 적이 있다. 그때의 트라우마가 좀 있었는데, 2.0은 달라졌다고 해서 다시 도전한 거다.
설정이 진짜 간단해졌다
Deno 2.0의 가장 큰 장점은 초기 설정이 거의 없다는 거다. TypeScript가 기본이고, 린터와 포매터가 내장되어 있다. Node.js에서는 tsconfig.json, .eslintrc, .prettierrc, package.json 이것저것 설정하는 데 20분은 쓰는데, Deno는 deno.json 하나면 끝.
이 차이가 사이드 프로젝트에서는 크다. "아이디어가 떠올랐을 때 바로 코딩 시작"이 되려면 설정 시간이 짧아야 하는데, Deno가 그 부분에서 확실히 이긴다.
npm 호환성은 진짜 좋아졌다
npm: 접두사로 npm 패키지를 바로 쓸 수 있다. 이번에 npm:express, npm:zod, npm:jsonwebtoken을 써봤는데 다 잘 동작했다. 1.x 때 겪었던 "이 패키지는 안 됩니다" 같은 상황이 거의 없었다.
근데 "거의"라고 한 이유가 있다. npm:bcrypt가 네이티브 바이너리 문제로 안 됐다. npm:bcryptjs로 대체해서 해결하긴 했는데, 이런 예외가 있다는 게 실무에서는 좀 불안하다.
성능은 어떤가
두 버전으로 같은 벤치마크를 돌려봤다. 간단한 JSON 응답 기준으로 Deno가 초당 요청 처리량이 약 8% 높았다. 근데 데이터베이스 쿼리가 포함된 엔드포인트에서는 차이가 2% 이내로 줄어든다. 대부분의 실무 시나리오에서는 런타임 성능 차이는 의미 없다.
콜드 스타트는 Deno가 좀 더 빨랐다. Node.js가 784ms, Deno가 523ms. 서버리스 환경이라면 이 차이가 의미 있을 수 있다.
여기서부터 현실적인 문제
생태계 크기가 다르다. Node.js 관련 스택 오버플로 답변이 Deno의 한 20배는 되는 것 같다. (체감 수치다.) 에러가 나면 구글링으로 해결하는 시간이 Deno가 훨씬 오래 걸린다. Deno 2.0 특화 정보는 아직 적다.
팀 프로젝트에 도입하려면 팀원 모두가 Deno를 배워야 한다. 학습 비용이 0은 아니다. Node.js와 비슷하지만, 모듈 시스템이나 권한 관리 같은 차이점이 있어서 처음에 헤매는 시간이 있다.
그리고 호스팅. Vercel, Railway 같은 곳에서 Deno 지원이 Node.js만큼 자연스럽지 않다. Deno Deploy가 있긴 한데, 기존 인프라를 옮기기는 좀 귀찮다.
그래서 실무에서 쓸 건가
사이드 프로젝트에서는 계속 쓸 것 같다. 설정 간편함과 TypeScript 네이티브 지원이 개인 프로젝트에서는 확실한 장점이다.
근데 회사 프로젝트에 도입할 생각은 아직 없다. 생태계, 팀 학습 비용, 호스팅 지원 -- 이 세 가지가 해결되지 않으면 회사에서 "Deno 쓰자"고 제안하기 어렵다.
결국 둘 다 JavaScript다
한 가지 아이러니한 건, Deno 2.0이 Node.js와의 호환성을 높일수록 "그냥 Node.js 쓰면 안 되나"라는 생각이 든다는 거다. 차별점이 줄어드는 게 장점이자 단점이다.
근데 TypeScript 기본 지원이랑 보안 모델은 진짜 좋다. Node.js도 언젠가 이 방향으로 갈 것 같긴 하다. 그때까지는 Deno가 한 발 앞서 있다.
어쨌든 내일 사이드 프로젝트에 Deno로 WebSocket 기능 추가해봐야겠다. 이것도 잘 되면 좋겠는데.