본문으로 건너뛰기
AICosmus

Where tech meets the everyday — AI, fintech, swimming, and cars.

AICosmus

Where tech meets the everyday — AI, fintech, swimming, and cars.

  • 홈
  • IT기술
    • RAG
    • GRPC
    • Kotlin
    • LLM
    • 금융 IT
    • 에이전트
    • 제로Trust
    • 자동화
  • 일상
    • 자동차
    • 경제/재테크
    • 생활정보
  • About
    • Contact
    • Terms of Service
    • Disclaimer
    • Privacy – Policy
  • 홈
  • IT기술
    • RAG
    • GRPC
    • Kotlin
    • LLM
    • 금융 IT
    • 에이전트
    • 제로Trust
    • 자동화
  • 일상
    • 자동차
    • 경제/재테크
    • 생활정보
  • About
    • Contact
    • Terms of Service
    • Disclaimer
    • Privacy – Policy
Cloudflare 풀스택 아키텍처를 조립하는 1인 개발자
IT기술

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 16/16화: Cloudflare 풀스택 0원 창업: 1인 개발자 도메인→에이전트 완전 가이드

By AICosmus
2026년 06월 23일 19 Min Read
0

이 글은 「Cloudflare 완전 정복」 시리즈의 마지막 16회입니다. 1회에서 ‘연결성 클라우드’라는 개념으로 문을 열었고, DNS·CDN·SSL(2~3회), 정적 사이트 배포(4회), 홈랩 터널·Zero Trust(5~7회), R2 스토리지(8회), Workers 풀스택(9~12회), 그리고 2026 AI 에이전트 시대(13~15회)까지 — 15회에 걸쳐 Cloudflare의 모든 레이어를 하나씩 해부해왔습니다. 이번 최종회에서는 그 모든 조각을 하나의 청사진으로 조립합니다. 1인 개발자 또는 초기 창업자가 월 0원에 가깝게 도메인 등록부터 AI 에이전트 배포까지 완성하는 실전 풀스택 아키텍처를, 처음부터 끝까지 따라 만들어봅니다.

왜 Cloudflare 풀스택인가 — 1인 개발자의 현실

2026년, 혼자서 서비스를 만들어 세상에 내놓으려는 개발자가 직면하는 현실은 냉혹합니다. AWS에 프리 티어로 시작해도 RDS, CloudFront, Route 53, S3, Lambda를 조합하면 월 $30~$80이 기본으로 깔립니다. 거기에 AI 기능을 넣으려면 OpenAI API 비용이 월 $20~$100 추가됩니다. 사용자가 한 명도 없는 MVP 단계에서 월 10만 원 이상을 인프라에 태우는 건 정신적으로도, 재정적으로도 지속 가능하지 않습니다.

Cloudflare는 이 문제에 대한 가장 현실적인 답을 제시합니다. DNS·CDN·SSL은 완전 무료이고, Workers 무료 플랜은 하루 10만 요청을 허용하며, D1 데이터베이스·R2 스토리지·KV 저장소 모두 무료 한도가 넉넉합니다. Workers AI는 일일 1만 뉴런(약 100~300회 LLM 호출)을 무료로 제공하고, Pages는 무제한 정적 사이트 배포가 가능합니다. 이 모든 것이 전 세계 330개 이상 도시의 엣지 네트워크 위에서 동작합니다.

핵심은 각 서비스가 독립적으로도 훌륭하지만, 하나의 플랫폼 위에서 조합했을 때 시너지가 폭발한다는 점입니다. Workers에서 D1을 호출할 때 네트워크 지연이 없고, R2에서 파일을 읽을 때 송신료가 0원이며, Tunnel로 홈랩 백엔드를 연결할 때 별도 VPN 장비가 필요 없습니다. 15회 동안 하나씩 배운 부품들이 레고처럼 딱 맞물리는 경험 — 그것이 이번 최종회의 목표입니다.

Cloudflare 7레이어 풀스택 아키텍처 다이어그램 - 1인 개발자

풀스택 아키텍처 청사진 — 7개 레이어 한눈에 보기

우리가 구축할 풀스택은 다음 7개 레이어로 구성됩니다. 각 레이어는 이전 회차에서 깊이 다뤘으므로 여기서는 조립 관점에서 핵심만 짚겠습니다.

레이어 1: 도메인 + DNS (2회 복습)

모든 것의 시작점입니다. Cloudflare Registrar에서 도메인을 등록하면 WHOIS 프라이버시가 무료이고, 마크업 없이 원가에 갱신됩니다. .com 기준 연 $10.44(약 14,000원)이 유일한 고정 비용입니다. DNS는 Cloudflare 네임서버를 사용하면 DNSSEC·애니캐스트·무제한 레코드가 모두 무료입니다.

레이어 2: SSL/TLS + 보안 (3회 복습)

Cloudflare 프록시를 켜는 순간 HTTPS가 자동 적용됩니다. Universal SSL 인증서가 무료로 발급되고, HSTS·Content-Security-Policy 등 보안 헤더도 대시보드에서 클릭 몇 번으로 설정됩니다. Let’s Encrypt 갱신 스크립트를 cron에 돌릴 필요가 없습니다.

레이어 3: 프론트엔드 — Pages (4회 복습)

React·Vue·Astro·Next.js(정적 내보내기) 등 어떤 프레임워크든 Git 푸시 한 번으로 글로벌 배포됩니다. 빌드당 무료, 월 500회 빌드, 무제한 대역폭. 커스텀 도메인 연결은 CNAME 레코드 하나면 끝입니다.

레이어 4: 백엔드 API — Workers + D1 + KV (9~11회 복습)

서버리스 함수(Workers)가 API 역할을 하고, D1(SQLite 기반)이 관계형 데이터를, KV가 키-값 캐시를, R2가 파일 스토리지를 담당합니다. 무료 플랜으로도 하루 10만 요청·D1 500만 행 읽기·KV 10만 읽기·R2 10GB 저장이 가능합니다.

레이어 5: 홈랩 연동 — Tunnel + Zero Trust (5~7회 복습)

집에 있는 Synology NAS나 Mac Studio의 서비스를 공유기 포트포워딩 없이 안전하게 공개합니다. cloudflared 데몬이 아웃바운드 연결만 사용하므로 인바운드 포트가 열리지 않고, Zero Trust Access로 접근 권한을 이메일·OTP 기반으로 통제합니다.

레이어 6: AI 기능 — Workers AI + Agents SDK (12~13회 복습)

엣지에서 LLM·임베딩·이미지 생성·TTS 모델을 직접 호출합니다. 2026년 6월 기준 200개 이상의 모델이 Workers AI 카탈로그에 등록되어 있고, Agents SDK로 상태를 가진 장기 실행 에이전트를 Durable Objects 위에 구축할 수 있습니다.

