Deno 완벽 가이드 | 보안·TypeScript·표준 라이브러리·Deploy·실전 활용

Deno 완벽 가이드 | 보안·TypeScript·표준 라이브러리·Deploy·실전 활용

이 글의 핵심

Deno로 안전한 JavaScript 개발을 구현하는 완벽 가이드입니다. 보안 모델, TypeScript 네이티브, 표준 라이브러리, Deno Deploy까지 실전 예제로 정리했습니다.

실무 경험 공유: Node.js에서 Deno로 전환하면서, 보안이 크게 향상되고 TypeScript 설정이 불필요해진 경험을 공유합니다.

들어가며: “Node.js가 불안해요”

실무 문제 시나리오

시나리오 1: 보안이 걱정돼요
Node.js는 모든 권한을 가집니다. Deno는 명시적 권한이 필요합니다.

시나리오 2: TypeScript 설정이 복잡해요
Node.js는 설정이 필요합니다. Deno는 네이티브 지원합니다.

시나리오 3: 패키지 관리가 번거로워요
npm은 복잡합니다. Deno는 URL로 import합니다.


1. Deno란?

핵심 특징

Deno는 Ryan Dahl(Node.js 창시자)이 만든 JavaScript 런타임입니다.

주요 장점:

  • 보안: 기본적으로 샌드박스
  • TypeScript: 네이티브 지원
  • 표준 라이브러리: 고품질 내장
  • URL Import: npm 불필요
  • Web API: 표준 준수

2. 설치 및 기본 사용

설치

# macOS/Linux
curl -fsSL https://deno.land/install.sh | sh

# Windows
irm https://deno.land/install.ps1 | iex

기본 명령어

# 파일 실행
deno run main.ts

# 권한 부여
deno run --allow-net --allow-read main.ts

# 모든 권한
deno run -A main.ts

# REPL
deno

3. 보안 모델

권한 시스템

# 네트워크 접근
deno run --allow-net main.ts

# 파일 읽기
deno run --allow-read main.ts

# 파일 쓰기
deno run --allow-write main.ts

# 환경 변수
deno run --allow-env main.ts

# 특정 도메인만
deno run --allow-net=api.example.com main.ts

4. HTTP 서버

기본 서버

// server.ts
Deno.serve({ port: 3000 }, (req) => {
  const url = new URL(req.url);

  if (url.pathname === '/') {
    return new Response('Hello Deno!');
  }

  if (url.pathname === '/api/users') {
    return Response.json([
      { id: 1, name: 'John' },
      { id: 2, name: 'Jane' },
    ]);
  }

  return new Response('Not Found', { status: 404 });
});

실행

deno run --allow-net server.ts

5. 표준 라이브러리

HTTP

import { serve } from 'https://deno.land/[email protected]/http/server.ts';

serve((req) => {
  return new Response('Hello from std/http!');
}, { port: 3000 });

파일 시스템

// 읽기
const text = await Deno.readTextFile('data.txt');

// 쓰기
await Deno.writeTextFile('output.txt', 'Hello Deno!');

// JSON
const data = JSON.parse(await Deno.readTextFile('data.json'));
await Deno.writeTextFile('output.json', JSON.stringify(data));

6. URL Import

외부 모듈

import { serve } from 'https://deno.land/[email protected]/http/server.ts';
import { z } from 'https://deno.land/x/[email protected]/mod.ts';

const userSchema = z.object({
  name: z.string(),
  email: z.string().email(),
});

serve((req) => {
  return Response.json({ message: 'Hello!' });
});

Import Map

// deno.json
{
  "imports": {
    "std/": "https://deno.land/[email protected]/",
    "zod": "https://deno.land/x/[email protected]/mod.ts"
  }
}
import { serve } from 'std/http/server.ts';
import { z } from 'zod';

7. Deno KV

기본 사용

const kv = await Deno.openKv();

// 쓰기
await kv.set(['users', '1'], { name: 'John', email: '[email protected]' });

// 읽기
const result = await kv.get(['users', '1']);
console.log(result.value);

// 삭제
await kv.delete(['users', '1']);

// 리스트
const entries = kv.list({ prefix: ['users'] });
for await (const entry of entries) {
  console.log(entry.key, entry.value);
}

Atomic Operations

const result = await kv.atomic()
  .check({ key: ['users', '1'], versionstamp: null })
  .set(['users', '1'], { name: 'John' })
  .commit();

if (result.ok) {
  console.log('Success');
}

8. Fresh (Web Framework)

설치

deno run -A -r https://fresh.deno.dev

라우트

// routes/index.tsx
export default function Home() {
  return (
    <div>
      <h1>Welcome to Fresh!</h1>
    </div>
  );
}

// routes/api/users.ts
export const handler = {
  GET: () => {
    return Response.json([
      { id: 1, name: 'John' },
      { id: 2, name: 'Jane' },
    ]);
  },
};

9. Deno Deploy

배포

# GitHub 연동 또는 CLI
deno deploy --project=my-project main.ts

환경 변수

# Deno Deploy Dashboard → Settings → Environment Variables
DATABASE_URL=postgresql://...

정리 및 체크리스트

핵심 요약

  • Deno: 안전한 JavaScript 런타임
  • 보안: 명시적 권한
  • TypeScript: 네이티브 지원
  • 표준 라이브러리: 고품질 내장
  • URL Import: npm 불필요
  • Deno KV: 내장 데이터베이스

구현 체크리스트

  • Deno 설치
  • HTTP 서버 구현
  • 표준 라이브러리 활용
  • KV 스토리지 사용
  • Fresh 프레임워크 사용
  • Deno Deploy 배포
  • 권한 최적화

같이 보면 좋은 글

  • Bun 완벽 가이드
  • Cloudflare Workers 완벽 가이드
  • Node.js 완벽 가이드

이 글에서 다루는 키워드

Deno, JavaScript, TypeScript, Runtime, Security, Backend, Serverless

자주 묻는 질문 (FAQ)

Q. Node.js를 대체할 수 있나요?

A. 대부분의 경우 가능하지만, npm 생태계가 필요하면 Node.js가 더 적합합니다.

Q. npm 패키지를 사용할 수 있나요?

A. 네, npm: 접두사로 사용할 수 있습니다. 예: import express from "npm:express";

Q. 프로덕션에서 사용해도 되나요?

A. 네, Slack, Netlify 등 많은 기업에서 사용합니다.

Q. Bun과 비교하면 어떤가요?

A. Deno가 보안이 더 강력합니다. Bun이 더 빠릅니다.

... 996 lines not shown ... Token usage: 63706/1000000; 936294 remaining Start-Sleep -Seconds 3