Cloudflare๋ก Next.js ๋ฐฐํฌํ๊ธฐ
- #Cloudflare
- #Next.js
- #Vercel
๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์. ๋ ธ๋จธ์ค ํ๋ก ํธ์๋ ์์ง๋์ด ์ฌ๋ด์์ ๋๋ค.
๋ ธ๋จธ์ค์ ๋ํ ์๋น์ค์ธ ํ๋กฌ(fromm) ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ, ๊ธฐ์กด Vercel ์ค์ฌ์ ๋ฐฐํฌ ๊ตฌ์กฐ์์ ๋ฒ์ด๋ ๋ณด๋ค ์ ์ฐํ๊ณ ๋น์ฉ ํจ์จ์ ์ธ ์ธํ๋ผ ๊ตฌ์ฑ์ ๊ฒํ ํ๊ฒ ๋์์ต๋๋ค. ๊ทธ ๊ณผ์ ์์ Cloudflare ์ธํ๋ผ๋ฅผ ํ์ฉํ Next.js ๋ฐฐํฌ ๋ฐฉ์์ PoC ํํ๋ก ๊ฒ์ฆํ๊ฒ ๋์๊ณ , ์ด ๊ธ์ ํด๋น ๊ณผ์ ์์ ์ ๋ฆฌํ ๋ด์ฉ์ ๊ณต์ ํ๊ธฐ ์ํด ์์ฑ๋์์ต๋๋ค.
์ด ๊ธ์์๋ Cloudflare Workers ๊ธฐ๋ฐ์ผ๋ก ์ต์ํ์ ์คํ์ ๊ฐ์ถ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ฉด์ ์ ๋ฆฌํ ๊ธฐ์ด ๊ฐ๋ , ์ํคํ ์ฒ, ์ค์ ๋ฐฉ๋ฒ ๋ฐ ์ฃผ์์ฌํญ์ ๋ค๋ฃน๋๋ค. Cloudflare๋ฅผ ์ฒ์ ์ ํ์๊ฑฐ๋, Vercel ์ธ์ ๋์์ ๊ฒํ ์ค์ด์ ๋ถ๋ค๊ป ์ฐธ๊ณ ์๋ฃ๊ฐ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
1. ์ Cloudflare์ธ๊ฐ
์ฌ๋ด ํ๋ก์ ํธ๋ฅผ Cloudflare ๊ธฐ๋ฐ์ผ๋ก ์ด์ ํ๊ธฐ์ ์์, ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ ์ค์ฌ์ผ๋ก ๊ฒํ ๋ฅผ ์งํํ์์ต๋๋ค.
Edge First ์ํคํ ์ฒ
- ์ ์ธ๊ณ PoP(Point of Presence)์์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ ์ ๋ฆฌ์์ค๋ฟ ์๋๋ผ SSR ๋ก์ง ๋ํ Edge์์ ์คํํ ์ ์์ต๋๋ค.
๋ฏธ๋ค์จ์ด ํธํ์ฑ
wrangler.toml๊ธฐ๋ฐ ์ค์ ์ ํตํด Cloudflare Workers ํ๊ฒฝ์์ ๋ฏธ๋ค์จ์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
Workers ๊ธฐ๋ฐ ์คํ ํ๊ฒฝ
- ๋ณ๋์ Node.js ์๋ฒ ์์ด ์๋ฒ ๋ก์ง์ ์คํํ ์ ์์ต๋๋ค.
- Cold Start ๋น์ฉ์ด ์ฌ์ค์ ์กด์ฌํ์ง ์์ต๋๋ค.
๋น์ฉ ๊ตฌ์กฐ์ ๋จ์์ฑ
- ํธ๋ํฝ ๊ธฐ๋ฐ ๊ณผ๊ธ ๋ชจ๋ธ๋ก ๋น์ฉ ์์ธก์ด ๋น๊ต์ ์ฉ์ดํฉ๋๋ค.
๋ณด์ ๋ฐ ๋คํธ์ํฌ ๊ธฐ๋ฅ ๋ด์ฅ
- WAF, DDoS ๋ณดํธ, Rate Limiting ๋ฑ์ด ๊ธฐ๋ณธ ์ ๊ณต๋ฉ๋๋ค.
์บ์ ๊ด๋ฆฌ
- CDN ์บ์๋ฅผ ํ์ฉํ ์ ์ ์์ฐ ๋ฐ ์๋ต ์บ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋น์ฉ ํจ์จ์ฑ ๋ฐ ํ์ฅ์ฑ
- 2025๋ 8~10์ ๊ธฐ์ค, ์ ํ๊ท ์๋ฐฑ GB ์ด์์ ๋์ญํญ ์ฌ์ฉ๊ณผ ๋ค์์ Edge ์์ฒญ์ด ๋ฐ์ํ๋ ์๋น์ค ๊ตฌ์กฐ์์ Vercel์ ๋์ญํญ ๋ฐ Edge Requests ๊ณผ๊ธ์ด ์ฃผ์ ๋น์ฉ ์ฆ๊ฐ ์์ธ์ด์์ต๋๋ค.
- Cloudflare Pages๋ ๋์ญํญ ๋ฌด์ ํ ์ ์ฑ ์ ์ ๊ณตํ์ฌ, ๋์ผ ํธ๋ํฝ ์กฐ๊ฑด์์๋ ๋คํธ์ํฌ ๋น์ฉ์ด ์ฌ์ค์ ๊ณ ์ ๋น์ฉ์ ๊ฐ๊น๊ฒ ์ ์ง๋ฉ๋๋ค.
- ์ ์ ์์ฐ์ Cloudflare CDN์, SSR ๋ฐ API ์์ฒญ์ Workers๋ก ๋ถ๋ฆฌํจ์ผ๋ก์จ ํธ๋ํฝ ์ฑ๊ฒฉ์ ๋ฐ๋ฅธ ๋น์ฉ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ํด๋น ๊ตฌ์กฐ๋ ํธ๋ํฝ ์ฆ๊ฐ ์์๋ ๋น์ฉ์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ์ง ์๋ ํน์ฑ์ ๊ฐ์ง๋ฉฐ, ์ค์ ์ฌ์ฉ๋ ๊ธฐ์ค์ผ๋ก ์ฐ๊ฐ ์ฝ 93.5%์ ๋น์ฉ ์ ๊ฐ ํจ๊ณผ๋ฅผ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
2. ์ฉ์ด ๋ฐ ๊ฐ๋ ์ ์
์ด ๊ธ์์ ์ฌ์ฉ๋๋ ์ฃผ์ ์ฉ์ด๋ฅผ ๊ฐ๋จํ ์ ๋ฆฌํฉ๋๋ค.
Cloudflare Pages
- ์ ์ ์ฌ์ดํธ ๋ฐ ์ผ๋ถ ํ๋ ์์ํฌ ๋ฐฐํฌ๋ฅผ ์ง์ํ๋ Cloudflare์ ํธ์คํ ์๋น์ค์ ๋๋ค.
Cloudflare Workers
- Cloudflare Edge ํ๊ฒฝ์์ ์คํ๋๋ ์๋ฒ๋ฆฌ์ค ํจ์์ ๋๋ค.
- Node.js๊ฐ ์๋ ๋ ์์ ์ธ ๋ฐํ์์ ์ฌ์ฉํฉ๋๋ค.
Edge Runtime
- ์ ํต์ ์ธ Node.js ๋ฐํ์๊ณผ ๋ฌ๋ฆฌ, Edge ํ๊ฒฝ์์ ๋น ๋ฅธ ์คํ์ ๋ชฉ์ ์ผ๋ก ์ค๊ณ๋ ๋ฐํ์์ ๋๋ค.
- ํ์ผ ์์คํ
์ ๊ทผ(
fs)์ด๋ ์ผ๋ถ Node.js ๋ด์ฅ ๋ชจ๋ ์ฌ์ฉ์ด ์ ํ๋๋ฉฐ, ๋์ ๋น ๋ฅธ ์ฝ๋ ์คํํธ์ ๊ธ๋ก๋ฒ ๋ถ์ฐ ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค.
Wrangler
- Cloudflare Workers ๋ฐ Pages๋ฅผ ๋ฐฐํฌยท๊ด๋ฆฌํ๊ธฐ ์ํ ๊ณต์ CLI ๋๊ตฌ์ ๋๋ค.
OpenNext
- Next.js ๋น๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ํ ์๋ฒ๋ฆฌ์ค ๋ฐ Edge ํ๊ฒฝ์์ ์คํ ๊ฐ๋ฅํ๋๋ก ๋ณํํด์ฃผ๋ ์ด๋ํฐ ํ๋ก์ ํธ์ ๋๋ค.
WAF (Web Application Firewall)
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ผ๋ก ํ๋ ๋ณด์ ๋ฐฉํ๋ฒฝ ๊ธฐ๋ฅ์ ๋๋ค.
3. ์ฌ์ ์ค๋น
์ด ๊ธ์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ํด ๋ค์์ด ํ์ํฉ๋๋ค.
- ํ๋กํ ํ์ ์ฉ Next.js ํ๋ก์ ํธ
- Cloudflare ๊ณ์
- Cloudflare Workers ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
4. Cloudflare์์ Next.js๋ฅผ ๋ฐฐํฌํ๋ ๋ฐฉ์
Cloudflare๋ Next.js๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์ง์ ์ง์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ Next.js ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ Cloudflare ํ๊ฒฝ์ ๋ง๊ฒ ๋ณํํด์ฃผ๋ ์ด๋ํฐ๊ฐ ํ์ํฉ๋๋ค.
4.1 Cloudflare Workers + OpenNext (๊ถ์ฅ)
๋์
- SSR, ISR, Middleware, API Routes๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- Vercel๊ณผ ์ ์ฌํ ์คํ ๋ชจ๋ธ์ด ํ์ํ ๊ฒฝ์ฐ
ํต์ฌ ๋๊ตฌ
@opennextjs/cloudflare
์ด ๊ธ์์๋ Workers + OpenNext ๋ฐฉ์์ ๊ธฐ์ค์ผ๋ก ์ค๋ช ํฉ๋๋ค.
5. ์ ์ฒด ์ํคํ ์ฒ ๊ฐ์
Client
โ
Cloudflare CDN
โ
Cloudflare Worker
โโ Next.js Middleware
โโ SSR / RSC
โโ API Routes
โ
Static Assets (Cloudflare KV / R2)
- ๋ชจ๋ ์์ฒญ์ Cloudflare Edge๋ก ์ ์ ๋ฉ๋๋ค.
- Worker๊ฐ Next.js ๋ฐํ์ ์ญํ ์ ์ํํฉ๋๋ค.
- ์ ์ ๋ฆฌ์์ค๋ CDN ์บ์ ๋๋ R2๋ฅผ ํตํด ์๋น๋ฉ๋๋ค.
6. ํ๋ก์ ํธ ์ค์
6.1 ํ์ ํจํค์ง ์ค์น
pnpm add -D @opennextjs/cloudflare # Cloudflare Workers์ฉ OpenNext ์ด๋ํฐ
pnpm add -D @opennextjs/aws # OpenNext ๊ธฐ๋ณธ ํจํค์ง
pnpm add -D wrangler # Cloudflare Workers CLI
6.2 next.config.js ์ค์
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'standalone', // ํ์ ์ค์
}
module.exports = nextConfig
7. ๋น๋ ๋ฐ ๋ฐฐํฌ ํ๋ฆ
7.1 OpenNext ๋น๋
next build \
&& opennextjs-cloudflare build --skipBuild \
&& cp .open-next/worker.js
next build: Next.js ํ๋ก๋์ ๋น๋ ์ํopennextjs-cloudflare build --skipBuild: ๊ธฐ์กด.next๊ฒฐ๊ณผ๋ฌผ์ ๊ธฐ๋ฐ์ผ๋ก Cloudflare Workers์ฉ ๋น๋ ์ํcp .open-next/worker.js: Wrangler ์ค์ ๊ณผ ์ผ์นํ๋๋ก Worker ์ํธ๋ฆฌ ํ์ผ ๋ณต์ฌ
๋น๋๊ฐ ์๋ฃ๋๋ฉด .open-next/ ๋๋ ํ ๋ฆฌ๊ฐ ์์ฑ๋๋ฉฐ, Worker ์คํฌ๋ฆฝํธ์ ์ ์ ์์ฐ์ด ํฌํจ๋ฉ๋๋ค.
7.2 wrangler ์ค์
wrangler.toml ํ์ผ์ Cloudflare Workers ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฆ, ๋ฐํ์ ๋์ ๊ธฐ์ค, ์ํธ๋ฆฌ ํฌ์ธํธ, ๋น๋ ๋ฐ ์ ์ ์์ฐ ์ค์ ์ ์ ์ํ๋ ์ค์ ํ์ผ์
๋๋ค.
name = "ํ๋ก์ ํธ๋ช
" # Cloudflare Workers์ ๋ฑ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ
compatibility_date = "2025-12-22" # Workers ๋ฐํ์์ ๋์ ๊ธฐ์ค์ด ๋๋ ๋ ์ง
compatibility_flags = ["nodejs_compat"] # Node.js API ์ผ๋ถ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ํธํ ๋ ์ด์ด
main = ".open-next/worker.js" # Worker์ ์ํธ๋ฆฌ ํฌ์ธํธ. OpenNext๊ฐ ์๋ ์์ฑํ ํ์ผ
[build]
command = "pnpm run build" # wrangler deploy ์คํ ์ ์ฌ์ ์ ์ํ๋ ๋น๋ ๋ช
๋ น์ด
[assets]
directory = ".open-next/assets" # ์ ์ ์์ฐ ๋๋ ํ ๋ฆฌ
binding = "ASSETS" # Worker ์ฝ๋์์ ์ ๊ทผํ ๋ ์ฌ์ฉํ ๋ฐ์ธ๋ฉ ์ด๋ฆ
7.3 ๋ฐฐํฌ
npx wrangler deploy
8. ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ
Cloudflare๋ ํ๊ฒฝ ๋ณ์๋ฅผ ๋น๋ ํ์๊ณผ ๋ฐํ์์ผ๋ก ๊ตฌ๋ถํฉ๋๋ค.
| ๊ตฌ๋ถ | ์ฉ๋ | ์์ |
|---|---|---|
| Build-time | Next.js ๋น๋ ์ ์ฌ์ฉ | NEXT_PUBLIC_* |
| Runtime | Worker ์คํ ์ ์ฌ์ฉ | API_KEY |
NEXT_PUBLIC_์ ๋์ฌ๊ฐ ์๋ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ๋ ธ์ถ๋์ง ์์ต๋๋ค.- Runtime ํ๊ฒฝ ๋ณ์๋ Worker ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
9. Middleware ๋ง์ด๊ทธ๋ ์ด์ ํฌ์ธํธ
๋ค์ API๋ค์ ๋๋ถ๋ถ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
NextRequest.cookies.get / setrequest.nextUrl
๋ฏธ๋ค์จ์ด ์ ์ฉ ๋ฒ์๋ฅผ ์ ํํ๋ ค๋ฉด config.matcher ์ค์ ์ด ํ์ํฉ๋๋ค.
// middleware.ts
export const config = {
matcher: ['/((?!api).*)'],
}
์ฃผ์์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Node.js ์ ์ฉ API ์ฌ์ฉ์ด ๋ถ๊ฐํฉ๋๋ค.
process.env์ ๊ทผ์ Runtime ํ๊ฒฝ ๋ณ์ ๊ธฐ์ค์ ๋๋ค.- ์ผ๋ถ ํค๋ ์กฐ์ ๋ก์ง์ Cloudflare ์ ์ฝ์ด ์กด์ฌํฉ๋๋ค.
10. ์ ํ ์ฌํญ ๋ฐ ์ฃผ์์
Edge Runtime ์ ์ฝ
fs,net,child_process์ฌ์ฉ ๋ถ๊ฐ
์ด๋ฏธ์ง ์ต์ ํ
- Next Image ์ผ๋ถ ์ต์ ์ ์ ์ฝ์ด ์์ต๋๋ค.
ISR
- Vercel๊ณผ ๋์ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์กด์ฌํฉ๋๋ค.
์ค์๋น์ค ์ ์ฉ ์ ๊ธฐ๋ฅ ๋จ์ ๊ฒ์ฆ์ ๋ฐ๋์ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
11. ์ธ์ Cloudflare๊ฐ ์ ํฉํ๊ฐ
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ Cloudflare ๊ธฐ๋ฐ Next.js ๋ฐฐํฌ๊ฐ ํนํ ํจ๊ณผ์ ์ ๋๋ค.
- ๊ธ๋ก๋ฒ ํธ๋ํฝ ๋น์ค์ด ๋์ ์๋น์ค
- SSR ์๋ต ์๋๊ฐ ์ค์ํ ์๋น์ค
- Edge ๊ธฐ๋ฐ ์ธ์ฆ, A/B ํ ์คํธ ํ์ฉ์ด ํ์ํ ๊ฒฝ์ฐ
- ์ธํ๋ผ ๋น์ฉ ์ต์ ํ๊ฐ ์ค์ํ ๊ฒฝ์ฐ
๋ฐ๋๋ก, Node.js ์์กด๋๊ฐ ๋์ ์๋น์ค๋ผ๋ฉด Vercel์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
12. ๋ง๋ฌด๋ฆฌ
์ธํ๋ผ์ ๋ํ ์ง์์ด ๊ฑฐ์ ์๋ ์ํ์์ ์์ํ ์์ ์ด์์ง๋ง, ์ด๋ฒ ๊ฒฝํ์ Cloudflare๋ฅผ ๋น๋กฏํ Edge ๊ธฐ๋ฐ ์ธํ๋ผ๋ฅผ ์ดํดํ๋ ์ค์ํ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค.
์ค์๋น์ค๋ฅผ ๊ณง๋ฐ๋ก ์ด์ ํ๊ธฐ๋ณด๋ค๋, ๋จผ์ ํ๋กํ ํ์ ์ ํตํด ํ์ํ ์คํ์ ์ ์ํ๊ณ ๊ธฐ์ ์ ๊ฐ๋ฅ์ฑ์ ๊ฒ์ฆํจ์ผ๋ก์จ ์ดํ ๋ง์ด๊ทธ๋ ์ด์ ์์ ์ ๋ณด๋ค ์์ ์ ์ผ๋ก ์ค๋นํ ์ ์์์ต๋๋ค.
์ด ๊ธ์ด Cloudflare๋ก Next.js ๋ฐฐํฌ๋ฅผ ์ฒ์ ์๋ํ์๋ ๋ถ๋ค๊ป ์ํ์ฐฉ์ค๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ ์ค์ง์ ์ธ ์ฐธ๊ณ ์๋ฃ๊ฐ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.