레이어 7: 에이전트 인프라 — MCP Portals + Workflows v2 + Email (14~15회 복습)

AI 에이전트가 외부 도구에 안전하게 접근하는 MCP Server Portals, 5만 동시 실행이 가능한 Workflows v2 오케스트레이터, 그리고 이메일 발송·수신을 네이티브로 처리하는 Email Service까지 — 에이전트가 사람처럼 일하는 데 필요한 모든 인프라가 갖춰져 있습니다.

실전 프로젝트: “AI 리뷰 요약봇” 풀스택 구축

이론만으로는 감이 오지 않습니다. 실제로 만들어봅시다. 우리의 프로젝트는 “AI 리뷰 요약봇” — 사용자가 상품 리뷰 URL을 입력하면 AI가 핵심 장단점을 요약해주고, 결과를 이메일로 받을 수 있는 서비스입니다. 프론트엔드(Pages), 백엔드 API(Workers), 데이터베이스(D1), 파일 저장(R2), AI 요약(Workers AI), 이메일 발송(Email Service), 에이전트 워크플로(Workflows v2)를 모두 사용합니다.

Step 0: 사전 준비

시작하기 전에 필요한 것들을 확인합니다.

  • Cloudflare 계정: 무료 플랜이면 충분합니다.
  • 도메인 1개: Cloudflare Registrar에서 구매하거나, 기존 도메인의 네임서버를 Cloudflare로 변경합니다.
  • Node.js 18+: Wrangler CLI 실행에 필요합니다.
  • Git: 소스 관리 및 Pages 자동 배포에 사용합니다.

Mac Studio나 로컬 개발 머신에서 다음 명령으로 Wrangler를 설치합니다.

# Wrangler CLI 설치 (최신 v4)
npm install -g wrangler

# 로그인 — 브라우저가 열리며 OAuth 인증
wrangler login

# 인증 확인
wrangler whoami

Step 1: 프로젝트 스캐폴딩

풀스택 프로젝트의 디렉토리 구조를 잡습니다. 프론트엔드와 백엔드를 모노레포로 관리하면 배포 파이프라인이 단순해집니다.

# 프로젝트 루트 생성
mkdir review-summary-bot && cd review-summary-bot
git init

# 디렉토리 구조
mkdir -p frontend/src
mkdir -p worker/src
mkdir -p worker/migrations

# 루트 package.json
cat > package.json << 'EOF'
{
  "name": "review-summary-bot",
  "private": true,
  "workspaces": ["frontend", "worker"],
  "scripts": {
    "dev:frontend": "cd frontend && npm run dev",
    "dev:worker": "cd worker && wrangler dev",
    "deploy:frontend": "cd frontend && wrangler pages deploy dist",
    "deploy:worker": "cd worker && wrangler deploy"
  }
}
EOF

Step 2: D1 데이터베이스 생성 + 마이그레이션

요약 요청 이력과 결과를 저장할 D1 데이터베이스를 만듭니다. D1은 SQLite 기반이라 스키마가 직관적이고, 무료 플랜에서도 5GB 저장·500만 행 읽기·10만 행 쓰기를 매일 사용할 수 있습니다.

# D1 데이터베이스 생성
wrangler d1 create review-bot-db

# 출력 예시:
# ✅ Successfully created DB 'review-bot-db'
# database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# → 이 ID를 wrangler.toml에 기록합니다

마이그레이션 파일을 작성합니다.

