본문 바로가기
Infra2026년 4월 19일6분 읽기

Cloudflare Workers 에지 컴퓨팅 실전 — Durable Objects·D1·R2 통합 가이드

YS
김영삼
조회 413

핵심 요약

Cloudflare Workers는 Lambda와 달리 cold start가 사실상 없다(수 ms). V8 Isolate 기반이라 컨테이너 초기화 비용이 없기 때문이다. 2026년 기준 스택이 크게 확장돼 단독 플랫폼으로 서비스 구동이 가능해졌다.

  • Workers: 서버리스 함수 (JS/TS/Rust/Python)
  • Durable Objects: 전역 단일 인스턴스 객체 (상태·실시간)
  • D1: SQLite 기반 서버리스 SQL DB
  • R2: S3 호환 오브젝트 스토리지 (송신 비용 무료)
  • KV: 전세계 eventually consistent 키-값 저장소
  • Queues: 메시지 큐

Hello Workers

// worker.ts
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);
    if (url.pathname === '/hello') return new Response('Hi from edge');
    return new Response('Not Found', { status: 404 });
  },
};
wrangler dev       # 로컬
wrangler deploy    # 전 세계 배포

Durable Objects — "전역 싱글톤"

같은 ID의 Durable Object는 전 세계에서 하나의 인스턴스로만 존재한다. 상태·락·실시간 브로드캐스트에 이상적.

export class ChatRoom {
  constructor(state: DurableObjectState, env: Env) {
    this.state = state;
    this.sessions = new Set();
  }
  async fetch(req: Request) {
    if (req.headers.get('Upgrade') === 'websocket') {
      const pair = new WebSocketPair();
      this.accept(pair[1]);
      return new Response(null, { status: 101, webSocket: pair[0] });
    }
  }
  accept(ws: WebSocket) {
    ws.accept();
    this.sessions.add(ws);
    ws.addEventListener('message', (e) => {
      for (const s of this.sessions) s.send(e.data);
    });
  }
}

이 한 블록이 분산 채팅 서버가 된다. 별도 Redis pub/sub 없이 동작.

D1 — 서버리스 SQLite

const { results } = await env.DB.prepare(
  'SELECT * FROM posts WHERE author_id = ? LIMIT 20'
).bind(authorId).all();
  • Workers 데이터 센터에 primary + 리드 리플리카
  • 쓰기 지연 있음(수십 ms), 읽기는 수 ms
  • 마이그레이션 CLI(wrangler d1 migrations) 제공
  • Prisma·Drizzle 어댑터 지원

R2 — S3 대체

// 파일 업로드
await env.BUCKET.put(key, request.body, {
  httpMetadata: { contentType: 'image/png' },
});
// 조회
const obj = await env.BUCKET.get(key);
return new Response(obj.body, { headers: { 'Content-Type': obj.httpMetadata.contentType } });

AWS S3 최대 장점은 egress 무료. 이미지·CDN 오리진·백업에 비용 이점이 크다.

실전 아키텍처 예

글로벌 SaaS (읽기 중심)

  • 정적 자산: Pages(Workers 통합) + R2
  • API: Workers
  • DB: D1 (테넌트별 스키마) 또는 Turso
  • 인증·세션: KV
  • 실시간 알림: Durable Objects + SSE

AI 앱

  • 프런트: Pages
  • Workers에서 Anthropic API 호출 (API 키 env 보관)
  • 프롬프트/응답 캐시: KV
  • 사용자 파일 업로드: R2
  • 세션·history: Durable Objects

한계·주의

  • Workers 요청당 CPU 시간 제한 (기본 50ms ~ 확장 가능)
  • Node 생태계 전체 호환 아님 — nodejs_compat 플래그로 일부 지원
  • D1 쓰기 지연 → 쓰기 비중 높은 워크로드는 Postgres가 유리
  • 장기 실행 작업(수 초 이상)은 Queues + consumer Worker로 분리

비용 감각

  • Workers: 요청당 $0.30 / 100만 (유료 플랜)
  • R2: 저장 $0.015 / GB/월, egress 무료
  • D1: 읽기 $0.001 / 100만, 쓰기 $1 / 100만
  • Durable Objects: 활성 요청 시간 기반 과금

로컬 개발

wrangler dev --local
# D1·KV·R2 전부 로컬 미니플레어 바인딩으로 에뮬레이션

로컬에서 에지 환경을 거의 그대로 재현 가능. CI에도 쉽게 태워지는 구조.

자주 묻는 질문

Vercel·Netlify와 비교?

Vercel/Netlify는 Next.js·JAMstack 중심의 통합 DX가 강점. Cloudflare는 인프라 자체의 엣지성과 비용이 강점. AI 백엔드·글로벌 서비스는 Cloudflare가 점점 유리하다.

AWS Lambda 대체 가능?

대부분의 경량 API·CRUD·스트리밍은 대체 가능. Node 의존 네이티브 모듈·무거운 초기화가 필요한 워크로드는 여전히 Lambda가 맞다.

Python Workers는 어느 수준?

Pyodide 기반. 프로토타입·ML 전처리는 가능하지만 성능·생태계는 아직 JS/Rust 수준엔 못 미친다. 실무 1선은 TS 권장.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록