TechFeedTechFeed
Open Source

Deno 2 완벽 가이드 — Node.js 대안의 현재와 미래

Deno 2의 npm 호환성, 성능, 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.json — 기본 프로젝트 설정
{ "name": "my-deno-app", "version": "1.0.0", "tasks": { "dev": "deno run --watch --allow-net --allow-read src/main.ts", "build": "deno compile --allow-net --allow-read src/main.ts", "test": "deno test --allow-net --allow-read", "lint": "deno lint", "fmt": "deno fmt" }, "imports": { "@std/path": "jsr:@std/path@^1.0.0", "@std/fs": "jsr:@std/fs@^1.0.0", "hono": "npm:hono@^4.0.0" }, "lint": { "rules": { "exclude": ["no-explicit-any"] } }, "fmt": { "lineWidth": 100, "semiColons": false, "singleQuote": true } }

npm 호환성과 JSR 패키지 생태계

Deno 2에서 패키지를 가져오는 방법은 세 가지다. npm: 접두사로 npm 레지스트리에서 직접 설치, jsr: 접두사로 Deno/TypeScript 전용 패키지 레지스트리(JSR) 사용, URL 기반 직접 import가 있다.

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 예제다.

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를 유지해야 한다.

참고 자료:

denodeno2nodejs런타임typescript오픈소스

관련 포스트

오픈소스 기여 시작 가이드 — 첫 PR까지2026-02-262026년 주목할 오픈소스 프로젝트 10선2026-03-09오픈소스 라이선스 완벽 가이드2026-03-10오픈소스에 기여하는 실전 가이드 — 첫 PR부터 메인테이너까지2026-03-11