# worker/migrations/0001_init.sql
cat > worker/migrations/0001_init.sql << 'EOF'
CREATE TABLE IF NOT EXISTS summaries (
  id         TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
  url        TEXT NOT NULL,
  status     TEXT NOT NULL DEFAULT 'pending',
  summary    TEXT,
  pros       TEXT,
  cons       TEXT,
  email      TEXT,
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
  updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE INDEX idx_summaries_status ON summaries(status);
CREATE INDEX idx_summaries_created ON summaries(created_at);
EOF

# 마이그레이션 실행 (로컬)
cd worker
wrangler d1 migrations apply review-bot-db --local

# 마이그레이션 실행 (리모트 — 배포 시)
wrangler d1 migrations apply review-bot-db --remote

Step 3: R2 버킷 생성

요약 결과를 PDF나 JSON 파일로 저장할 R2 버킷을 만듭니다. R2는 10GB 저장·월 100만 쓰기·1,000만 읽기가 무료이고, 무엇보다 송신료(egress)가 완전 무료입니다.

# R2 버킷 생성
wrangler r2 bucket create review-bot-storage

# 출력 확인
wrangler r2 bucket list

Step 4: KV 네임스페이스 생성

자주 조회되는 요약 결과를 캐싱할 KV 네임스페이스를 만듭니다. 같은 URL에 대한 반복 요청을 AI 호출 없이 즉시 응답하기 위함입니다.

# KV 네임스페이스 생성
wrangler kv namespace create CACHE

# 출력 예시:
# ✅ Created namespace "review-summary-bot-CACHE"
# id = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"

# preview용 (로컬 개발)
wrangler kv namespace create CACHE --preview

Step 5: Worker 백엔드 작성

이제 핵심인 Worker 코드를 작성합니다. wrangler.toml에서 모든 바인딩을 선언하고, TypeScript로 API 로직을 구현합니다.

# worker/wrangler.toml
cat > worker/wrangler.toml << 'EOF'
name = "review-summary-bot-api"
main = "src/index.ts"
compatibility_date = "2026-06-01"

# D1 바인딩
[[d1_databases]]
binding = "DB"
database_name = "review-bot-db"
database_id = "YOUR_D1_DATABASE_ID"
migrations_dir = "migrations"

# R2 바인딩
[[r2_buckets]]
binding = "STORAGE"
bucket_name = "review-bot-storage"

# KV 바인딩
[[kv_namespaces]]
binding = "CACHE"
id = "YOUR_KV_NAMESPACE_ID"
preview_id = "YOUR_KV_PREVIEW_ID"

# Workers AI 바인딩
[ai]
binding = "AI"

# 환경변수
[vars]
ENVIRONMENT = "production"
EOF

메인 Worker 코드입니다. Hono 프레임워크를 사용하면 Express와 유사한 라우팅을 Workers 위에서 구현할 수 있습니다.

# worker/package.json
cat > worker/package.json << 'EOF'
{
  "name": "review-summary-bot-api",
  "private": true,
  "scripts": {
    "dev": "wrangler dev",
    "deploy": "wrangler deploy"
  },
  "dependencies": {
    "hono": "^4.7.0"
  },
  "devDependencies": {
    "@cloudflare/workers-types": "^4.20260601.0",
    "wrangler": "^4.0.0",
    "typescript": "^5.8.0"
  }
}
EOF

cd worker && npm install
// worker/src/index.ts
import { Hono } from 'hono';
import { cors } from 'hono/cors';

// 환경 바인딩 타입 선언
type Bindings = {
  DB: D1Database;
  STORAGE: R2Bucket;
  CACHE: KVNamespace;
  AI: Ai;
  ENVIRONMENT: string;
};

const app = new Hono<{ Bindings: Bindings }>();

// CORS 설정 — Pages 프론트엔드에서의 호출 허용
app.use('*', cors({
  origin: ['https://review-bot.example.com', 'http://localhost:5173'],
  allowMethods: ['GET', 'POST'],
  allowHeaders: ['Content-Type'],
}));

// 헬스체크
app.get('/healthz', (c) => c.json({ status: 'ok', ts: new Date().toISOString() }));

// 요약 요청 생성
app.post('/api/summaries', async (c) => {
  const { url, email } = await c.req.json<{ url: string; email?: string }>();

  if (!url || !url.startsWith('http')) {
    return c.json({ error: 'Valid URL is required' }, 400);
  }

  // 1. 캐시 확인 — 같은 URL의 기존 요약이 있으면 즉시 반환
  const cacheKey = `summary:${btoa(url)}`;
  const cached = await c.env.CACHE.get(cacheKey, 'json');
  if (cached) {
    return c.json({ source: 'cache', data: cached });
  }

  // 2. D1에 요청 레코드 생성
  const id = crypto.randomUUID().replace(/-/g, '');
  await c.env.DB.prepare(
    'INSERT INTO summaries (id, url, email) VALUES (?, ?, ?)'
  ).bind(id, url, email ?? null).run();

  // 3. Workers AI로 요약 생성
  const prompt = `다음 URL의 상품 리뷰를 분석해서 한국어로 요약해주세요.
URL: ${url}

다음 형식으로 응답해주세요:
- 한줄요약: (50자 이내)
- 장점: (불릿 3~5개)
- 단점: (불릿 2~3개)
- 총평: (100자 이내)`;

  const aiResponse = await c.env.AI.run(
    '@cf/meta/llama-3.3-70b-instruct-fp8-fast',
    { prompt, max_tokens: 1024 }
  ) as { response: string };

  const summary = aiResponse.response;

  // 4. 결과를 D1에 업데이트
  await c.env.DB.prepare(
    `UPDATE summaries SET status = 'done', summary = ?, updated_at = datetime('now')
     WHERE id = ?`
  ).bind(summary, id).run();

  // 5. R2에 결과 파일 저장
  const resultJson = JSON.stringify({ id, url, summary, created_at: new Date().toISOString() });
  await c.env.STORAGE.put(`results/${id}.json`, resultJson, {
    httpMetadata: { contentType: 'application/json' },
  });

  // 6. KV 캐시에 저장 (TTL 24시간)
  const responseData = { id, url, summary };
  await c.env.CACHE.put(cacheKey, JSON.stringify(responseData), { expirationTtl: 86400 });

  return c.json({ source: 'ai', data: responseData }, 201);
});

// 요약 결과 조회
app.get('/api/summaries/:id', async (c) => {
  const id = c.req.param('id');
  const result = await c.env.DB.prepare(
    'SELECT * FROM summaries WHERE id = ?'
  ).bind(id).first();

  if (!result) return c.json({ error: 'Not found' }, 404);
  return c.json({ data: result });
});

// 최근 요약 목록
app.get('/api/summaries', async (c) => {
  const limit = Math.min(Number(c.req.query('limit') ?? 20), 100);
  const results = await c.env.DB.prepare(
    'SELECT id, url, status, created_at FROM summaries ORDER BY created_at DESC LIMIT ?'
  ).bind(limit).all();

  return c.json({ data: results.results });
});

// R2에서 결과 파일 다운로드
app.get('/api/summaries/:id/download', async (c) => {
  const id = c.req.param('id');
  const object = await c.env.STORAGE.get(`results/${id}.json`);

  if (!object) return c.json({ error: 'File not found' }, 404);

  const headers = new Headers();
  headers.set('Content-Type', 'application/json');
  headers.set('Content-Disposition', `attachment; filename="summary-${id}.json"`);

  return new Response(object.body, { headers });
});

export default app;

Step 6: 프론트엔드 (Pages) 구축

React + Vite로 간단하지만 세련된 프론트엔드를 만들고, Cloudflare Pages에 배포합니다.

# 프론트엔드 프로젝트 초기화
cd ../frontend
npm create vite@latest . -- --template react-ts
npm install
// frontend/src/App.tsx — 핵심 컴포넌트
import { useState } from 'react';

const API_BASE = import.meta.env.PROD
  ? 'https://api.review-bot.example.com'
  : 'http://localhost:8787';

function App() {
  const [url, setUrl] = useState('');
  const [loading, setLoading] = useState(false);
  const [result, setResult] = useState<string | null>(null);

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    setLoading(true);
    try {
      const res = await fetch(`${API_BASE}/api/summaries`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ url }),
      });
      const data = await res.json();
      setResult(data.data.summary);
    } catch (err) {
      setResult('오류가 발생했습니다. 다시 시도해주세요.');
    } finally {
      setLoading(false);
    }
  };

  return (
    <main style={{ maxWidth: 640, margin: '0 auto', padding: '2rem' }}>
      <h1>AI 리뷰 요약봇</h1>
      <form onSubmit={handleSubmit}>
        <input
          type="url"
          value={url}
          onChange={(e) => setUrl(e.target.value)}
          placeholder="리뷰 페이지 URL을 입력하세요"
          required
          style={{ width: '100%', padding: '0.75rem', fontSize: '1rem' }}
        />
        <button type="submit" disabled={loading}
          style={{ marginTop: '1rem', padding: '0.75rem 2rem' }}>
          {loading ? '분석 중...' : '요약 시작'}
        </button>
      </form>
      {result && (
        <div style={{ marginTop: '2rem', whiteSpace: 'pre-wrap' }}>
          <h2>요약 결과</h2>
          <p>{result}</p>
        </div>
      )}
    </main>
  );
}

export default App;

Step 7: Pages 배포 + 커스텀 도메인

# 프론트엔드 빌드
cd frontend
npm run build

# Pages에 직접 배포
wrangler pages deploy dist --project-name=review-summary-bot

# 또는 GitHub 연동으로 자동 배포 (권장)
# Cloudflare 대시보드 → Pages → Create project → Connect to Git

# 커스텀 도메인 연결 (Cloudflare DNS에 자동 CNAME 추가)
wrangler pages project add-domain review-summary-bot review-bot.example.com

