개요

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.42026.03.05버그 수정, npm install 성능 개선
v2.7.02026.02Temporal API 안정화, Windows ARM 지원, V8 14.5, self-extracting 바이너리, deno create
v2.6.02026.01dx (npx 대체 도구), deno audit (보안 취약점 스캔)
v2.5.x2025.12npm specifier 대폭 개선 (npm 호환성 ~90%)
v2.0.02024.10Node.js/npm 완전 호환, LTS 채널, 워크스페이스 지원

핵심 철학

Deno 설계 원칙:

  1. 보안 기본값(Secure by Default): 명시적 허가 없이 파일/네트워크/환경변수 접근 불가
  2. TypeScript 일급 시민(TypeScript First): 별도 설정 없이 .ts 파일 직접 실행
  3. Web Standard API: 브라우저 표준 API와 동일한 인터페이스 (fetch, Request, Response, WebCrypto 등)
  4. 단일 실행 파일: 외부 의존성 없이 deno 바이너리 하나로 모든 도구 포함
  5. 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-ffiFFI (네이티브 라이브러리 호출)
--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.ts

npm / 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-app

Node.js 호환성 현황

항목상태
package.json 인식O
node_modulesO
npm specifier (npm:)O (~90% 호환)
CommonJS (require)O
ES Modules (import)O
Node.js 내장 모듈 (node:fs, node:path 등)대부분 O
Express, Hono, FastifyO
PrismaO
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 비교

항목npmJSR
언어JS (TS는 빌드 후 게시)TypeScript 소스 직접
모듈 형식CJS + ESMESM 전용
런타임 지원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 기반)
Tunneldeno 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 start

Fresh 특징

항목내용
렌더링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 ARM64ARM 기반 Windows 네이티브 지원
V8 14.5최신 JS 엔진 성능 개선
self-extracting 바이너리deno compile로 에셋 포함 단일 바이너리
deno create프로젝트 스캐폴딩 도구
npm overridespackage.json overrides 지원
Brotli 압축 스트림CompressionStream Brotli 지원

Deno 2.6 (2026.01)

기능내용
dxnpm/JSR 바이너리 실행 도구 (npx 대체)
deno auditJSR + npm 패키지 보안 취약점 스캔
Markdown 문서 지원deno doc에서 마크다운 파일 포함

Deno vs Node.js vs Bun 비교

항목Node.jsDenoBun
엔진V8V8JavaScriptCore
언어 (코어)C++RustZig
TypeScriptts-node/tsx 필요네이티브네이티브
보안 모델없음퍼미션 기반 샌드박스없음
HTTP 성능14,000 req/s29,000 req/s52,000 req/s
Cold Start60~120ms40~60ms8~15ms
내장 도구별도 필요fmt, lint, test, bench, compile, docfmt, test, build
패키지 레지스트리npmJSR + npmnpm
npm 호환성100%~90%~95%
Web Standard API부분완전부분
엣지 배포Vercel/etcDeno Deploy 네이티브별도
생태계 크기최대 (2M+ 패키지)성장 중성장 중
프로덕션 안정성최고높음성장 중
LTS 지원OO (2.0+)미확정

Deno의 강점 vs Node.js

  1. 보안: 기본 샌드박스 — 악의적 npm 패키지 영향 최소화
  2. TypeScript: 설정 제로, 즉시 실행
  3. 도구 통합: 린터·포맷터·테스트·벤치·컴파일·문서 모두 내장
  4. Web API 호환: 브라우저 코드를 서버에서 그대로 사용
  5. JSR: TypeScript 소스 직접 배포 가능한 현대적 레지스트리
  6. Deno Deploy: 엣지 서버리스 플랫폼 네이티브 지원
  7. 패키지 설치 속도: 핫 캐시 기준 npm 대비 90% 빠름

Deno의 약점

  1. 생태계: npm 대비 JSR 패키지 수 적음 (npm 호환으로 보완 중)
  2. Cold Start: Bun 대비 느림
  3. 원시 성능: HTTP 처리량이 Bun 대비 낮음
  4. 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이 더 높음

관련 항목