개요
Deno는 보안을 우선시하는 JavaScript/TypeScript 런타임으로, Node.js 창시자 Ryan Dahl이 “Node.js에 대한 후회”를 반성하며 만든 차세대 런타임입니다. Rust와 V8으로 작성되었으며, 퍼미션 기반 샌드박스, 네이티브 TypeScript, Web Standard API를 핵심 철학으로 삼습니다.
- 개발: Ryan Dahl (Deno Land Inc.)
- 언어: Rust + C++ (코어), V8 (JS 엔진)
- 엔진: V8
- 라이선스: MIT
- 웹사이트: https://deno.com
- GitHub: https://github.com/denoland/deno ★106k (2026.03 기준)
- 최신 버전: v2.7.4 (2026.03.05)
최신 버전 현황 (2026)
| 버전 | 출시일 | 주요 내용 |
|---|---|---|
| v2.7.4 | 2026.03.05 | 버그 수정, npm install 성능 개선 |
| v2.7.0 | 2026.02 | Temporal API 안정화, Windows ARM 지원, V8 14.5, self-extracting 바이너리, deno create |
| v2.6.0 | 2026.01 | dx (npx 대체 도구), deno audit (보안 취약점 스캔) |
| v2.5.x | 2025.12 | npm specifier 대폭 개선 (npm 호환성 ~90%) |
| v2.0.0 | 2024.10 | Node.js/npm 완전 호환, LTS 채널, 워크스페이스 지원 |
핵심 철학
Deno 설계 원칙:
- 보안 기본값(Secure by Default): 명시적 허가 없이 파일/네트워크/환경변수 접근 불가
- TypeScript 일급 시민(TypeScript First): 별도 설정 없이
.ts파일 직접 실행 - Web Standard API: 브라우저 표준 API와 동일한 인터페이스 (
fetch,Request,Response,WebCrypto등) - 단일 실행 파일: 외부 의존성 없이
deno바이너리 하나로 모든 도구 포함 - URL 기반 임포트 + JSR/npm 호환: 중앙 registry 없이도 모듈 직접 임포트 가능
퍼미션 모델 (Permissions Model)
Deno는 opt-in 방식 보안 샌드박스를 채택합니다. 기본적으로 모든 접근이 차단됩니다.
# 기본 실행 — 아무것도 허용 안 됨
deno run script.ts
# 네트워크 접근 허용
deno run --allow-net script.ts
# 특정 도메인만 허용
deno run --allow-net=api.github.com script.ts
# 파일 읽기 허용
deno run --allow-read script.ts
# 특정 디렉터리만 허용
deno run --allow-read=/tmp script.ts
# 환경변수 허용
deno run --allow-env=HOME,PATH script.ts
# 서브프로세스 실행 허용
deno run --allow-run=git script.ts
# 모든 권한 허용 (비권장)
deno run --allow-all script.ts
# 또는
deno run -A script.ts퍼미션 목록
| 플래그 | 설명 |
|---|---|
--allow-read[=<path>] | 파일 시스템 읽기 |
--allow-write[=<path>] | 파일 시스템 쓰기 |
--allow-net[=<domain>] | 네트워크 접근 (HTTP/HTTPS/WebSocket) |
--allow-env[=<VAR>] | 환경변수 읽기/쓰기 |
--allow-run[=<cmd>] | 서브프로세스 실행 |
--allow-ffi | FFI (네이티브 라이브러리 호출) |
--allow-sys | 시스템 정보 접근 (hostname, osRelease 등) |
--deny-* | 특정 권한 명시적 차단 (allow 보다 우선) |
Node.js/npm은 설치 시 postinstall 훅이 시스템 전체 접근 가능 — Deno는 이를 기본 차단
TypeScript 네이티브 지원
별도 설정 없이 TypeScript를 직접 실행합니다.
// hello.ts — 그대로 실행됨
interface User {
name: string;
age: number;
}
const greet = (user: User): string => {
return `Hello, ${user.name}! You are ${user.age} years old.`;
};
console.log(greet({ name: "Alice", age: 30 }));deno run hello.ts # 트랜스파일 설정 불필요- V8에서 직접 실행 (내부적으로 Rust로 트랜스파일)
tsconfig.json없이도 동작; 커스텀 설정 원하면deno.json에 명시- JSX/TSX 지원 내장
Web Standard API
브라우저와 동일한 API를 서버에서도 사용합니다.
// fetch API — 브라우저와 100% 동일
const response = await fetch("https://api.github.com/repos/denoland/deno");
const data = await response.json();
console.log(data.stargazers_count);
// Streams API
const readable = new ReadableStream({
start(controller) {
controller.enqueue("Hello");
controller.enqueue(" World");
controller.close();
},
});
// WebCrypto
const key = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
// URL API
const url = new URL("https://example.com/path?query=1");
console.log(url.hostname); // "example.com"
// TextEncoder/TextDecoder
const encoded = new TextEncoder().encode("Hello, World!");지원 Web API: fetch, Request, Response, Headers, URL, URLSearchParams, ReadableStream, WritableStream, TransformStream, WebSocket, WebCrypto, BroadcastChannel, EventTarget, CustomEvent, AbortController, FormData, Blob, File, CompressionStream, DecompressionStream, TextEncoder, TextDecoder, performance, queueMicrotask, structuredClone
HTTP 서버 예제
// Web Standard API 사용 (Deno 네이티브)
Deno.serve({ port: 8000 }, (req: Request) => {
const url = new URL(req.url);
if (url.pathname === "/") {
return new Response("Hello from Deno!", {
headers: { "content-type": "text/plain" },
});
}
if (url.pathname === "/json") {
return Response.json({ message: "Hello JSON", timestamp: Date.now() });
}
return new Response("Not Found", { status: 404 });
});
console.log("Server running on http://localhost:8000");deno run --allow-net server.tsnpm / Node.js 호환성 (Deno 2.x)
Deno 2.0부터 Node.js 생태계와의 완전한 호환을 목표로 합니다.
// npm 패키지 직접 임포트
import express from "npm:express@4";
import { z } from "npm:zod";
import chalk from "npm:chalk";
// node: 프리픽스로 Node.js 내장 모듈 사용
import { readFileSync } from "node:fs";
import path from "node:path";
import { createServer } from "node:http";# deno.json 또는 package.json 모두 인식
deno install # npm install과 동일
deno add zod # npm add zod와 동일
deno remove lodash # npm remove lodash와 동일
# npx 대체: dx (Deno 2.6+)
deno run npm:create-vite-app my-appNode.js 호환성 현황
| 항목 | 상태 |
|---|---|
package.json 인식 | O |
node_modules | O |
npm specifier (npm:) | O (~90% 호환) |
CommonJS (require) | O |
ES Modules (import) | O |
Node.js 내장 모듈 (node:fs, node:path 등) | 대부분 O |
| Express, Hono, Fastify | O |
| Prisma | O |
| Next.js | 실험적 |
| C++ 애드온 (N-API) | 부분 지원 |
내장 도구 모음 (All-in-One Tooling)
별도 패키지 설치 없이 개발에 필요한 모든 도구가 내장됩니다.
deno fmt — 코드 포맷터
deno fmt # 전체 포맷
deno fmt src/ # 특정 디렉터리
deno fmt --check # 포맷 검사만 (CI용)- dprint 엔진 기반
- JS, TS, JSX, TSX, JSON, JSONC, Markdown 지원
deno lint — 린터
deno lint # 린트 실행
deno lint --fix # 자동 수정- ESLint 권장 규칙 세트 지원
- Rust로 작성 → 초고속
deno test — 테스트 러너
import { assertEquals, assertThrows } from "jsr:@std/assert";
Deno.test("basic test", () => {
assertEquals(1 + 1, 2);
});
Deno.test("async test", async () => {
const res = await fetch("https://example.com");
assertEquals(res.status, 200);
});
Deno.test({
name: "permission test",
permissions: { net: true },
async fn() {
// 이 테스트만 네트워크 허용
},
});deno test # 모든 테스트
deno test --coverage # 커버리지 포함
deno test --watch # 파일 변경 감지 자동 재실행
deno test --parallel # 병렬 실행deno bench — 벤치마크
Deno.bench("URL parsing", () => {
new URL("https://deno.land");
});
Deno.bench({
name: "fast operation",
baseline: true,
fn() {
// 기준선 벤치마크
},
});deno bench # 벤치마크 실행
deno bench --json # JSON 출력deno compile — 독립 실행 파일
# 현재 플랫폼용 실행 파일
deno compile --allow-net server.ts
# 크로스 컴파일
deno compile --target x86_64-unknown-linux-gnu --allow-net server.ts
deno compile --target x86_64-pc-windows-msvc --allow-net server.ts
deno compile --target aarch64-apple-darwin --allow-net server.ts
# self-extracting 실행 파일 (Deno 2.7+)
deno compile --include assets/ --allow-net server.ts- 외부 의존성 없는 단일 바이너리 생성
- 크로스 컴파일 지원 (Linux, macOS, Windows, ARM)
- 퍼미션이 바이너리에 내장됨
deno doc — 문서 생성
deno doc mod.ts # 문서 출력
deno doc --html mod.ts # HTML 문서 생성
deno doc --json mod.ts # JSON 형식기타 도구
deno info url # 의존성 트리 시각화
deno repl # REPL
deno upgrade # Deno 자체 업그레이드
deno create # 프로젝트 스캐폴딩 (2.7+)
deno check script.ts # 타입 검사만 실행 (실행 없음)
deno audit # 보안 취약점 스캔 (2.6+)JSR (JavaScript Registry)
JSR은 Deno가 만든 새로운 JavaScript/TypeScript 패키지 레지스트리입니다. npm의 한계를 극복하기 위해 설계되었습니다.
- 웹사이트: https://jsr.io
- npm과 달리 TypeScript 소스 그대로 게시 (트랜스파일 불필요)
- ESM 전용 (CommonJS 미지원)
- Deno, Node.js, Bun, Cloudflare Workers 등 멀티 런타임 지원
- 패키지 품질 점수(Quality Score) 자동 산출
- GitHub Actions에서 토큰 없이 게시 (Sigstore 기반 증명)
@std/네임스페이스: Deno 표준 라이브러리
// JSR 임포트
import { assertEquals } from "jsr:@std/assert";
import { encodeBase64 } from "jsr:@std/encoding/base64";
import { walk } from "jsr:@std/fs/walk";
import { parse } from "jsr:@std/csv";# deno.json에 JSR 의존성 추가
deno add jsr:@std/http// deno.json imports 섹션
{
"imports": {
"@std/assert": "jsr:@std/assert@^1.0.0",
"@std/http": "jsr:@std/http@^1.0.0"
}
}JSR vs npm 비교
| 항목 | npm | JSR |
|---|---|---|
| 언어 | JS (TS는 빌드 후 게시) | TypeScript 소스 직접 |
| 모듈 형식 | CJS + ESM | ESM 전용 |
| 런타임 지원 | Node.js 중심 | 멀티 런타임 |
| 타입 선언 | @types/ 별도 패키지 | 자동 생성 |
| 보안 게시 | 토큰 필요 | Sigstore (토큰 없이 가능) |
| 문서 | 별도 작성 | JSDoc 자동 파싱 |
| 품질 점수 | 없음 | 자동 산출 |
Deno Deploy
Deno Deploy는 Deno Land Inc.가 운영하는 엣지 서버리스 플랫폼입니다.
- 35개+ 글로벌 리전에서 V8 Isolate로 실행
- 콜드 스타트 50ms 미만
- GitHub 연동 → 자동 빌드/배포/미리보기/롤백
- Deno KV (글로벌 분산 key-value 스토리지) 내장
- 무료 티어 있음
// Deno Deploy용 서버 — 그대로 로컬에서도 실행됨
Deno.serve((req) => {
const url = new URL(req.url);
// Deno KV (엣지 분산 스토리지)
// const kv = await Deno.openKv();
// await kv.set(["visits", url.pathname], Date.now());
return Response.json({
path: url.pathname,
region: Deno.env.get("DENO_REGION") ?? "local",
runtime: "Deno " + Deno.version.deno,
});
});Deno Deploy 특징
| 기능 | 내용 |
|---|---|
| 실행 모델 | V8 Isolate (컨테이너 아님) → 즉시 시작 |
| 리전 | 35개+ (사용자 가장 가까운 곳 자동 선택) |
| GitHub 통합 | Push → 자동 배포, PR → 미리보기 URL |
| Deno KV | 글로벌 분산 KV 스토어 (SQLite 기반) |
| Tunnel | deno run --tunnel — 로컬 서버를 공개 URL로 노출 |
| WebSocket | 장기 연결 지원 |
| Cron | 예약 작업 지원 |
| Playground | 브라우저 내 코드 편집 + 즉시 배포 (멀티 파일 지원) |
Fresh Framework
Fresh는 Deno의 공식 풀스택 웹 프레임워크입니다.
- 웹사이트: https://fresh.deno.dev
- GitHub: https://github.com/denoland/fresh
- Island Architecture: 필요한 컴포넌트만 클라이언트에 JS 전송
- 기본적으로 클라이언트 JS 제로(Zero JS) 전송
- 파일시스템 기반 라우팅 (Next.js 스타일)
- Deno Deploy에서 즉시 실행
// routes/index.tsx — 파일 이름이 곧 URL
export default function HomePage() {
return (
<main>
<h1>Welcome to Fresh!</h1>
</main>
);
}// islands/Counter.tsx — 클라이언트 인터랙티브 컴포넌트
import { useSignal } from "@preact/signals";
export default function Counter() {
const count = useSignal(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => count.value++}>+</button>
</div>
);
}// routes/api/hello.ts — API 라우트
import { FreshContext } from "fresh";
export const handler = {
GET(_req: Request, _ctx: FreshContext) {
return Response.json({ hello: "world" });
},
};# Fresh 프로젝트 생성
deno run -A -r https://fresh.deno.dev my-app
cd my-app
deno task startFresh 특징
| 항목 | 내용 |
|---|---|
| 렌더링 | SSR + Island 방식 (선택적 hydration) |
| UI 라이브러리 | Preact (React 호환 경량) |
| JS 전송 | Island 컴포넌트만 전송 (기본 0KB) |
| 라우팅 | 파일시스템 기반 |
| TypeScript | 설정 없이 기본 |
| OpenTelemetry | 내장 관찰가능성 |
| Tailwind CSS | 플러그인으로 지원 |
Fresh 2.0 (2025 출시): Express/Hono 스타일 미들웨어 API, 비동기 컴포넌트, 새 플러그인 시스템 도입
Deno 2.x 주요 변경사항
Deno 2.0 (2024.10) — 대전환점
| 변경사항 | 내용 |
|---|---|
| npm 완전 호환 | npm: specifier, package.json, node_modules 공식 지원 |
| LTS 채널 | 6개월 단위 LTS 출시 (기업 프로덕션 안정성) |
| 워크스페이스/모노레포 | deno.json workspaces 지원, npm workspace와 혼용 가능 |
| CommonJS | .cjs 파일 직접 실행 |
| 표준 라이브러리 안정화 | JSR @std/ 패키지 안정 버전 출시 |
| 패키지 매니저 명령 | deno install, deno add, deno remove |
Deno 2.7 (2026.02) — 최신 주요 버전
| 기능 | 내용 |
|---|---|
| Temporal API 안정화 | TC39 날짜/시간 표준 API 정식 지원 |
| Windows ARM64 | ARM 기반 Windows 네이티브 지원 |
| V8 14.5 | 최신 JS 엔진 성능 개선 |
| self-extracting 바이너리 | deno compile로 에셋 포함 단일 바이너리 |
| deno create | 프로젝트 스캐폴딩 도구 |
| npm overrides | package.json overrides 지원 |
| Brotli 압축 스트림 | CompressionStream Brotli 지원 |
Deno 2.6 (2026.01)
| 기능 | 내용 |
|---|---|
| dx | npm/JSR 바이너리 실행 도구 (npx 대체) |
| deno audit | JSR + npm 패키지 보안 취약점 스캔 |
| Markdown 문서 지원 | deno doc에서 마크다운 파일 포함 |
Deno vs Node.js vs Bun 비교
| 항목 | Node.js | Deno | Bun |
|---|---|---|---|
| 엔진 | V8 | V8 | JavaScriptCore |
| 언어 (코어) | C++ | Rust | Zig |
| TypeScript | ts-node/tsx 필요 | 네이티브 | 네이티브 |
| 보안 모델 | 없음 | 퍼미션 기반 샌드박스 | 없음 |
| HTTP 성능 | 14,000 req/s | 29,000 req/s | 52,000 req/s |
| Cold Start | 60~120ms | 40~60ms | 8~15ms |
| 내장 도구 | 별도 필요 | fmt, lint, test, bench, compile, doc | fmt, test, build |
| 패키지 레지스트리 | npm | JSR + npm | npm |
| npm 호환성 | 100% | ~90% | ~95% |
| Web Standard API | 부분 | 완전 | 부분 |
| 엣지 배포 | Vercel/etc | Deno Deploy 네이티브 | 별도 |
| 생태계 크기 | 최대 (2M+ 패키지) | 성장 중 | 성장 중 |
| 프로덕션 안정성 | 최고 | 높음 | 성장 중 |
| LTS 지원 | O | O (2.0+) | 미확정 |
Deno의 강점 vs Node.js
- 보안: 기본 샌드박스 — 악의적 npm 패키지 영향 최소화
- TypeScript: 설정 제로, 즉시 실행
- 도구 통합: 린터·포맷터·테스트·벤치·컴파일·문서 모두 내장
- Web API 호환: 브라우저 코드를 서버에서 그대로 사용
- JSR: TypeScript 소스 직접 배포 가능한 현대적 레지스트리
- Deno Deploy: 엣지 서버리스 플랫폼 네이티브 지원
- 패키지 설치 속도: 핫 캐시 기준 npm 대비 90% 빠름
Deno의 약점
- 생태계: npm 대비 JSR 패키지 수 적음 (npm 호환으로 보완 중)
- Cold Start: Bun 대비 느림
- 원시 성능: HTTP 처리량이 Bun 대비 낮음
- C++ 네이티브 애드온: N-API 부분 지원만
설정 파일 (deno.json)
{
"name": "my-app",
"version": "1.0.0",
"imports": {
"@std/assert": "jsr:@std/assert@^1.0.0",
"@std/http": "jsr:@std/http@^1.0.0",
"zod": "npm:zod@^3.0.0"
},
"tasks": {
"start": "deno run --allow-net --allow-read src/main.ts",
"dev": "deno run --allow-net --allow-read --watch src/main.ts",
"test": "deno test --allow-net",
"lint": "deno lint",
"fmt": "deno fmt"
},
"lint": {
"rules": {
"include": ["ban-untagged-todo"]
}
},
"fmt": {
"lineWidth": 100,
"singleQuote": false
},
"compilerOptions": {
"strict": true
},
"workspaces": [
"./packages/core",
"./packages/cli"
]
}설치
# Linux/macOS
curl -fsSL https://deno.land/install.sh | sh
# Windows (PowerShell)
irm https://deno.land/install.ps1 | iex
# Homebrew
brew install deno
# 버전 관리 (dvm)
curl -fsSL https://dvm.deno.dev | sh
# 확인
deno --version
# deno 2.7.4 (stable, release, x86_64-unknown-linux-gnu)
# v8 14.5.x
# typescript 5.x.x사용 사례
| 용도 | 적합도 | 비고 |
|---|---|---|
| 보안 민감 서버 | 최적 | 퍼미션 기반 최소 권한 원칙 |
| TypeScript 전용 프로젝트 | 최적 | 설정 없이 즉시 시작 |
| 엣지 서버리스 함수 | 최적 | Deno Deploy 네이티브 |
| CLI 도구 배포 | 최적 | deno compile로 단일 바이너리 |
| 스크립팅/자동화 | 좋음 | TS 즉시 실행, 퍼미션 제어 |
| 기존 Node.js 마이그레이션 | 보통 | 점진적 마이그레이션 가능 |
| 대규모 프로덕션 (Node 대체) | 보통 | npm 호환성 90%, 일부 패키지 주의 |
| 최고 성능이 필요한 API | 주의 | 원시 처리량은 Bun이 더 높음 |