Step 8: Worker 배포 + 커스텀 도메인

# Worker 배포
cd ../worker
wrangler deploy

# API용 커스텀 도메인 설정 (대시보드 또는 wrangler.toml)
# wrangler.toml에 추가:
# routes = [
#   { pattern = "api.review-bot.example.com/*", zone_name = "example.com" }
# ]

# 재배포
wrangler deploy
AI 리뷰 요약봇 Workflows v2 처리 흐름도

Workflows v2로 에이전트 파이프라인 구축하기

15회에서 다뤘던 Workflows v2를 활용하면 단순 요청-응답을 넘어 다단계 처리 파이프라인을 구축할 수 있습니다. 리뷰 URL 수집 → 본문 크롤링 → AI 요약 → 결과 저장 → 이메일 발송이라는 5단계를 각각 독립된 스텝으로 분리하면, 중간에 실패해도 해당 스텝부터 재시도됩니다.

// worker/src/workflow.ts — Workflows v2 파이프라인
import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from 'cloudflare:workers';

type Env = {
  DB: D1Database;
  STORAGE: R2Bucket;
  CACHE: KVNamespace;
  AI: Ai;
};

type SummaryParams = {
  url: string;
  email?: string;
  summaryId: string;
};

export class ReviewSummaryWorkflow extends WorkflowEntrypoint<Env, SummaryParams> {
  async run(event: WorkflowEvent<SummaryParams>, step: WorkflowStep) {
    const { url, email, summaryId } = event.payload;

    // Step 1: URL에서 리뷰 텍스트 추출
    const reviewText = await step.do('fetch-review', async () => {
      const response = await fetch(url, {
        headers: { 'User-Agent': 'ReviewBot/1.0' },
      });
      const html = await response.text();
      // 간단한 텍스트 추출 (실제로는 더 정교한 파싱 필요)
      const textContent = html
        .replace(/<script[\s\S]*?<\/script>/gi, '')
        .replace(/<style[\s\S]*?<\/style>/gi, '')
        .replace(/<[^>]+>/g, ' ')
        .replace(/\s+/g, ' ')
        .trim()
        .slice(0, 8000);
      return textContent;
    });

    // Step 2: AI 요약 생성
    const summary = await step.do('ai-summarize', async () => {
      const result = await this.env.AI.run(
        '@cf/meta/llama-3.3-70b-instruct-fp8-fast',
        {
          prompt: `다음은 상품 리뷰 페이지의 텍스트입니다. 한국어로 요약해주세요.

리뷰 내용:
${reviewText}

다음 JSON 형식으로 응답해주세요:
{"summary": "한줄요약", "pros": ["장점1", "장점2"], "cons": ["단점1"], "verdict": "총평"}`,
          max_tokens: 1024,
        }
      ) as { response: string };
      return result.response;
    });

    // Step 3: D1 업데이트
    await step.do('update-db', async () => {
      await this.env.DB.prepare(
        `UPDATE summaries SET status = 'done', summary = ?, updated_at = datetime('now')
         WHERE id = ?`
      ).bind(summary, summaryId).run();
    });

    // Step 4: R2에 결과 저장
    await step.do('store-result', async () => {
      const resultData = JSON.stringify({
        id: summaryId, url, summary,
        created_at: new Date().toISOString(),
      });
      await this.env.STORAGE.put(`results/${summaryId}.json`, resultData, {
        httpMetadata: { contentType: 'application/json' },
      });
    });

    // Step 5: 캐시 업데이트
    await step.do('update-cache', async () => {
      const cacheKey = `summary:${btoa(url)}`;
      await this.env.CACHE.put(
        cacheKey,
        JSON.stringify({ id: summaryId, url, summary }),
        { expirationTtl: 86400 }
      );
    });

    // Step 6: 이메일 발송 (email이 있는 경우)
    if (email) {
      await step.do('send-email', async () => {
        // Cloudflare Email Service를 통한 발송
        // 15회에서 다뤘던 Email Workers 활용
        await fetch('https://api.review-bot.example.com/internal/send-email', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({
            to: email,
            subject: `리뷰 요약 완료: ${url}`,
            body: summary,
          }),
        });
      });
    }

    return { summaryId, status: 'completed' };
  }
}

Workflow를 wrangler.toml에 등록하고 API에서 트리거합니다.

# wrangler.toml에 추가
[[workflows]]
name = "review-summary-workflow"
binding = "SUMMARY_WORKFLOW"
class_name = "ReviewSummaryWorkflow"
// Worker의 POST /api/summaries 엔드포인트를 Workflow 트리거로 변경
app.post('/api/summaries', async (c) => {
  const { url, email } = await c.req.json<{ url: string; email?: string }>();

  if (!url || !url.startsWith('http')) {
    return c.json({ error: 'Valid URL is required' }, 400);
  }

  // 캐시 확인
  const cacheKey = `summary:${btoa(url)}`;
  const cached = await c.env.CACHE.get(cacheKey, 'json');
  if (cached) {
    return c.json({ source: 'cache', data: cached });
  }

  // D1에 레코드 생성
  const id = crypto.randomUUID().replace(/-/g, '');
  await c.env.DB.prepare(
    'INSERT INTO summaries (id, url, email) VALUES (?, ?, ?)'
  ).bind(id, url, email ?? null).run();

  // Workflow 트리거 — 비동기로 처리
  const instance = await c.env.SUMMARY_WORKFLOW.create({
    params: { url, email, summaryId: id },
  });

  return c.json({
    data: { id, workflowId: instance.id, status: 'processing' }
  }, 202);
});

홈랩 통합: Synology NAS를 보조 백엔드로 연결하기

Workers AI의 무료 한도를 넘어서거나, 프라이빗한 AI 모델을 사용하고 싶다면 홈랩을 보조 백엔드로 연결할 수 있습니다. 5회에서 배운 Cloudflare Tunnel을 사용하면 공유기 설정 없이 안전하게 연결됩니다.

Synology NAS에서 Tunnel 설정 (DS+925 기준)

# SSH로 NAS 접속 후 cloudflared 설치 (또는 Container Manager 사용)
# Container Manager 방식 (권장)

# 1. Cloudflare 대시보드 → Zero Trust → Networks → Tunnels → Create
# 2. 터널 이름: "review-bot-nas-backend"
# 3. 토큰 복사

# 4. Container Manager에서 cloudflared 컨테이너 생성
# 이미지: cloudflare/cloudflared:latest
# 명령: tunnel --no-autoupdate run --token YOUR_TUNNEL_TOKEN

# 5. Public Hostname 설정 (대시보드)
#    Subdomain: nas-api
#    Domain: example.com
#    Service: http://host.docker.internal:5000

