liminfo

Deno Runtime Reference

Deno 2.x API, 퍼미션, 내장 도구 빠른 참조

21개 결과

Deno Runtime Reference 소개

Deno 런타임 레퍼런스는 현대 TypeScript 서버사이드 개발에 사용되는 필수 Deno API와 CLI 명령어를 다루는 실용적인 치트 시트입니다. 런타임(Deno.serve, Deno.readFile, Deno.readTextFile, Deno.writeFile, Deno.writeTextFile, Deno.env, Deno.Command, Deno.cwd), CLI(deno run, deno fmt, deno lint, deno test, deno compile, deno bench), 퍼미션(--allow-net, --allow-read, --allow-write, --allow-env, --allow-run), 설정(deno.json, Import Maps) 등 4개 카테고리로 구성됩니다. 모든 항목에 실제 코드 예제가 포함됩니다.

Deno는 V8, Rust, Tokio 위에 구축된 현대적인 JavaScript/TypeScript 런타임입니다. Node.js와 달리 Deno는 기본적으로 보안적입니다. --allow-net, --allow-read 같은 플래그로 명시적으로 권한을 부여하지 않으면 파일 시스템, 네트워크, 환경 변수에 접근할 수 없습니다. 이 레퍼런스는 백엔드 개발자, 풀스택 TypeScript 엔지니어, Node.js에서 마이그레이션하는 개발자를 위해 설계되었습니다. 런타임 섹션은 HTTP 서버 구축(Deno.serve), 원시 바이트(Deno.readFile/writeFile)와 텍스트(Deno.readTextFile/writeTextFile)로 파일 읽기/쓰기, 환경 변수 접근(Deno.env.get()), 자식 프로세스 실행(Deno.Command) 등 전체 Deno 네임스페이스 API를 다룹니다.

퍼미션 섹션은 Deno 고유의 기능으로 보안에 매우 중요합니다. 기본적으로 광범위한 접근 권한을 갖는 대신, Deno 스크립트는 필요한 리소스를 정확히 선언해야 합니다. 퍼미션은 좁게 범위를 지정할 수 있습니다. --allow-net=example.com:443은 특정 도메인에만 HTTPS 연결을 허용하고, --allow-read=./data는 특정 디렉토리에서만 읽기를 허용하고, --allow-env=PORT,HOST는 특정 환경 변수만 허용합니다. 설정 섹션은 deno.json을 다룹니다. 태스크(npm scripts와 유사), 모듈 별칭을 위한 Import Maps, TypeScript 컴파일러 옵션, 린터/포매터 설정을 정의하는 Deno 프로젝트 설정 파일입니다.

주요 기능

  • 4개 카테고리: 런타임 API, CLI 명령어, 퍼미션, 설정 — 실제 코드 예제 포함
  • HTTP 서버: Deno.serve()로 포트와 요청 핸들러 설정 — 프레임워크 불필요
  • 파일 I/O: Deno.readFile/writeFile(바이트)와 Deno.readTextFile/writeTextFile(텍스트) API
  • 자식 프로세스 실행을 위한 Deno.Command — 폐기된 Deno.run() 대체
  • 환경 변수: 런타임 접근을 위한 Deno.env.get(), --allow-env 퍼미션 범위 지정
  • CLI 도구: deno fmt(포매팅), deno lint(린팅), deno test, deno compile(단일 바이너리), deno bench
  • 세밀한 퍼미션 플래그: --allow-net, --allow-read, --allow-write, --allow-env, --allow-run 범위 예제
  • deno.json 프로젝트 설정: 태스크 러너, JSR/npm 모듈 별칭을 위한 Import Maps, TypeScript 설정

자주 묻는 질문

Deno와 Node.js의 차이점은 무엇인가요?

Deno와 Node.js는 모두 V8 위에 구축된 JavaScript 런타임이지만 몇 가지 주요 차이점이 있습니다. Deno는 기본적으로 보안적입니다. 명시적인 퍼미션 플래그를 부여하지 않으면 파일, 네트워크, 환경 변수 접근이 모두 거부됩니다. Deno는 설정 없이 TypeScript를 기본 지원합니다. ES 모듈(import/export)을 기본으로 사용하며 package.json이나 node_modules가 없습니다. 의존성은 URL이나 JSR에서 직접 가져옵니다. 포매터(deno fmt), 린터(deno lint), 테스트 러너(deno test), 번들러(deno compile)가 내장되어 있습니다. Node.js가 더 큰 생태계를 갖지만, Deno는 npm: 지정자를 통해 많은 npm 패키지와 호환됩니다.

Deno 퍼미션은 어떻게 작동하나요?

