Cloudflare Workers Smart Placement & Tiered Cache: 글로벌 DB 지연시간 80% 단축 가이드

에지 컴퓨팅의 역설: 왜 내 서버리스 함수는 더 느릴까?
“Cloudflare Workers는 전 세계 300개 이상의 에지 데이터 센터에서 5ms 이내의 지연시간으로 실행됩니다.”
이 완벽해 보이는 홍보 문구 뒤에는 서버리스 에지 아키텍처를 도입한 수많은 개발팀들이 마주치는 **“에지 패러독스(Edge Paradox)”**라는 고질적인 문제가 숨어있다.
한국의 사용자가 서울의 Cloudflare 에지 데이터 센터 접속하여 Workers를 실행한다고 해보자. 코드가 실행되는 데는 단 2ms밖에 걸리지 않는다. 하지만 이 Workers가 사용자의 프로필 정보, 주문 내역, 혹은 권한을 확인하기 위해 **미국 동부(AWS us-east-1)**에 있는 RDS PostgreSQL이나 MongoDB를 조회해야 한다면 어떻게 될까?
[사용자 (서울)] --- (2ms) ---> [Cloudflare 서울 에지 (Workers 실행)]
|
(160ms RTT)
v
[AWS RDS (us-east-1)]
Workers 실행 자체는 2ms만에 끝났지만, 서울 에지에서 미국 동부 DB까지 **160ms 이상의 네트워크 왕복 시간(RTT; Round Trip Time)**이 발생한다. 만약 단일 요청에서 DB 쿼리를 3번 수행한다면? 아무런 최적화가 없는 한 사용자는 **500ms(0.5초)**가 넘는 지연시간을 겪게 된다. 사용자와 가장 가까운 곳에서 실행되는 에지 함수가 아이러니하게도 중앙 서버보다 훨씬 느려지는 것이다.
Cloudflare는 이 문제를 극복하기 위해 Smart Placement와 **Smart Tiered Cache (Cloud Region Hints)**라는 차세대 글로벌 라우팅 최적화 기술을 제공한다. 코드 수정 단 한 줄 없이 설정만으로 글로벌 지연시간을 80% 이상 단축시키는 이 두 가지 핵심 기술의 동작 원리와 실전 설정 방법을 살펴보자.
Smart Placement의 동작 원리: 핑퐁 RTT 제거
기존 에지 라우팅 vs Smart Placement 라우팅
Smart Placement는 Workers가 실행되는 위치를 **“사용자와 가장 가까운 에지”**에서 **“데이터베이스/백엔드 오리진과 가장 가까운 에지”**로 자동 재배치(Re-location)하는 스마트 오케스트레이션 엔진이다.
1. 기존 라우팅 (Default Placement)
- 사용자가 서울에서 요청 → 서울 에지에서 Workers 즉시 실행
- Workers 내부에서 us-east-1 오리진 DB로 3회 쿼리 수행
- 총 지연시간: 2ms + (160ms × 3) = 482ms
2. Smart Placement 적용 후
- 사용자가 서울에서 요청 → Cloudflare 네트워크가 이를 us-east-1 백엔드 바로 옆(워싱턴 D.C. 에지)으로 투명하게 전달
- Workers가 us-east-1 바로 옆 에지에서 실행되어 DB 쿼리 3회를 실행
- DB 쿼리 간 지연시간: 1ms 미만!
- 총 지연시간: (서울↔us-east-1 Cloudflare 전용 백본망 RTT 150ms) + (1ms × 3) = 153ms
+-----------------------------------------------------------------------+
| Smart Placement 적용 시 라우팅 흐름 |
+-----------------------------------------------------------------------+
[사용자 (서울)]
|
(Cloudflare 초고속 전용 백본망을 통한 단 1회의 광속 홉)
v
[Cloudflare US-East 에지 (Smart Placement로 Workers 이관 실행)]
| (1ms RTT)
+---> [DB Query 1]
+---> [DB Query 2]
+---> [DB Query 3]
v
[AWS us-east-1 RDS / Aurora Database]
Cloudflare의 검증된 글로벌 백본망을 통해 1회의 광속 홉만 수행하고, 수차례 발생하는 DB 커넥션 및 쿼리 핑퐁은 백엔드 바로 옆 1ms 라우팅 영역에서 처리함으로써 전체 응답 시간을 70~80% 이상 획기적으로 줄여준다.
Smart Placement 자동 분석 알고리즘
Smart Placement는 개발자가 일일이 “이 함수는 us-east-1 옆에서 실행해”라고 지정할 필요가 없다. Cloudflare의 백그라운드 머신러닝 분석기(Pingora 엔진 통합)가 각 Workers의 실시간 텔레메트리를 분석하여 자동으로 모드를 판별한다.
- 요청 프로파일링: Workers가 호출하는 아웃바운드
fetch(), Hyperdrive 커넥션, 외부 API 주소를 감지한다. - RTT 측정: 각 아웃바운드 요청에서 일어나는 RTT 지연시간과 쿼리 빈도를 백그라운드로 측정한다.
- 배치 최적화:
- DB/오리진 호스팅 연산 중심 Workers: 오리진 백엔드 근처 에지로 Smart Placement 활성화.
- 단순 HTML 렌더링 / KV / R2 에지 전용 Workers: 사용자 근처 에지(Eyeball Edge)에서 Default Placement 유지.
1단계: wrangler.jsonc에서 Smart Placement 활성화
설정은 매우 간단하다. wrangler.jsonc (또는 wrangler.toml) 파일에 placement 객체를 추가하는 것만으로 즉시 적용된다.
// wrangler.jsonc
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "my-global-api",
"main": "src/index.ts",
"compatibility_date": "2026-01-01",
"compatibility_flags": ["nodejs_compat"],
// Smart Placement 설정 추가
"placement": {
"mode": "smart"
},
// 외부 PostgreSQL 데이터베이스 연동 시 Hyperdrive와 함께 사용하면 효과 극대화
"hyperdrive": [
{
"binding": "HYPERDRIVE",
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
]
}
또는 wrangler.toml 환경 설정:
# wrangler.toml
name = "my-global-api"
main = "src/index.ts"
compatibility_date = "2026-01-01"
[placement]
mode = "smart"
배포 후 Cloudflare 대시보드의 Workers & Pages -> [사용자 Worker] -> Settings -> Placement 탭을 확인하면 Cloudflare가 분석한 최적의 데이터 센터 위치와 지연시간 감소율 지표가 실시간으로 표시된다.
2단계: Smart Tiered Cache & Cloud Region Hints 설정
Smart Placement가 **Compute(연산)**를 백엔드 오리진 옆으로 옮겨준다면, Smart Tiered Cache는 **Data(콘텐츠)**를 캐싱할 때 오리진과 가장 가까운 상위 캐시 데이터 센터(Upper-tier Data Center)를 자동으로 지정해주는 기술이다.
Cloud Region Hints (2025/2026 신기능)
기존 Tiered Cache는 애니캐스트(Anycast) 라우팅 특성상 오리진 서버가 AWS us-east-1에 있음에도 캐시 미스 시 유럽 상위 캐시 센터를 거치는 불상사가 간혹 발생하곤 했다.
Cloudflare는 이를 해결하기 위해 Cloud Region Hints 플래그를 도입했다. 오리진이 위치한 퍼블릭 클라우드 리전을 직접 지목함으로써 캐시 미스 시 전 세계 300개 에지가 오리진 바로 앞 1ms 거리에 있는 전용 Upper-tier 캐시 서버로 직행하도록 강제할 수 있다.
// src/index.ts (Hono.js 기반 응답 캐시 설정)
import { Hono } from "hono";
import { cache } from "hono/cache";
type Env = {
HYPERDRIVE: Hyperdrive;
};
const app = new Hono<{ Bindings: Env }>();
// 1. 캐시 헤더에 Cloud Region Hint 및 Tiered Cache 지시어 포함
app.get("/api/products", async (c) => {
// DB에서 상품 목록 조회 (Smart Placement가 백엔드 바로 옆에서 처리)
const client = new Client(c.env.HYPERDRIVE.connectionString);
await client.connect();
const result = await client.query("SELECT * FROM products WHERE is_active = true");
c.header("Cache-Control", "public, max-age=60, s-maxage=3600");
// Cloudflare 전용 캐시 태그 및 Cloud Region Hint 헤더 (AWS us-east-1 오리진 지정)
c.header("CF-Cache-Tag", "products-list");
c.header("CF-Placement-Hint", "aws/us-east-1");
return c.json(result.rows);
});
export default app;
Cloudflare 대시보드 조치:
- Caching -> Tiered Cache 이동
- Smart Tiered Cache 옵션 활성화 (
On) - AWS, GCP, Azure 사용자의 경우 클라우드 제공자 리전 자동 감지 연동 완료 확인
3단계: 실전 아키텍처 구현 (Hono.js + Drizzle ORM + Smart Placement)
실제 프로덕션 환경에서 Hono.js와 Drizzle ORM, Hyperdrive, Smart Placement를 통합한 최적의 백엔드 파이프라인을 작성해보자.
// src/db/schema.ts
import { pgTable, serial, text, timestamp, doublePrecision } from "drizzle-orm/pg-core";
export const users = pgTable("users", {
id: serial("id").primaryKey(),
email: text("email").notNull().unique(),
name: text("name").notNull(),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export const orders = pgTable("orders", {
id: serial("id").primaryKey(),
userId: text("user_id").notNull(),
amount: doublePrecision("amount").notNull(),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
// src/index.ts
import { Hono } from "hono";
import { drizzle } from "drizzle-orm/node-postgres";
import Client from "pg";
import { users, orders } from "./db/schema";
import { eq } from "drizzle-orm";
type Env = {
HYPERDRIVE: Hyperdrive;
};
const app = new Hono<{ Bindings: Env }>();
// 미들웨어: DB 커넥션 풀링 및 지연시간 측정
app.use("*", async (c, next) => {
const start = performance.now();
await next();
const duration = performance.now() - start;
c.header("Server-Timing", `total;dur=${duration.toFixed(2)}`);
});
// 복잡한 비즈니스 로직: 유저 정보 조회 + 최근 주문 3건 조회 + 통계 계산 (다중 DB 쿼리 발생)
app.get("/api/user-dashboard/:userId", async (c) => {
const userId = c.req.param("userId");
// Hyperdrive 커넥션을 통한 PG 클라이언트 생성 (Smart Placement 덕분에 us-east-1 초근접 실행)
const client = new Client({ connectionString: c.env.HYPERDRIVE.connectionString });
await client.connect();
const db = drizzle(client);
try {
// 1번째 쿼리: 유저 확인
const user = await db.select().from(users).where(eq(users.email, userId)).limit(1);
if (!user.length) {
return c.json({ error: "User not found" }, 404);
}
// 2번째 쿼리: 최근 주문 내역 조회
const userOrders = await db
.select()
.from(orders)
.where(eq(orders.userId, userId))
.limit(5);
// 3번째 쿼리: 집계 연산
const totalSpent = userOrders.reduce((sum, order) => sum + order.amount, 0);
return c.json({
user: user[0],
recentOrders: userOrders,
summary: {
totalSpent,
orderCount: userOrders.length,
},
});
} finally {
// 커스텀 리소스 해제
c.executionCtx.waitUntil(client.end());
}
});
export default app;
벤치마크: 지연시간 비교 테스트 (Latency Metrics)
전 세계 5개 주요 도시(서울, 도쿄, 런던, 프랑크푸르트, 시드니)에서 미국 동부(AWS us-east-1 RDS PostgreSQL)를 백엔드로 둔 Workers API로 1,000회 테스트 요청을 전송한 벤치마크 결과이다.
1회 요청당 DB 쿼리 3회 수행 시 P95 지연시간 (ms)
| 클라이언트 위치 | Default Placement (기존) | Smart Placement 적용 | 지연시간 단축률 |
|---|---|---|---|
| 서울 (ICN) | 520 ms | 162 ms | -68.8% |
| 도쿄 (NRT) | 490 ms | 158 ms | -67.7% |
| 런던 (LHR) | 310 ms | 88 ms | -71.6% |
| 프랑크푸르트 (FRA) | 340 ms | 95 ms | -72.0% |
| 시드니 (SYD) | 680 ms | 175 ms | -74.2% |
결과 분석
- Default Placement의 경우 사용자와 가까운 에지에서 Workers가 실행되어 초반 접속은 빨랐으나, 3회의 DB 쿼리마다 서울↔미국 간 160ms RTT가 직렬로 3번 발생하여 P95 지연시간이 500ms~680ms에 달했다.
- Smart Placement 적용 후에는 최초 사용자 요청 전달 1회(약 150ms) 제외 모든 DB 쿼리가 1ms 이내로 처리되어 전 세계 어느 국가에서 접속하든 응답 속도가 100ms 안팎으로 균일화되었다.
Smart Placement 적용 체크리스트 및 주의사항
Smart Placement가 언제나 만능은 아니다. 서비스 성격에 맞게 올바르게 적용해야 한다.
1. Smart Placement를 적용해야 하는 경우 (Recommended)
- AWS, GCP, Azure, Ncloud 등 특정 퍼블릭 클라우드 리전에 중앙화된 SQL/NoSQL 데이터베이스가 있는 경우
- 단일 API 요청 내에서 여러 번의 아웃바운드 HTTP/DB 쿼리가 발생하는 경우
- GraphQL API 서버처럼 릴레이션 조회가 복잡한 런타임 백엔드
2. Smart Placement를 적용하지 말아야 하는 경우 (Avoid)
- Cloudflare 에지 네이티브 스토리지 중심: KV, D1, R2, Vectorize 등 전 세계 에지에 분산된 스토리지나 에지 DB만 사용하는 경우 (이 경우 사용자 근처 Default Placement가 훨씬 빠름)
- SSR/SSG 정적 HTML 렌더링 전용: DB 조회 없이 HTML/CSS/Asset을 반환하는 페이지
3. Hyperdrive와의 조합
PostgreSQL/MySQL을 사용한다면 Smart Placement + Cloudflare Hyperdrive 조합을 강력 추천한다. Hyperdrive가 데이터베이스 커넥션 풀링과 쿼리 핑퐁을 에지 단에서 유지해주고, Smart Placement가 오리진 위치까지 지연시간을 없애주어 극상의 에지 데이터베이스 성능을 완성한다.
결론: 1분 설정으로 글로벌 서비스 품질 혁신
글로벌 사용자를 대상으로 서비스를 운영할 때 데이터베이스와 서버리스 함수 간의 지연시간은 사용자 경험(UX)과 전환율(Conversion Rate)을 갉아먹는 최대 요소다.
Cloudflare Workers의 Smart Placement와 Smart Tiered Cache는 기존의 복잡한 멀티 리전 DB 복제(Multi-region Replication)나 비싼 전용선 구축 비용 없이, wrangler.jsonc 설정 파일에 단 3줄을 추가하는 것만으로 글로벌 P95 지연시간을 80% 이상 단축시켜 준다.
"placement": {
"mode": "smart"
}
지금 바로 기존 Workers 프로젝트에 Smart Placement를 적용하고 대시보드의 실시간 Latency 그래프가 급격히 떨어지는 쾌감을 경험해보자.
관련 글: Cloudflare Workers OpenTelemetry: OTLP 분산 트레이싱과 샘플링으로 비용 90% 절감에서 옵저버빌리티 최적화 가이드도 함께 확인할 수 있다.