# NAS의 Docker에서 로컬 AI 서버 실행 예시 (Ollama)
docker run -d --name ollama \
  -p 5000:11434 \
  -v /volume1/docker/ollama:/root/.ollama \
  ollama/ollama:latest

Worker에서 NAS 백엔드를 폴백으로 사용하는 패턴입니다.

// NAS 폴백 패턴 — Workers AI 한도 초과 시 홈랩 AI로 전환
async function generateSummary(ai: Ai, text: string): Promise<string> {
  try {
    // 1차: Workers AI (무료 한도 내)
    const result = await ai.run(
      '@cf/meta/llama-3.3-70b-instruct-fp8-fast',
      { prompt: text, max_tokens: 1024 }
    ) as { response: string };
    return result.response;
  } catch (e) {
    // 2차: NAS 홈랩의 Ollama (Tunnel 경유)
    const fallback = await fetch('https://nas-api.example.com/api/generate', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        model: 'llama3.3:latest',
        prompt: text,
        stream: false,
      }),
    });
    const data = await fallback.json() as { response: string };
    return data.response;
  }
}

Zero Trust로 관리자 대시보드 보호하기

서비스에는 관리자 전용 페이지가 필요합니다 — 요약 이력 조회, 사용량 모니터링, 설정 변경 등. 6회에서 배운 Cloudflare Access를 적용하면 별도 로그인 시스템 없이 이메일 OTP만으로 접근을 통제할 수 있습니다.

# Cloudflare 대시보드에서 Access Application 생성

# 1. Zero Trust → Access → Applications → Add an application
# 2. Type: Self-hosted
# 3. Application name: "Review Bot Admin"
# 4. Subdomain: admin.review-bot  /  Domain: example.com
# 5. Policy:
#    - Policy name: "Owner Only"
#    - Action: Allow
#    - Include: Emails — [email protected]
# 6. Session Duration: 24 hours

# Worker에서 Access JWT 검증
# Cloudflare Access는 요청에 CF-Access-JWT-Assertion 헤더를 추가합니다

// 관리자 라우트 — Access 보호 하에 동작
app.get('/admin/stats', async (c) => {
  // Cloudflare Access가 이미 인증을 처리했으므로
  // JWT에서 사용자 이메일만 추출
  const jwtPayload = c.req.header('CF-Access-JWT-Assertion');
  // ... 통계 조회 로직

  const stats = await c.env.DB.prepare(`
    SELECT
      COUNT(*) as total,
      COUNT(CASE WHEN status = 'done' THEN 1 END) as completed,
      COUNT(CASE WHEN status = 'pending' THEN 1 END) as pending,
      DATE(created_at) as date
    FROM summaries
    WHERE created_at >= datetime('now', '-30 days')
    GROUP BY DATE(created_at)
    ORDER BY date DESC
  `).all();

  return c.json({ data: stats.results });
});

MCP Server Portal로 에이전트 외부 도구 연결

14회에서 다뤘던 MCP Server Portals를 활용하면 AI 에이전트가 외부 서비스(GitHub, Notion, Slack 등)에 사용자 대신 안전하게 접근할 수 있습니다. 리뷰 요약봇을 확장해서, 에이전트가 Notion에 요약 결과를 자동으로 기록하는 기능을 추가해봅시다.

# MCP Server 배포 (Workers 기반)
# wrangler.toml에 MCP 설정 추가

cat > mcp-server/wrangler.toml << 'EOF'
name = "review-bot-mcp"
main = "src/index.ts"
compatibility_date = "2026-06-01"

# MCP Server Portal 활성화
[mcp]
portal = true                    # Zero Trust 보호 활성화
oauth_providers = ["notion"]     # Notion OAuth 통합
EOF
// mcp-server/src/index.ts — MCP 도구 정의
import { McpAgent } from 'agents/mcp';
import { z } from 'zod';

export class ReviewBotMCP extends McpAgent {
  server = new McpServer({ name: 'review-bot-tools', version: '1.0.0' });

  async init() {
    // 도구 1: 요약 결과를 Notion에 저장
    this.server.tool(
      'save_to_notion',
      'Save a review summary to Notion database',
      {
        title: z.string().describe('Review title'),
        summary: z.string().describe('Summary text'),
        pros: z.array(z.string()).describe('List of pros'),
        cons: z.array(z.string()).describe('List of cons'),
      },
      async ({ title, summary, pros, cons }) => {
        // Notion API 호출 (OAuth 토큰은 MCP Portal이 자동 관리)
        const notionToken = this.props.accessToken;
        const response = await fetch('https://api.notion.com/v1/pages', {
          method: 'POST',
          headers: {
            'Authorization': `Bearer ${notionToken}`,
            'Notion-Version': '2022-06-28',
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({
            parent: { database_id: 'YOUR_NOTION_DB_ID' },
            properties: {
              'Title': { title: [{ text: { content: title } }] },
              'Summary': { rich_text: [{ text: { content: summary } }] },
              'Status': { select: { name: 'Completed' } },
            },
          }),
        });
        return { content: [{ type: 'text', text: `Saved to Notion: ${title}` }] };
      }
    );
  }
}
Cloudflare AWS Vercel 1인 개발자 비용 비교 인포그래픽

월 비용 명세표 — 정말 0원에 가까운가?

각 레이어별 실제 비용을 정리합니다. 1인 개발자가 MVP를 운영하는 시나리오(DAU 100명, 일 500요청 기준)입니다.

서비스 무료 한도 예상 사용량 (DAU 100) 월 비용
도메인 (.com) — 1개 ~$0.87/월 (연 $10.44÷12)
DNS / CDN / SSL 무제한 — $0
Pages 무제한 대역폭, 500빌드/월 ~20빌드 $0
Workers 10만 요청/일, 10ms CPU ~15,000요청/일 $0
D1 5GB, 500만 읽기/일, 10만 쓰기/일 ~100MB, 5만 읽기/일 $0
KV 10만 읽기/일, 1,000 쓰기/일 ~2만 읽기, 500 쓰기 $0
R2 10GB, 100만 A작업/월, 1,000만 B작업/월 ~500MB, 15,000 작업 $0
Workers AI 1만 뉴런/일 ~5,000 뉴런/일 $0
Tunnel 무제한 1개 $0
Access 50 사용자 1명 (관리자) $0
Workflows v2 Workers Free 포함 ~500실행/일 $0
Email Service 100건/일 (beta) ~50건/일 $0
월 합계 ~$0.87 (≈1,200원)

도메인 비용만 제외하면 문자 그대로 0원입니다. AWS에서 동일한 구성(API Gateway + Lambda + RDS + S3 + CloudFront + SES + Bedrock)을 만들면 최소 월 $40~$80이 소요되는 것과 비교하면 놀라운 차이입니다.

규모가 커지면? — Workers Paid 전환 시점

DAU가 1,000명을 넘고 일 요청이 10만을 초과하면 Workers Paid($5/월)로 전환합니다. 이 시점에서의 비용 구조를 예측해봅시다.

서비스 Paid 한도 예상 사용량 (DAU 1,000) 월 비용
Workers Paid 1,000만 요청/월 포함 ~300만 요청/월 $5
D1 50억 읽기/월, 5,000만 쓰기/월 포함 ~1억 읽기 $0 (포함)
Workers AI 추가 뉴런 $0.011/1,000 ~50만 뉴런/일 ~$6.60
나머지 무료 한도 내 — $0
월 합계 ~$12.47 (≈17,000원)

DAU 1,000명 서비스를 월 17,000원으로 운영할 수 있다면, 이것은 1인 창업자에게 결정적인 경쟁 우위입니다. 인프라 비용에 대한 공포 없이 실험하고, 실패하고, 다시 시작할 수 있습니다.

배포 자동화: Git 푸시 한 번으로 전체 배포

풀스택 프로젝트에서 가장 중요한 것은 배포 파이프라인입니다. GitHub Actions로 프론트엔드와 백엔드를 동시에 배포하는 워크플로를 구성합니다.

# .github/workflows/deploy.yml
name: Deploy Full Stack

on:
  push:
    branches: [main]

jobs:
  deploy-worker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
      - name: Install dependencies
        run: cd worker && npm ci
      - name: Run D1 migrations
        run: cd worker && npx wrangler d1 migrations apply review-bot-db --remote
        env:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
      - name: Deploy Worker
        run: cd worker && npx wrangler deploy
        env:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }}

  deploy-frontend:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
      - name: Install & Build
        run: cd frontend && npm ci && npm run build
      - name: Deploy to Pages
        run: cd frontend && npx wrangler pages deploy dist --project-name=review-summary-bot
        env:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }}

