본문으로 건너뛰기
← 블로그로 돌아가기
개발 2026년 3월 1일

Cloudflare Workers로 서버리스 API 만들기

AWS Lambda 대신 Cloudflare Workers를 선택한 이유와 실전 API 구축 과정.

Cloudflare Workers 서버리스 API TypeScript

왜 Cloudflare Workers인가

서버리스 API를 만들 때 AWS Lambda가 표준처럼 여겨지지만, Marginy에서는 Cloudflare Workers를 선택했다.

항목AWS LambdaCloudflare Workers
콜드 스타트100ms~수초0ms (V8 isolate)
무료 티어100만 요청/월10만 요청/일
배포SAM/CDK 필요wrangler deploy 한 줄
엣지리전 선택 필요전 세계 자동

결정적 차이는 콜드 스타트가 없다는 점이다. Workers는 V8 isolate 기반이라 컨테이너를 띄울 필요가 없다. API 응답이 항상 빠르다.

프로젝트 세팅

npm create cloudflare@latest my-api -- --template worker-typescript
cd my-api

wrangler.toml에 기본 설정이 들어간다.

name = "marginy-api"
main = "src/index.ts"
compatibility_date = "2026-02-01"

[vars]
ENVIRONMENT = "production"

라우팅

Workers에는 Express 같은 라우터가 내장되어 있지 않다. itty-router를 쓰거나 직접 분기한다. Marginy에서는 간단한 패턴 매칭으로 충분했다.

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);

    if (url.pathname === '/api/calculate' && request.method === 'POST') {
      return handleCalculate(request, env);
    }

    if (url.pathname === '/api/platforms' && request.method === 'GET') {
      return handlePlatforms(env);
    }

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

KV 스토리지

Workers에는 KV(Key-Value) 스토리지가 내장되어 있다. 플랫폼별 수수료율처럼 자주 바뀌지 않는 데이터를 캐시하기에 적합하다.

// wrangler.toml
// [[kv_namespaces]]
// binding = "FEES"
// id = "xxx"

async function handlePlatforms(env: Env): Promise<Response> {
  const cached = await env.FEES.get('platform-fees', 'json');
  if (cached) {
    return Response.json(cached);
  }

  const fees = await fetchLatestFees();
  await env.FEES.put('platform-fees', JSON.stringify(fees), {
    expirationTtl: 86400, // 24시간
  });

  return Response.json(fees);
}

KV는 읽기가 매우 빠르고(엣지 캐시), 쓰기는 전파에 최대 60초 걸린다. 읽기 위주 데이터에 적합하다.

CORS 처리

Chrome Extension에서 Workers API를 호출하려면 CORS 헤더가 필요하다.

function corsHeaders(): HeadersInit {
  return {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
    'Access-Control-Allow-Headers': 'Content-Type',
  };
}

// OPTIONS preflight 처리
if (request.method === 'OPTIONS') {
  return new Response(null, { headers: corsHeaders() });
}

프로덕션에서는 Access-Control-Allow-Origin* 대신 확장 프로그램의 origin으로 제한해야 한다.

배포

npx wrangler deploy

이게 끝이다. CI/CD 파이프라인 없이도 30초 안에 전 세계 300개 이상의 엣지 노드에 배포된다.

정리

소규모 API에서 Cloudflare Workers는 Lambda보다 개발 경험이 좋다. 콜드 스타트 없음, 한 줄 배포, 넉넉한 무료 티어. 복잡한 인프라가 필요 없는 프로젝트에서 첫 번째 선택지로 고려할 만하다.