Deno 2의 npm 완전 호환성, 성능 벤치마크, Node.js와의 비교를 정리한다. 실전 프로젝트 셋업, Fresh 프레임워크, Deploy 배포와 기존 Node.js 앱 마이그레이션 가이드를 포함한다.
한 줄 요약: Deno 2는 npm 완전 호환, 표준 라이브러리 안정화, 워크스페이스 지원을 통해 Node.js의 현실적인 대안으로 자리잡았다. 신규 프로젝트라면 지금 바로 도입을 검토할 수 있다.
2024년 10월 출시된 Deno 2는 "Node.js와 호환되면서도 더 나은 개발 경험"을 목표로 대규모 변화를 가져왔다. npm 패키지를 그대로 쓸 수 있고, package.json을 인식하며, Node.js API 대부분을 폴리필로 지원한다. 이 가이드는 Deno 2의 핵심 변경사항부터 실전 프로젝트 셋업, Node.js 마이그레이션 전략까지 다룬다.
Deno 2 핵심 변경사항 총정리
Deno 2의 가장 큰 변화는 Node.js/npm 생태계와의 호환성이다. 이전까지 Deno는 자체 모듈 시스템(URL import)을 고집했지만, Deno 2부터는 npm 패키지를 npm: 접두사로 직접 임포트하거나 package.json을 통한 의존성 관리가 가능해졌다.
npm 호환성 완성:npm:express, npm:react 등 대부분의 npm 패키지 직접 사용 가능
Node.js API 폴리필:node:fs, node:path, node:crypto 등 Node built-in API 지원
package.json 지원: 기존 Node.js 프로젝트 구조 그대로 인식
워크스페이스(Workspaces): 모노레포 구성 지원
deno.json 개선: imports 맵, 태스크 러너, lint/fmt 설정 통합
표준 라이브러리 1.0 안정화:@std/path, @std/fs, @std/http 등 안정 버전 출시
Deno 2 완벽 가이드 — Node.js 대안의 현재와 미래 — 프로젝트 구조 다이어그램 (출처: 공식 문서 및 벤치마크 데이터 기반)
Deno 2에서 패키지를 가져오는 방법은 세 가지다. npm: 접두사로 npm 레지스트리에서 직접 설치, jsr: 접두사로 Deno/TypeScript 전용 패키지 레지스트리(JSR) 사용, URL 기반 직접 import가 있다.
Deno 2 완벽 가이드 — Node.js 대안의 현재와 미래 — 기능 비교 차트 (출처: 공식 문서 및 벤치마크 데이터 기반)
TypeScript — 패키지 임포트 방법 비교
// 1. npm 패키지 직접 사용
import express from 'npm:express@4'
import { z } from 'npm:zod@3'
// 2. JSR 패키지 (Deno 권장)
import { join } from 'jsr:@std/path@^1.0.0'
import { exists } from 'jsr:@std/fs@^1.0.0'
// 3. Hono 웹 프레임워크 (npm)
import { Hono } from 'npm:hono'
const app = new Hono()
app.get('/', (c) => c.text('Deno 2 + Hono!'))
app.get('/json', (c) => c.json({ message: 'Hello from Deno 2', version: Deno.version.deno }))
Deno.serve({ port: 8000 }, app.fetch)
JSR vs npm 선택 기준: Deno 전용 프로젝트라면 JSR 패키지(jsr:)를 우선 사용하자. JSR은 TypeScript 네이티브, 타입 정보 자동 포함, 보안 검증이 강화돼 있다. Node.js 생태계 패키지가 필요하면 npm:을 쓰면 된다. 두 시스템을 혼용해도 동작한다.
Node.js와 퍼포먼스 비교
Deno 2의 런타임 성능은 V8 엔진 기반으로 Node.js와 유사하지만, 내장 도구 체인(TypeScript 컴파일, 린터, 포매터, 번들러)이 Rust로 구현돼 있어 도구 실행 속도에서 차이가 난다.
실전 프로젝트 셋업 — REST API 예제
Deno 2로 간단한 REST API 서버를 셋업하는 전체 흐름이다. Hono 프레임워크와 Zod를 활용한 타입 안전 API 예제다.
Deno 2 완벽 가이드 — Node.js 대안의 현재와 미래 — 생태계 맵 시각화 (출처: 공식 문서 및 벤치마크 데이터 기반)
Bash — 프로젝트 초기화
# Deno 설치 (macOS/Linux)
curl -fsSL https://deno.land/install.sh | sh
# 프로젝트 초기화
deno init my-api
cd my-api
# 개발 서버 실행 (파일 감시 포함)
deno run --watch --allow-net src/main.ts
TypeScript — Hono 기반 REST API (src/main.ts)
import { Hono } from 'npm:hono'
import { zValidator } from 'npm:@hono/zod-validator'
import { z } from 'npm:zod'
const app = new Hono()
const userSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
role: z.enum(['admin', 'user']).default('user'),
})
// 인메모리 스토어 (실전에서는 DB 교체)
const users: Array<z.infer<typeof userSchema> & { id: number }> = []
let nextId = 1
app.get('/users', (c) => {
return c.json({ users, total: users.length })
})
app.post('/users', zValidator('json', userSchema), async (c) => {
const body = c.req.valid('json')
const user = { id: nextId++, ...body }
users.push(user)
return c.json(user, 201)
})
app.get('/users/:id', (c) => {
const id = Number(c.req.param('id'))
const user = users.find((u) => u.id === id)
if (!user) return c.json({ error: 'Not found' }, 404)
return c.json(user)
})
console.log('Server running on http://localhost:8000')
Deno.serve({ port: 8000 }, app.fetch)
Node.js 프로젝트 마이그레이션 전략
기존 Node.js 프로젝트를 Deno 2로 전환할 때는 단계적 접근이 현실적이다. 전체 재작성보다 신규 서비스나 모듈 단위로 먼저 적용하고 검증하는 방식이 안전하다.
호환성 주의 사항:node_modules에 직접 의존하는 빌드 도구(일부 webpack 플러그인, native addon)는 Deno에서 동작하지 않는다. C++ native addon(.node 파일)은 Deno에서 지원하지 않으므로, 해당 의존성이 있다면 Node.js를 유지해야 한다.