GitHub에 CF_API_TOKEN 시크릿을 한 번만 등록하면, 이후로는 git push origin main 한 번으로 프론트엔드·백엔드·DB 마이그레이션이 모두 자동 실행됩니다.

Mac Studio 로컬 개발 환경 최적화

11회에서 다뤘던 Wrangler의 로컬 개발 기능을 풀스택으로 확장합니다. wrangler dev는 D1·KV·R2를 모두 로컬에서 에뮬레이션하므로, 인터넷 없이도 전체 스택을 개발할 수 있습니다.

# 터미널 1: Worker 로컬 개발 서버
cd worker
wrangler dev --local --persist-to=.wrangler/state

# 터미널 2: 프론트엔드 개발 서버
cd frontend
npm run dev
# → http://localhost:5173 에서 핫 리로딩

# 터미널 3: D1 로컬 데이터 확인
cd worker
wrangler d1 execute review-bot-db --local \
  --command="SELECT * FROM summaries ORDER BY created_at DESC LIMIT 5"

# 로컬 R2 파일 확인
ls -la .wrangler/state/r2/review-bot-storage/

# 로컬 KV 데이터 확인
wrangler kv key list --binding=CACHE --local --preview

프로덕션 체크리스트 — 출시 전 필수 점검

MVP를 실제 사용자에게 공개하기 전, 다음 항목을 하나씩 점검합니다. 이 체크리스트는 시리즈 전체에서 배운 내용의 종합입니다.

보안 (3회 · 6회 · 7회 · 14회)

  • SSL/TLS: Full (Strict) 모드 활성화. 프록시 ↔ 오리진 구간도 암호화.
  • 보안 헤더: HSTS, X-Content-Type-Options, X-Frame-Options 자동 설정 확인.
  • Access 정책: 관리자 페이지에 Zero Trust Access 적용 완료.
  • CORS: Worker에서 허용 오리진을 정확히 지정. 와일드카드(*) 사용 금지.
  • Rate Limiting: Worker 내부 또는 Cloudflare Rules에서 IP당 요청 제한 설정.
  • 시크릿 관리: API 키·토큰은 wrangler secret put으로만 주입. 코드에 하드코딩 금지.
# 시크릿 등록 예시
cd worker
echo "your-notion-api-key" | wrangler secret put NOTION_API_KEY
echo "your-email-api-key" | wrangler secret put EMAIL_API_KEY

# 등록된 시크릿 확인 (값은 표시되지 않음)
wrangler secret list

성능 (2회 · 9회)

  • 캐시 전략: KV 캐시 히트율 모니터링. 핫 데이터는 TTL 24시간, 콜드 데이터는 1시간.
  • Worker CPU 사용량: 무료 플랜은 요청당 10ms 제한. AI 호출 시간은 CPU 타임에 포함되지 않음(I/O 대기).
  • 번들 사이즈: Worker 번들은 압축 후 3MB 이내. wrangler deploy --dry-run으로 확인.
  • Pages 빌드 최적화: Vite 빌드 시 코드 스플리팅·트리 셰이킹 확인.

관측성 (모든 회차 공통)

  • Workers Analytics: 대시보드에서 요청량·에러율·지연시간 확인.
  • D1 Insights: 느린 쿼리 탐지. 인덱스 추가 필요 여부 판단.
  • Tail Logs: wrangler tail로 실시간 로그 스트리밍.
# 실시간 로그 확인
wrangler tail --format=pretty

# 에러만 필터링
wrangler tail --format=pretty --status=error

# 특정 경로만 필터링
wrangler tail --format=pretty --search="/api/summaries"

가용성

  • 커스텀 도메인: DNS 레코드가 프록시(오렌지 구름) 활성화 상태인지 확인.
  • 에러 페이지: Workers에서 5xx 발생 시 사용자 친화적 에러 페이지 반환.
  • Tunnel 모니터링: NAS 백엔드 Tunnel의 연결 상태를 Zero Trust 대시보드에서 확인.

확장 시나리오: 이 아키텍처로 만들 수 있는 것들

리뷰 요약봇은 하나의 예시일 뿐입니다. 동일한 풀스택 아키텍처로 다양한 서비스를 만들 수 있습니다.

SaaS 대시보드

Pages(프론트) + Workers(API) + D1(사용자 데이터) + Access(인증). 월 0원으로 B2B SaaS MVP를 검증할 수 있습니다. Stripe Webhook을 Workers에서 수신해 결제 로직까지 처리 가능합니다.

AI 챗봇 서비스