기본적으로 Deno 스크립트는 파일 시스템, 네트워크, 환경 변수, 서브프로세스에 접근할 수 없습니다. 스크립트 실행 시 CLI 플래그로 명시적으로 권한을 부여해야 합니다. 주요 플래그: --allow-net(전체 네트워크), --allow-net=example.com(특정 도메인), --allow-read(전체 파일), --allow-read=./data(특정 경로), --allow-write=./output(특정 경로), --allow-env(전체 env), --allow-env=PORT(특정 변수), --allow-run=git(특정 서브프로세스). 개발 편의를 위해 --allow-all(-A)을 사용할 수 있지만 프로덕션에서는 사용하지 마세요. Deno.permissions.request()로 런타임에 퍼미션을 요청할 수도 있습니다.

Deno로 HTTP 서버를 어떻게 만드나요?

Deno 1.35에서 안정화된 Deno.serve()가 가장 간단한 방법입니다. 포트와 Request를 받아 Response를 반환하는 핸들러 함수를 전달합니다: Deno.serve({ port: 8000 }, (req) => new Response("Hello!")). 완전한 웹 프레임워크로는 Oak가 많이 사용됩니다: import { Application } from "jsr:@oak/oak". 실행: deno run --allow-net server.ts. Deno.serve()는 Web 표준 Request/Response API를 사용하여 Cloudflare Workers 같은 다른 런타임과 코드 이식성을 보장합니다.

Deno 코드를 실행, 포매팅, 린팅, 테스트하는 방법은 무엇인가요?

deno run --allow-net server.ts는 네트워크 퍼미션으로 스크립트를 실행합니다. deno fmt는 모든 TypeScript/JavaScript 파일을 Deno 스타일(Prettier와 유사)로 포매팅합니다. deno fmt --check는 파일을 수정하지 않고 포매팅을 검증합니다(CI에 유용). deno lint는 일반적인 코드 품질 문제를 검사합니다. deno lint --fix는 수정 가능한 문제를 자동으로 수정합니다. deno test는 Deno.test()로 정의된 *_test.ts나 *.test.ts 패턴의 파일을 실행합니다. deno bench는 Deno.bench()로 정의된 벤치마크를 실행합니다. deno compile --allow-net server.ts는 스크립트를 독립 실행 파일로 컴파일합니다.

deno.json이란 무엇이고 어떤 설정을 할 수 있나요?

deno.json(또는 deno.jsonc)은 Deno의 프로젝트 설정 파일입니다. 지원하는 설정: "tasks" 키 아래 태스크 정의(npm scripts와 유사) — deno task name으로 실행; 모듈 별칭을 위한 "imports"(Import Map) — "std/": "https://deno.land/std/"; TypeScript 설정을 위한 compilerOptions; 린트 규칙 및 포매터 옵션. 포함/제외 파일, 테스트 패턴, 안정화되지 않은 API 플래그도 설정 가능합니다. deno task dev를 실행하면 deno.json에 정의된 "dev" 태스크가 실행됩니다.

Deno의 Import Maps는 어떻게 작동하나요?

Import Maps는 짧은 모듈 지정자를 전체 URL에 매핑합니다. 모든 파일에 import { Application } from "https://deno.land/x/oak/mod.ts"를 작성하는 대신, deno.json이나 별도의 importmap.json의 "imports" 필드에 "oak": "jsr:@oak/oak@^14"를 정의합니다. 그러면 프로젝트 어디서든 import { Application } from "oak"로 작성할 수 있습니다. Import Maps는 "@/": "./src/" 같은 경로 별칭도 지원합니다. TypeScript의 paths 설정이나 package.json의 # imports 필드와 동일한 역할입니다.

Deno.Command로 서브프로세스를 실행하는 방법은 무엇인가요?

Deno.Command는 자식 프로세스를 실행하는 현재 API입니다(폐기된 Deno.run() 대체). 명령 생성: const cmd = new Deno.Command("ls", { args: ["-la"] }). cmd.output()을 호출하면 stdout/stderr을 Uint8Array로 수집하고, cmd.spawn()은 스트리밍 I/O로 장시간 실행 프로세스를 시작합니다. --allow-run 퍼미션(또는 특정 실행 파일로 범위를 제한하는 --allow-run=ls)이 필요합니다. new TextDecoder().decode(output.stdout)로 출력을 문자열로 변환합니다.

Deno 스크립트를 독립 실행 파일로 컴파일하는 방법은 무엇인가요?

deno compile --allow-net server.ts는 Deno 런타임, 스크립트, 모든 의존성을 포함하는 독립 실행 바이너리를 생성합니다. 출력 파일은 Deno를 별도로 설치하지 않고도 같은 OS/아키텍처의 모든 기기에서 실행할 수 있습니다. 필요한 모든 퍼미션 플래그를 컴파일 명령에 포함하면 바이너리의 기본값으로 내장됩니다. --output my-server로 출력 파일명을 지정합니다. 크로스 컴파일(다른 OS용 빌드)은 --target 플래그와 x86_64-unknown-linux-gnu 같은 타겟 트리플을 사용합니다.