Cloudflare Workers로 서버리스 API 만들기
AWS Lambda 대신 Cloudflare Workers를 선택한 이유와 실전 API 구축 과정.
왜 Cloudflare Workers인가
서버리스 API를 만들 때 AWS Lambda가 표준처럼 여겨지지만, Marginy에서는 Cloudflare Workers를 선택했다.
| 항목 | AWS Lambda | Cloudflare 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보다 개발 경험이 좋다. 콜드 스타트 없음, 한 줄 배포, 넉넉한 무료 티어. 복잡한 인프라가 필요 없는 프로젝트에서 첫 번째 선택지로 고려할 만하다.