dev-guide

Deno 2 완벽 가이드 — Node.js 호환성과 npm 생태계 통합

Deno 2에서 대폭 강화된 Node.js 호환성, npm 패키지 사용 방법, 보안 모델, Deno Deploy를 이용한 엣지 배포를 실무 중심으로 정리하였다.

★★★★☆추천
DenoDeno2Node.jsTypeScript런타임
Deno 2 완벽 가이드 — Node.js 호환성과 npm 생태계 통합
  • ·Deno 2 릴리스: 2024년 10월
  • ·Node.js와 npm 패키지 완전 호환 목표
  • ·TypeScript 네이티브 지원, 별도 컴파일 불필요
  • ·Deno Deploy로 엣지 환경 서버리스 배포 지원
Deno 2 출시 후 기존 Node.js 스크립트를 거의 수정 없이 실행할 수 있다는 점에 흥미를 느껴 사내 CLI 도구를 Deno로 전환하였다. node_modules 폴더 없이 URL 임포트만으로 의존성을 관리하는 방식이 CI 환경에서 캐시 문제를 크게 줄여주었다. 다만 일부 네이티브 모듈은 여전히 호환 이슈가 있어 단계적으로 전환하였다.

Deno 2의 핵심 변경사항

Node.js 호환성 대폭 강화

Deno 2는 Node.js 호환성을 최우선 목표로 삼아, 기존 Node.js 프로젝트를 최소한의 수정으로 실행할 수 있도록 하였다. node: 접두사 없이도 내장 Node.js 모듈을 임포트할 수 있으며, package.json을 그대로 인식하고 node_modules 디렉토리를 지원한다. CommonJS(require) 모듈도 지원하여 ESM 전환 없이도 대부분의 기존 패키지를 사용할 수 있다. npm, pnpm, yarn으로 설치된 패키지를 npm: 접두사나 직접 임포트로 사용하며, Deno 자체 패키지 레지스트리인 JSR도 지원한다.

// Deno 2 — npm 패키지 직접 사용
import express from 'npm:express'
import { z } from 'npm:zod'

// node: 접두사로 Node.js 내장 모듈 사용
import { readFile } from 'node:fs/promises'
import path from 'node:path'

// JSR 패키지 (Deno 공식 레지스트리)
import { assertEquals } from 'jsr:@std/assert'

// deno.json — package.json 대신 사용 가능
// { "imports": { "zod": "npm:zod@3" } }

보안 퍼미션 모델

Deno의 가장 차별적인 기능은 명시적 퍼미션 모델이다. 파일 시스템 읽기/쓰기, 네트워크 접근, 환경 변수 읽기, 서브프로세스 실행 등 모든 권한을 실행 시 플래그로 명시해야 한다. deno run --allow-net --allow-read server.ts처럼 필요한 권한만 허용하면, 악성 코드나 취약한 서드파티 패키지가 허가 없이 시스템에 접근하는 것을 원천 차단할 수 있다. CI/CD 환경에서 스크립트를 실행할 때 의도치 않은 파일 시스템 수정을 방지하는 데 특히 유용하다.

개발 도구와 생태계

내장 도구체인

Deno는 런타임, 포매터(deno fmt), 린터(deno lint), 테스트 러너(deno test), 번들러(deno bundle)를 하나의 바이너리에 통합하여 별도 도구 설치 없이 개발을 시작할 수 있다. TypeScript를 네이티브로 지원하여 ts-node 없이 직접 실행되며, LSP를 내장하여 VS Code와 JetBrains에서 코드 자동완성과 타입 검사가 즉시 동작한다. 테스트 커버리지 리포트도 내장 지원하여 Jest나 Vitest 없이 기본적인 테스트 워크플로우를 구성할 수 있다.

Deno Deploy로 엣지 배포

Deno Deploy는 Deno 런타임을 글로벌 엣지 네트워크에서 실행하는 서버리스 플랫폼이다. GitHub 저장소를 연결하면 푸시마다 자동 배포되며, 전 세계 35개 이상의 리전에서 코드가 실행된다. 콜드 스타트가 없고 V8 Isolates 기반으로 매우 빠른 응답 시간을 제공한다. Fresh 프레임워크(Deno 기반 풀스택 웹 프레임워크)와 조합하면 Vercel의 Next.js 경험과 유사한 배포 경험을 Deno 생태계에서 누릴 수 있다.

Node.js 프로젝트 마이그레이션

마이그레이션 체크리스트

Node.js 프로젝트를 Deno 2로 마이그레이션할 때 확인해야 할 주요 사항은 다음과 같다. 네이티브 애드온(.node 파일)이 없을 것, ESM 또는 CJS 모듈을 사용할 것, 환경 변수 접근 패턴이 Deno.env.get()으로 대체 가능할 것이다. deno.jsonnodeModulesDir 옵션으로 node_modules 디렉토리를 생성하면 대부분의 Node.js 의존성을 그대로 사용할 수 있다.

Bun과의 비교

Bun은 Node.js 호환성과 속도를 최우선으로, Deno는 보안과 웹 표준 준수를 최우선으로 설계되었다는 점이 근본적 차이다. npm 생태계를 그대로 사용하면서 빠른 성능이 필요하다면 Bun, 보안이 중요하거나 새로운 프로젝트에서 웹 표준 API를 활용하고 싶다면 Deno가 더 적합하다. 두 런타임 모두 Node.js와 높은 호환성을 목표로 하며, 2026년 현재 각자의 강점이 뚜렷한 영역을 차지하고 있다.

자주 묻는 질문

Deno 2는 Node.js를 완전히 대체할 수 있나요?+

대부분의 Node.js 워크로드를 처리할 수 있지만, 네이티브 애드온이나 특수한 Node.js API를 사용하는 경우 완전한 대체는 어렵습니다. 신규 프로젝트에서는 충분히 선택지가 됩니다.

Deno의 퍼미션 모델이 번거롭지 않나요?+

처음에는 번거롭게 느껴지지만 deno.json의 "permissions" 설정으로 프로젝트별 기본 권한을 설정할 수 있습니다. 보안 이점이 그 불편함을 상쇄합니다.

관련 글