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이 더 빠릅니다.