Workers AI(LLM) + Durable Objects(대화 상태) + Vectorize(RAG) + R2(문서 저장). 10회에서 배운 Durable Objects가 사용자별 대화 세션을 영속적으로 관리하고, Vectorize가 업로드된 문서에서 관련 맥락을 검색합니다.

이미지/비디오 플랫폼

R2(원본 저장) + Images(변환·최적화) + Stream(비디오) + Workers(업로드 API). R2의 0원 송신료가 미디어 서비스에서 특히 빛을 발합니다. 8회에서 다뤘던 R2의 멀티파트 업로드도 대용량 파일에 유용합니다.

멀티채널 에이전트

Email Service(이메일 수신) + Workflows v2(오케스트레이션) + MCP Portals(외부 도구) + Workers AI(추론). 15회에서 구축했던 패턴을 확장해, 이메일·Slack·웹훅 등 다양한 채널에서 들어오는 요청을 통합 처리하는 에이전트를 만들 수 있습니다.

글로벌 API 게이트웨이

Workers(라우팅) + Tunnel(백엔드 연결) + KV(설정 캐시) + Analytics Engine(로깅). 여러 백엔드 서비스 앞에 글로벌 엣지 게이트웨이를 두고, 인증·레이트 리밋·캐싱·로깅을 일괄 처리합니다.

피해야 할 함정 — 실전에서 배운 교훈

16회 동안의 여정에서 만난 실제 함정들을 정리합니다. 이 부분이야말로 공식 문서에서는 찾기 어려운, 실전 경험에서만 나오는 지식입니다.

함정 1: Workers의 글로벌 상태 오해

Workers는 요청마다 독립적으로 실행됩니다. 글로벌 변수에 상태를 저장하면 다음 요청에서 사라질 수 있습니다. 상태가 필요하면 반드시 KV·D1·Durable Objects를 사용하세요. 9회에서 강조했던 이 원칙을 잊으면 간헐적 버그에 시달립니다.

함정 2: D1의 쓰기 지연

D1은 읽기가 엣지에 캐싱되어 빠르지만, 쓰기는 프라이머리 리전으로 라우팅됩니다. 쓰기 직후 읽기를 하면 이전 데이터가 반환될 수 있습니다. 쓰기 후 바로 결과를 반환해야 한다면 쓰기 응답의 반환값을 직접 사용하세요.

// 안 좋은 패턴
await db.prepare('INSERT INTO items (name) VALUES (?)').bind('test').run();
const item = await db.prepare('SELECT * FROM items WHERE name = ?').bind('test').first();
// → item이 null일 수 있음!

// 좋은 패턴
const result = await db.prepare(
  'INSERT INTO items (name) VALUES (?) RETURNING *'
).bind('test').first();
// → result에 삽입된 행이 바로 포함됨

함정 3: R2의 목록 API 성능

R2의 list()는 1,000개 이상의 객체가 있을 때 페이지네이션이 필요합니다. 파일 수가 많은 버킷에서 전체 목록을 가져오려고 루프를 돌리면 성능이 급격히 떨어집니다. 대신 D1에 파일 메타데이터를 별도로 저장하고 그쪽으로 쿼리하는 패턴이 효율적입니다.

함정 4: Tunnel의 재연결 지연

NAS가 재부팅되거나 네트워크가 순단되면 cloudflared가 재연결하는 데 10~30초가 걸릴 수 있습니다. 이 시간 동안 Tunnel 경유 요청은 502를 반환합니다. Worker에서 Tunnel 백엔드를 호출할 때는 반드시 타임아웃과 폴백을 구현하세요.

함정 5: Workers AI 모델별 뉴런 소비 차이

같은 프롬프트라도 모델에 따라 뉴런 소비량이 10배 이상 차이납니다. @cf/meta/llama-3.3-70b-instruct-fp8-fast는 한 번 호출에 ~100 뉴런을 소비하지만, 소형 모델인 @cf/meta/llama-3.1-8b-instruct는 ~10 뉴런으로 충분합니다. 용도에 맞는 모델 선택이 무료 한도 내 운영의 핵심입니다.

함정 6: Pages Functions vs Workers 혼동

Pages Functions(/functions 디렉토리)도 내부적으로 Workers입니다. 하지만 별도 Worker를 만들어 API를 분리하는 편이 독립 배포·독립 스케일링·바인딩 관리 측면에서 유리합니다. 풀스택에서는 프론트(Pages) + 백엔드(별도 Worker)를 분리하는 것을 권장합니다.

Cloudflare vs AWS vs Vercel — 1인 개발자가 선택해야 할 플랫폼 최종 비교

시리즈를 마무리하며, 1인 개발자가 가장 많이 고민하는 세 플랫폼을 정면 비교합니다.

항목 Cloudflare AWS Vercel
시작 비용 $0 (도메인 제외) $0 (프리 티어 12개월) $0 (Hobby)
1년 후 비용 (소규모) $0~$5/월 $30~$80/월 $20/월 (Pro)
서버리스 함수 Workers (10만/일 무료) Lambda (100만/월 무료) Edge Functions (포함)
데이터베이스 D1 (5GB 무료) RDS ($15~/월) 또는 DynamoDB Postgres ($0~, Neon 연동)
오브젝트 스토리지 R2 (10GB, 송신 $0) S3 (5GB, 송신 $0.09/GB) Blob (제한적)
AI/LLM Workers AI (내장, 무료 한도) Bedrock (종량제) AI SDK (외부 API 래퍼)
CDN 내장 (무료, 330+ 도시) CloudFront (종량제) 내장 (Edge Network)
사설망/VPN Tunnel + WARP (무료) VPC + Site-to-Site VPN ($) 없음
에이전트 인프라 Agents SDK + MCP + Workflows Step Functions + Bedrock Agents 없음 (외부 의존)
학습 곡선 중간 (V8 isolate 모델) 높음 (IAM·VPC·서비스 300+) 낮음 (Next.js 중심)
벤더 종속 중간 (Workers API 고유) 높음 (서비스별 SDK) 높음 (프레임워크 결합)

결론: 1인 개발자에게 Cloudflare는 “비용 제로에서 시작해서 성장에 맞춰 확장”하는 유일한 옵션입니다. AWS는 엔터프라이즈급 복잡성이 필요할 때, Vercel은 Next.js 프로젝트에 올인할 때 각각의 강점이 있습니다. 하지만 도메인·DNS·CDN·SSL·서버리스·DB·스토리지·AI·보안·에이전트를 단일 플랫폼에서 무료로 묶을 수 있는 곳은 2026년 현재 Cloudflare뿐입니다.

2026 하반기 로드맵 — 앞으로 주목할 것

