Skip to main content
SonamuλŠ” HTTP Cache-Control 헀더λ₯Ό μžλ™μœΌλ‘œ μ„€μ •ν•˜μ—¬ λΈŒλΌμš°μ €μ™€ CDN의 캐싱 λ™μž‘μ„ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. API 응닡, 정적 파일, SSR νŽ˜μ΄μ§€ λ“± 각 λ¦¬μ†ŒμŠ€ νƒ€μž…λ³„λ‘œ μ μ ˆν•œ 캐싱 μ „λž΅μ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

기본 ꡬ쑰

cacheControlHandler

각 μš”μ²­μ— λŒ€ν•΄ Cache-Control 헀더λ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. νƒ€μž…: (req: CacheControlRequest) => string | undefined

μš”μ²­ νƒ€μž…

type:
  • "assets" - 정적 파일 (JS, CSS, 이미지 λ“±)
  • "api" - API μ—”λ“œν¬μΈνŠΈ
  • "ssr" - SSR νŽ˜μ΄μ§€
  • "csr" - CSR μ§„μž…μ  (index.html)
method: HTTP λ©”μ„œλ“œ (GET, POST, PUT, DELETE λ“±) path: μš”μ²­ 경둜 (/api/user/list, /assets/main.js λ“±)

CachePresets

Sonamuκ°€ μ œκ³΅ν•˜λŠ” 사전 μ •μ˜λœ 캐싱 μ „λž΅μž…λ‹ˆλ‹€.

μ‚¬μš© κ°€λŠ₯ν•œ Presets

CachePresets.noCache
  • 항상 원본 μ„œλ²„μ—μ„œ μ΅œμ‹  버전 확인
  • μš©λ„: μ‹€μ‹œκ°„ 데이터, 인증이 ν•„μš”ν•œ API
CachePresets.shortLived (1λΆ„)
  • 1λΆ„κ°„ μΊμ‹œ
  • μš©λ„: 자주 λ³€κ²½λ˜λŠ” 데이터, CSR μ§„μž…μ 
CachePresets.mediumLived (5λΆ„)
  • 5λΆ„κ°„ μΊμ‹œ
  • μš©λ„: 보톡 주기둜 λ³€κ²½λ˜λŠ” 데이터
CachePresets.longLived (1μ‹œκ°„)
  • 1μ‹œκ°„ μΊμ‹œ
  • μš©λ„: 거의 λ³€κ²½λ˜μ§€ μ•ŠλŠ” 정적 데이터
CachePresets.immutable (1λ…„)
  • 1λ…„κ°„ μΊμ‹œ, λ³€κ²½λ˜μ§€ μ•ŠμŒ
  • μš©λ„: ν•΄μ‹œκ°€ ν¬ν•¨λœ λΉŒλ“œ 파일
CachePresets.ssr (10초)
  • 10μ΄ˆκ°„ μΊμ‹œ, λ°±κ·ΈλΌμš΄λ“œμ—μ„œ κ°±μ‹ 
  • μš©λ„: SSR νŽ˜μ΄μ§€

κΈ°λ³Έ μ˜ˆμ‹œ

λ‹¨μˆœ μ„€μ •

Assets μ„ΈλΆ„ν™”

ν•΄μ‹œκ°€ ν¬ν•¨λœ νŒŒμΌμ€ 영ꡬ μΊμ‹œ, κ·Έ μ™ΈλŠ” 일반 μΊμ‹œ:

API κ²½λ‘œλ³„ 캐싱

GET μš”μ²­λ§Œ μ„ νƒμ μœΌλ‘œ μΊμ‹œ:

μ‹€μ „ μ˜ˆμ‹œ

ν‘œμ€€ μ›Ή μ•±

CDN μ΅œμ ν™”

개발 vs ν”„λ‘œλ•μ…˜

μ»€μŠ€ν…€ Cache-Control

Preset이 μ•„λ‹Œ 직접 헀더 값을 λ°˜ν™˜ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

Cache-Control μ΄ν•΄ν•˜κΈ°

μ£Όμš” λ””λ ‰ν‹°λΈŒ

public
  • CDNκ³Ό 쀑간 ν”„λ‘μ‹œμ—μ„œλ„ μΊμ‹œ κ°€λŠ₯
  • 정적 파일, 곡개 API에 적합
private
  • λΈŒλΌμš°μ €λ§Œ μΊμ‹œ κ°€λŠ₯
  • κ°œμΈν™”λœ 데이터에 적합
no-cache
  • μΊμ‹œλŠ” ν•˜λ˜ 맀번 원본 검증 ν•„μš”
  • 쑰건뢀 μš”μ²­ (304 Not Modified) κ°€λŠ₯
no-store
  • 어디에도 μΊμ‹œν•˜μ§€ μ•ŠμŒ
  • λ―Όκ°ν•œ 데이터에 μ‚¬μš©
max-age=N
  • N초 λ™μ•ˆ μ‹ μ„ ν•œ(fresh) μƒνƒœ
  • 이 κΈ°κ°„ λ™μ•ˆμ€ μž¬κ²€μ¦ 없이 μΊμ‹œ μ‚¬μš©
immutable
  • μ ˆλŒ€ λ³€κ²½λ˜μ§€ μ•ŠμŒ
  • λΈŒλΌμš°μ €κ°€ μž¬κ²€μ¦μ„ κ±΄λ„ˆλœ€
  • ν•΄μ‹œ 기반 νŒŒμΌμ— 졜적
stale-while-revalidate=N
  • 만료 ν›„ N초 λ™μ•ˆ stale 버전 λ°˜ν™˜
  • λ°±κ·ΈλΌμš΄λ“œμ—μ„œ κ°±μ‹ 
  • SSR νŽ˜μ΄μ§€μ— 유용

μ˜ˆμ‹œ μ‘°ν•©

undefined λ°˜ν™˜

헀더λ₯Ό μ„€μ •ν•˜μ§€ μ•ŠμœΌλ €λ©΄ undefinedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€:

μ£Όμ˜μ‚¬ν•­

1. 인증이 ν•„μš”ν•œ API

2. POST/PUT/DELETEλŠ” μΊμ‹œ μ•ˆ 함

3. ν•΄μ‹œ 기반 파일 감지

λ‹€μŒ 단계

Cache-Control 섀정을 μ™„λ£Œν–ˆλ‹€λ©΄:
  • cache - μ„œλ²„ μ‚¬μ΄λ“œ 캐싱 (BentoCache)
  • compress - 응닡 μ••μΆ• μ„€μ •
  • advanced-features/ssr - SSRμ—μ„œ Cache-Control ν™œμš©