π λΈλ‘κ·Έ ν¬μ€ν κ±°λ²λμ€
μ΄ λ¬Έμλ GitHub Pages + Jekyll κΈ°λ° λΈλ‘κ·Έμμ μ½κΈ° μ½κ³ μ νλ ₯ μλ κΈμ μ°κΈ° μν κ°μ΄λμ λλ€. κ°λ° μ€ μκ² λ κ²μ λΈλ‘κ·Έ λ°©λ¬Έμμκ² μ½κ² μ λ¬νλ κ²μ΄ λͺ©νμ λλ€.
1. κΈμ°κΈ° μ² ν 3μμΉ
| μμΉ | μλ―Έ | λ°λ‘ |
|---|---|---|
| ν λ¬Έμ₯μΌλ‘ λ§ν μ μλ? | ν΅μ¬ λ©μμ§κ° νλμ λ¬Έμ₯μΌλ‘ μμ½λμ΄μΌ νλ€ | βCloudflareμ μ¬λ¬ κΈ°λ₯μ λν΄ μμλ³΄κ² μ΅λλ€β |
| λͺ¨λ₯΄λ μ¬λλ μ΄ν΄νλ? | ν΄λΉ κΈ°μ μ μ²μ μ νλ λ μλ λ§₯λ½μ μ΄ν΄ν μ μμ΄μΌ νλ€ | μ μ 쑰건μ μ€λͺ μμ΄ μλ΅ |
| μ¬μ§λ§ λ΄λ νλ¦μ μλ? | μ΄λ―Έμ§/λ€μ΄μ΄κ·Έλ¨λ§μΌλ‘ κΈμ νλ¦μ νμ ν μ μμ΄μΌ νλ€ | μ½λμ ν μ€νΈλ§ μλ κΈ |
2. ν¬μ€νΈ ꡬ쑰 ν νλ¦Ώ
λͺ¨λ ν¬μ€νΈλ μλ 6λ¨ κ΅¬μ‘°λ₯Ό λ°λ¦ λλ€.
βββββββββββββββββββββββββββββββββββββββ
β π― Hook (1~2λ¬Έμ₯) β β μ μ΄ κΈμ μ°λκ°? 무μμ μ»λ?
βββββββββββββββββββββββββββββββββββββββ€
β π TL;DR (3~5κ° λΆλ¦Ώ) β β λ°μ μ¬λμ μν ν΅μ¬ μμ½
βββββββββββββββββββββββββββββββββββββββ€
β π λ°°κ²½ / λ¬Έμ μν© β β 무μμ νλ € νκ³ , 무μμ΄ λ§νλ?
βββββββββββββββββββββββββββββββββββββββ€
β π‘ ν΄κ²° κ³Όμ (λ©μΈ λ³Έλ¬Έ) β β λ¨κ³λ³ μ€λͺ
+ κ·Έλ¦Ό/μ½λ/ν
βββββββββββββββββββββββββββββββββββββββ€
β β
κ²°κ³Ό / Before & After β β ν΄κ²° κ²°κ³Όλ₯Ό μκ°μ μΌλ‘
βββββββββββββββββββββββββββββββββββββββ€
β π Takeaway (ν΅μ¬ κ΅ν 3κ°μ§) β β ν μ€μ© κΈ°μ΅ν κ²
βββββββββββββββββββββββββββββββββββββββ
κ° μΉμ μμ± κ°μ΄λ
π― Hook β 첫 λ¬Έμ₯μ΄ λͺ¨λ κ²μ κ²°μ νλ€
β "μ΄ κΈμμλ Cloudflare Workersμ λν΄ μμλ³΄κ² μ΅λλ€."
β
"무λ£λ‘ ν루 10λ§ μμ²μ μ²λ¦¬νλ APIλ₯Ό λ§λ€ μ μμ΅λλ€ β Cloudflare Workersλ‘μ."
- λ μμ pain pointλ νΈκΈ°μ¬μ μκ·Ήνλ ν λ¬Έμ₯μΌλ‘ μμ
- βXλ₯Ό ν΄κ²°νλ€β, βYλ₯Ό 무λ£λ‘ λ§λ€μλ€β, βZ λλ¬Έμ 3μΌμ λ λ Έλ€β ν¨ν΄ νμ©
π TL;DR β λ°μ μ¬λμ λ°°λ €νλΌ
## TL;DR
- Cloudflare Pages + Workers + D1 μ‘°ν©μΌλ‘ **μ $0** μΉμλΉμ€ κ΅¬μΆ κ°λ₯
- ν΅μ¬μ `@opennextjs/cloudflare` μ΄λν°λ‘ Next.jsλ₯Ό Pagesμ μ¬λ¦¬λ κ²
- D1(SQLite)μ 5GBκΉμ§ 무λ£, R2λ egress μκΈ μμ
- 3~5κ° λΆλ¦Ώ, κ° ν΅μ¬μ κ΅΅μ κΈμ¨λ‘ ν€μλ κ°μ‘°
- μ΄κ²λ§ μ½μ΄λ κΈμ λͺ©μ μ μλ μμ€μΌλ‘
π λ°°κ²½ β βμ μ΄κ±Έ νκ² λμλβλ₯Ό λ¨Όμ λ§νλΌ
- λ μκ° κ³΅κ°ν μ μλ μν©μ λ¨Όμ μ€λͺ
- μΈνλΌ/νκ²½ μ€λͺ μ κ°λ¨ν μν€ν μ² λ€μ΄μ΄κ·Έλ¨ νλλ‘
- βAλ₯Ό νλ € νλλ° Bκ° μ λμλ€β β λ μλ κ°μ λ¬Έμ λ₯Ό κ²ͺκ³ μμ κ°λ₯μ±
π‘ ν΄κ²° κ³Όμ β Step by Step
- ν° λ¨λ½μ λ²νΈκ° μλ λ¨κ³λ‘ λλκΈ° (Step 1, Step 2, β¦)
- 2κ° μ΄μμ μ νμ§κ° μλ€λ©΄ λΉκ΅ν μ¬μ©
- μ½λλ ν΅μ¬λ§ β μ 체 μ½λλ GitHub λ§ν¬λ μ μ μ μλ λΈλ‘(
<details>)μΌλ‘
β κ²°κ³Ό β μκ°μ μΌλ‘ 보μ¬λΌ
- Before & After μ΄λ―Έμ§ or ν
- μ«μκ° μλ€λ©΄ κ°μ μμΉ νμ (μ: βμλ΅ μκ° 2.3s β 0.4sβ)
- μ€ν¬λ¦°μ·, λ€μ΄μ΄κ·Έλ¨, μν€ν μ² κ·Έλ¦Ό μ΅μ 1κ° μ΄μ
π Takeaway β κΈ°μ΅ν κ² 3κ°μ§
## Takeaway
1. **302 + Set-Cookieλ Cloudflare Pagesμμ λΆμμ νλ€** β 200 HTML + JS 리λ€μ΄λ νΈλ‘ λ체
2. **λ€μ€ μΏ ν€λ `Headers.append()`λ‘** β μμ±μλ μΌνλ‘ λ³ν©ν¨
3. **νλ‘ νΈμλμ APIλ κ°μ λλ©μΈμ** β Pages Functionsκ° CORS μμ΄ κΉλ
3. μκ° μλ£ κ°μ΄λ β βκΈλ§ μλ κΈμ λ¬Έμλ€β
3.1 μΈμ μ΄λ€ μκ° μλ£λ₯Ό μΈκΉ
| μν© | μΆμ² μκ° μλ£ | μμ |
|---|---|---|
| μν€ν μ²/ꡬ쑰 μ€λͺ | λ€μ΄μ΄κ·Έλ¨ (Mermaid, Draw.io) | βμΈμ¦ νλ¦: λΈλΌμ°μ β Worker β D1β |
| μ νμ§ λΉκ΅ | λΉκ΅ν (Markdown ν) | βVercel vs Netlify vs Cloudflareβ |
| λ¨κ³λ³ κ³Όμ | λ²νΈκ° μλ λͺ©λ‘ + μ½λ | βStep 1: μ€μΉ, Step 2: μ€μ β |
| κ²°κ³Ό/λ³ν | Before & After μ΄λ―Έμ§/ν | βμμ μ νλ©΄ β μμ ν νλ©΄β |
| λ°μ΄ν°/μμΉ | ν | βλ¬΄λ£ ν°μ΄ νλ λΉκ΅β |
| μλ¬/νΈλ¬λΈμν | μλ¬ λ©μμ§ + μμΈ + ν΄κ²° μΉ΄λ | ββ 429 β μμΈ: μλͺ»λ μλν¬μΈνΈβ |
| νλ¦/μκ°μ | νμλΌμΈ | βDay 1: X λ°κ²¬ β Day 3: Y μλ β Day 4: ν΄κ²°β |
3.2 λ€μ΄μ΄κ·Έλ¨ μμ±
Jekyllμμ Mermaidλ₯Ό μ§μνμ§ μλ κ²½μ°, ν μ€νΈ λ€μ΄μ΄κ·Έλ¨μ μ¬μ©:
ββββββββββββ OAuth ββββββββββββ SQL βββββββ
β SPA β βββββββββββ β Worker β βββββββ β D1 β
β (Pages) β βββββββββββ β (/api/*) β βββββββ β β
ββββββββββββ JWT/JSON ββββββββββββ rows βββββββ
λλ μ½λ λΈλ‘ μμ ASCII μνΈλ‘ κ°λ¨ν νλ¦λλ₯Ό κ·Έλ¦°λ€.
3.3 μ΄λ―Έμ§ μ¬μ© κ·μΉ
- μ΄λ―Έμ§ μμΉ:
/assets/images/posts/{ν¬μ€νΈμ¬λ¬κ·Έ}/μλμ μ μ₯ - νμΌλͺ
:
01-problem-overview.png,02-architecture.png(μ«μ μ λμ¬λ‘ μμ νμ) - ν¬κΈ°: κ°λ‘ 800px μ΄ν (λͺ¨λ°μΌ κ°λ μ±)
- λ체 ν
μ€νΈ: λͺ¨λ μ΄λ―Έμ§μ
νμμΌλ‘ μ€λͺ νμ
<!-- β
μ’μ μ -->

<!-- β λμ μ -->

4. μ½λ μμ± κ·μΉ
4.1 μ½λλ μ΅μννλΌ
<!-- β λμ μ: 100μ€ μ 체 μ½λλ₯Ό κ·Έλλ‘ λΆμ¬λ£μ -->
<!-- β
μ’μ μ: ν΅μ¬λ§ 보μ¬μ£Όκ³ , μ 체λ λ§ν¬λ‘ -->
ν΅μ¬ λ‘μ§λ§ 10~20μ€ μ΄λ΄λ‘ 보μ¬μ€λ€. μ 체 μ½λκ° νμν κ²½μ°:
<details>
<summary>π μ 체 μ½λ 보기</summary>
```typescript
// μ 체 μ½λλ₯Ό μ¬κΈ°μ
</details>
### 4.2 μ½λμλ λ°λμ μ€λͺ
μ
```typescript
// β
μ’μ μ: κ° λ¨κ³μ μ£Όμ
const token = await generateJWT(user.id); // 1. JWT μμ±
res.cookies.set('token', token, { // 2. HttpOnly μΏ ν€λ‘ μ€μ
httpOnly: true,
secure: true,
sameSite: 'lax'
});
4.3 μλ¬ μ½λλ μμΈκ³Ό ν¨κ»
### β μλ¬
429 Too Many Requests β {βerrorβ:{βcodeβ:β1113β,βmessageβ:βδ½ι’δΈθΆ³β}}
**μμΈ**: `/api/paas/v4/` κ²½λ‘λ μΌλ° 리μμ€ νμ μ¬μ©νμ¬ μ½κ² κ³ κ°λ¨
**ν΄κ²°**: `/api/coding/paas/v4/` κ²½λ‘ μ¬μ© (λ³λ 리μμ€ ν)
5. κΈμ°κΈ° μ€νμΌ κ·μΉ
5.1 λ¬Έμ₯ κ·μΉ
| κ·μΉ | μ€λͺ | μμ |
|---|---|---|
| ν λ¬Έμ₯ ν idea | ν λ¬Έμ₯μ νλμ μλ―Έλ§ | βWorkersλ λΉ λ₯΄λ€. μλνλ©΄ μ£μ§μμ μ€νλκΈ° λλ¬Έμ΄λ€.β |
| λ¨λ¬Έ μ°μ | 30μ μ΄λ΄ λ¬Έμ₯μ κΈ°λ³ΈμΌλ‘ | βμ€μ μ κ°λ¨νλ€.β |
| λ₯λν μ¬μ© | βλ©λλ€βλ³΄λ€ βν©λλ€β | βμλ¬κ° λ°μλ©λλ€β β βμλ¬κ° λ°μν©λλ€β |
| μ λ¬Έ μ©μ΄λ κ°μ£Όν΄μ€ | μ²μ λμ¬ λ ν μ€ μ€λͺ | βD1(Cloudflareμ SQLite κΈ°λ° μλ²λ¦¬μ€ DB)β |
| μ΄μ λ₯Ό λ¨Όμ λ§νκΈ° | β무μβλ³΄λ€ βμβλ₯Ό λ¨Όμ | β βμ€μ μ λ³κ²½ν©λλ€β β β βμλ ν₯μμ μν΄ μ€μ μ λ³κ²½ν©λλ€β |
5.2 ν€ & λ§€λ
- 격μ μλ λ±λ±νμ§ μκ²: β~ν©λλ€β 체 (μ‘΄λλ§)
- λ μμκ² μ§μ λ§νλ―: βμ€μ νμΈμβ, βνμΈν΄λ³΄μΈμβ
- μμ§νκ²: βμ¬κΈ°μ 3μΌμ λ λ Έλ€β, β곡μ λ¬Έμμ μ μ ν μμλ€β
- κ³Όμ₯ κΈμ§: βμλ²½νβ, βμ΅κ³ μβ β ꡬ체μ μΈ μμΉλ μ¬μ€λ‘ λ체
5.3 κΈ κΈΈμ΄ κ°μ΄λ
| μ ν | κΆμ₯ κΈΈμ΄ | μμ |
|---|---|---|
| How-to / κ°μ΄λ | 2,000~4,000μ | βCloudflare D1 μ€μ λ°©λ²β |
| νΈλ¬λΈμν | 1,500~3,000μ | βOAuth 429 μλ¬ ν΄κ²°β |
| κ°λ μ€λͺ | 1,000~2,000μ | βJWTλ 무μμΈκ°β |
| μ’ ν© κ°μ΄λ | 5,000~8,000μ | βCloudflare μ€ν μ 체 κ°μ΄λβ |
κΈμ΄ κΈΈμ΄μ§λ©΄ μ¬λ¬ ν¬μ€νΈλ‘ λλλ€. νλμ ν¬μ€νΈ = νλμ ν΅μ¬ λ©μμ§.
6. Jekyll νλ‘ νΈλ§€ν° κ·κ²©
---
layout: post
title: μ λͺ©μ κ²μμ μ κ±Έλ¦¬κ² (νκΈ κ°λ₯)
categories: [μΉ΄ν
κ³ λ¦¬1, μΉ΄ν
κ³ λ¦¬2] # 2~3κ°, λλΆλ₯ β μλΆλ₯
description: κ²μκ²°κ³Όμ νμλ ν μ€ μμ½ # 80μ μ΄λ΄
keywords: [ν€μλ1, ν€μλ2, ν€μλ3] # 3~7κ°
toc: true
toc_sticky: true
---
μ λͺ© μμ± κ·μΉ
β "Cloudflareμ λν΄ μμ보μ" β λ무 λͺ¨νΈ
β "Cloudflare Pages + Workers + D1 + R2 μλ²½ κ°μ΄λ" β κ³Όμ₯
β
"Cloudflare μ€νμΌλ‘ μ $0 μΉμλΉμ€ λ§λ€κΈ°" β ꡬ체μ , ν¨μ© λͺ
ν
β
"GLM-5 API 429 μλ¬ β 3μΌκ°μ μ½μ§κ³Ό ν΄κ²°" β κ²½ν κΈ°λ°, νΈκΈ°μ¬ μ λ°
7. μΆκ° μ 체ν¬λ¦¬μ€νΈ
λ΄μ© 체ν¬
- Hook: 첫 λ¬Έμ₯μ΄ νΈκΈ°μ¬μ μκ·Ήνλκ°?
- TL;DR: λ°μ λ μλ μμ½λ§ μ½κ³ κ° μ μλκ°?
- μκ° μλ£: λ€μ΄μ΄κ·Έλ¨, ν, μ€ν¬λ¦°μ· μ€ μ΅μ 1κ° μλκ°?
- Before & After: κ²°κ³Όλ₯Ό μκ°μ μΌλ‘ 보μ¬μ£Όλκ°?
- Takeaway: κΈ°μ΅ν ν΅μ¬ 3κ°μ§κ° λͺ ννκ°?
- κ°μΈμ 보: νλ‘μ νΈλͺ , μ΄λ©μΌ, API ν€, λλ©μΈμ΄ μ κ±°λμλκ°?
κ°λ μ± μ²΄ν¬
- λ¨λ½ λλ: 3λ¬Έμ₯ μ΄μ μ°μ λΆμ΄μλ λ¨λ½μ΄ μλκ°?
- κ΅΅μ κΈμ¨: κ° μΉμ μ ν€μλκ° κ°μ‘°λμ΄ μλκ°?
- ν νμ©: λμ΄ν μ λ³΄κ° νλ‘ μ 리λμ΄ μλκ°?
- μ½λ μ΅μν: 20μ€ μ΄μμ μ½λλ μ κΈ° λΈλ‘μΌλ‘ κ°μΆμλκ°?
- ν€λ© ꡬ쑰: H2(##)λ 5~8κ°, H3(###)λ κ·Έ μλ 2~4κ°μΈκ°?
κΈ°μ 체ν¬
- νλ‘ νΈλ§€ν°: layout, title, categories, description, keywordsκ° μλκ°?
- μ΄λ―Έμ§ κ²½λ‘:
/assets/images/posts/{μ¬λ¬κ·Έ}/μλμ μλκ°? - λ§ν¬: μΈλΆ λ§ν¬κ° μ μ μλνλκ°?
- λ‘컬 λΉλ:
bundle exec jekyll serveλ‘ λ λλ§μ΄ μ μμΈκ°?
8. ν¬μ€νΈ μ νλ³ ν νλ¦Ώ
Type A: How-To κ°μ΄λ
---
layout: post
title: "___νλ λ°©λ² β ___λΆν° ___κΉμ§"
categories: [λλΆλ₯, μλΆλ₯]
description: "___"
keywords: [...]
toc: true
toc_sticky: true
---
{Hook: μ μ΄κ±Έ ν΄μΌ νλ? ν λ¬Έμ₯}
## TL;DR
- ν΅μ¬ μμ½ 3~5κ°
## μ¬μ μ€λΉ
- νμ 쑰건 λΆλ¦Ώ
## Step 1: ___
μ€λͺ
+ μ½λ/μ΄λ―Έμ§
## Step 2: ___
μ€λͺ
+ μ½λ/μ΄λ―Έμ§
## κ²°κ³Ό
Before & After μ΄λ―Έμ§ or ν
## Takeaway
1. **ν΅μ¬ 1**
2. **ν΅μ¬ 2**
3. **ν΅μ¬ 3**
Type B: νΈλ¬λΈμν
---
layout: post
title: "___ μλ¬ ν΄κ²° β ___νλλ κ³ μ³μ§"
---
{Hook: μ΄λ€ μν©μμ μ΄λ€ μλ¬κ° λ¬λ€}
## TL;DR
- μλ¬ μμΈ ν μ€
- ν΄κ²° λ°©λ² ν μ€
## μλ¬ λ΄μ©
μλ¬ λ‘κ·Έ
## μμΈ λΆμ
λ€μ΄μ΄κ·Έλ¨ or μ€λͺ
## ν΄κ²° κ³Όμ
### μλ 1: ___ β β μ€ν¨ (μ΄μ )
### μλ 2: ___ β β μ€ν¨ (μ΄μ )
### μλ 3: ___ β β
μ±κ³΅
## Takeaway
1. **ν΅μ¬ κ΅ν**
Type C: λΉκ΅ / 리뷰
---
layout: post
title: "___ vs ___ β ___κΈ°μ€μΌλ‘ λΉκ΅ν΄λ΄€λ€"
---
{Hook: μ μ΄ λΉκ΅κ° νμνκ°}
## λΉκ΅ ν
| νλͺ© | A | B |
|------|---|---|
| ... | ... | ... |
## Aμ μ₯λ¨μ
## Bμ μ₯λ¨μ
## κ²°λ‘
## Takeaway
Type D: κ°λ μ€λͺ
---
layout: post
title: "___λ? β ___κ΄μ μμ μ΄ν΄νκΈ°"
---
{Hook: μ΄ κ°λ
μ μ μμμΌ νλ}
## ν μ€ μ μ
___λ ___μ΄λ€.
## μ νμνκ°
μ€μ μ¬λ‘
## ν΅μ¬ μ리
λ€μ΄μ΄κ·Έλ¨ + μ€λͺ
## μ€μ μμ
μ½λ
## Takeaway
9. λ©ν°μμ€ ν΅ν© ν¬μ€νΈ μμ±λ²
μ¬λ¬ κ°λ° λ ΈνΈλ₯Ό νλμ ν¬μ€νΈλ‘ ν©μΉ λ:
1. μμ€λ³ ν΅μ¬ λ©μμ§λ₯Ό ν μ€λ‘ μΆμΆ
2. κ³΅ν΅ μ£Όμ λ‘ κ·Έλ£Ήν
3. μμ¬ νλ¦ κ΅¬μ±: λ¬Έμ β μμΈ β ν΄κ²° β κ΅ν
4. κ° μμ€μ μ€λ³΅ λ΄μ© μ κ±°
5. ν΅ν© ν κΈ κΈΈμ΄κ° 8,000μ μ΄κ³Ό β ν¬μ€νΈ λΆλ¦¬
μ΄ κ±°λ²λμ€λ μ§μμ μΌλ‘ κ°μ λ©λλ€. ν¬μ€νΈλ₯Ό μμ±νλ©° λ°κ²¬ν κ°μ μ μ μ΄ λ¬Έμμ λ°μν©λλ€.