Cloudflare는 2026년 상반기 Agents Week에서 폭발적인 기능을 쏟아냈습니다. 하반기에는 다음 영역이 더 성숙해질 것으로 예상됩니다.

  • Anthropic Managed Agents 통합 심화: 2026년 5월 발표된 Anthropic과의 파트너십이 GA로 전환되면, Workers에서 Claude 에이전트를 네이티브로 오케스트레이션할 수 있게 됩니다.
  • Cloudflare Mesh + Workers VPC: 에이전트끼리 사설망으로 통신하는 진정한 AI 마이크로서비스 아키텍처가 가능해집니다.
  • Vectorize GA: 벡터 데이터베이스가 정식 출시되면 RAG 파이프라인이 Cloudflare 안에서 완결됩니다.
  • PlanetScale 통합: D1의 한계를 넘어서는 MySQL 호환 분산 DB가 필요한 경우의 자연스러운 확장 경로입니다.
  • Agent Readiness Score: 에이전트의 보안·성능·안정성을 자동으로 평가하는 대시보드가 성숙해지면, 프로덕션 에이전트 운영의 표준이 될 수 있습니다.

시리즈 총정리 — 16회의 여정을 돌아보며

1회에서 “왜 2026년에 다시 Cloudflare인가”라고 물었습니다. 16회를 마치는 지금, 답은 분명합니다. Cloudflare는 더 이상 CDN 회사가 아닙니다. 개발자가 아이디어에서 프로덕션까지 가는 가장 짧은 경로를 제공하는 풀스택 플랫폼입니다.

Phase 1 (1~4회): 기초를 다지다

DNS·CDN·SSL·Pages — 웹의 기본을 Cloudflare가 얼마나 우아하게 해결하는지 확인했습니다. 도메인 하나와 무료 계정만으로 HTTPS 정적 사이트를 전 세계에 배포할 수 있었습니다.

Phase 2 (5~8회): 홈랩을 세상에 연결하다

Tunnel·Zero Trust·WARP·R2 — 집에 있는 NAS와 서버를 안전하게 공개하고, 파일을 0원 송신료로 서빙하는 방법을 배웠습니다. 포트포워딩 없이, VPN 장비 없이, 복잡한 방화벽 설정 없이.

Phase 3 (9~12회): 개발자 플랫폼을 손에 넣다

Workers·KV·D1·Durable Objects·Workers AI — 서버 없이 글로벌 엣지에서 풀스택을 구축하는 경험을 했습니다. 로컬 개발부터 프로덕션 배포까지 Wrangler 하나로 통제했습니다.

Phase 4 (13~16회): AI 에이전트 시대를 준비하다

Dynamic Workers·Sandboxes·MCP Portals·Workflows v2·Email Service — AI 에이전트가 독립적으로 코드를 실행하고, 외부 도구에 접근하고, 이메일을 보내고, 장기 실행 워크플로를 수행하는 인프라를 구축했습니다. 그리고 이번 16회에서 그 모든 것을 하나의 풀스택으로 조립했습니다.

이 시리즈가 여러분의 Cloudflare 여정에 실질적인 도움이 되었기를 바랍니다. 기술은 계속 진화하지만, 핵심 원칙은 변하지 않습니다: 가능한 한 단순하게 시작하고, 필요할 때만 복잡성을 추가하고, 비용은 가능한 한 늦게 발생시킨다. Cloudflare는 이 원칙을 가장 충실하게 지원하는 플랫폼입니다.

16회에 걸친 긴 여정을 함께해주셔서 감사합니다. 이제 여러분의 아이디어를 세상에 내놓을 차례입니다. 도메인 하나, 무료 계정 하나면 충분합니다. 시작하세요.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 16화)
◀ 이전 15화  (다음 차수는 아직 게시되지 않았습니다)

참고 자료

  • Cloudflare Workers 공식 문서 — Workers 런타임·API·배포·요금 등 전체 개발자 레퍼런스
  • Wikipedia: Cloudflare — Cloudflare의 연혁, 주요 서비스, 네트워크 인프라 개요

Tags:

1인 개발자 서버리스 창업Cloudflare 무료 플랜Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지-16화Cloudflare 풀스택Workers AI서버리스 아키텍처연재:Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지
작성자

AICosmus

Follow Me
다른 기사
1인 개발자의 미니멀 AI 하니스 전략 일러스트
Previous

[AI Harness: 모델보다 래퍼 — 2026 에이전트 OS 완전 정복] 12/12화: 1인 개발자의 AI 하니스 생존 전략 — 88% 함정 탈출법

직장인 30분 오답노트 복습 루틴 책상
Next

[생활스포츠지도사 2급 필기 합격 프로젝트] 27/30화: 생활스포츠지도사 2급 모의고사 오답노트 30분 복습 루틴

댓글 없음! 첫 댓글을 남겨보세요.

답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

최신 글

  • [opencode 시즌 2 심화 — 나만의 도메인 특화 에이전트 만들기] 1/12화: opencode 에이전트 아키텍처 완전 해부 — 2026 Primary·Subagent 5계층 구조
  • Kotlin 코루틴 핵심 5가지 개념과 실전 활용법
  • [opencode 12일 집중 — 터미널 네이티브 AI 코딩 에이전트 완전 정복] 12/12화: opencode 로컬 모델 완전 가이드 2026 — Ollama·에어갭·규제 환경 도입 체크리스트
  • LLM 파인튜닝 실전 5단계 — 2026 LoRA 완벽 가이드
  • 금융 앱 생체인증 작동 원리, 지문·얼굴 보안 5단계 완전 해부

최신 댓글

  1. [온프레미스 AI Assistant 아키텍처 — Qwen3·Qwen3-VL 14일 설계] 9/14화: 온프레미스 RAG 파이프라인 — bge-m3·Qdrant 자체 호스팅 실전의 Dockerfile 최적화 실전 가이드 — 빌드·크기·보안 총정리 - AICosmus
  2. RAG 평가 프레임워크, 답변 품질을 수치로 측정하는 법의 RAG 리랭킹 가이드, 검색 결과 정확도 높이는 법 - AICosmus
  3. RAG 평가 프레임워크, 답변 품질을 수치로 측정하는 법의 RAG 리랭킹 가이드, 검색 결과 정확도 높이는 법 - AICosmus
  4. gRPC Interceptor 완벽 가이드: 인증부터 로깅까지의 gRPC 데드라인과 재시도 정책으로 장애 전파 차단하기 - AICosmus
  5. gRPC Interceptor 완벽 가이드: 인증부터 로깅까지의 gRPC 데드라인과 재시도 정책으로 장애 전파 차단하기 - AICosmus
  • About
  • Contact
  • Disclaimer
  • Privacy - Policy
  • Terms of Service
Copyright 2026 — AICosmus. All rights reserved. Blogsy WordPress Theme