Skip to main content
SonamuλŠ” BentoCacheλ₯Ό 기반으둜 κ°•λ ₯ν•œ 캐싱 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 이 κ°€μ΄λ“œμ—μ„œλŠ” sonamu.config.tsμ—μ„œ μΊμ‹œλ₯Ό μ„€μ •ν•˜λŠ” 방법을 μ•Œμ•„λ΄…λ‹ˆλ‹€.

BentoCacheλž€?

BentoCacheλŠ” Multi-tier 캐싱을 μ§€μ›ν•˜λŠ” TypeScript μΊμ‹œ λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. μ£Όμš” νŠΉμ§•:
  • L1/L2 λ ˆμ΄μ–΄: λ©”λͺ¨λ¦¬(빠름) + 영ꡬ μ €μž₯μ†Œ(λŠλ¦Όν•˜μ§€λ§Œ 곡유 κ°€λŠ₯)
  • λ‹€μ–‘ν•œ λ“œλΌμ΄λ²„: Memory, Redis, File, Knex 지원
  • Bus μ‹œμŠ€ν…œ: λΆ„μ‚° μΊμ‹œ λ¬΄νš¨ν™”
  • Tag 기반 λ¬΄νš¨ν™”: μ—¬λŸ¬ μΊμ‹œλ₯Ό 그룹으둜 관리
  • TTL & Grace Period: 만료 및 Stale-While-Revalidate

κΈ°λ³Έ μ„€μ •

sonamu.config.ts

sonamu.config.ts의 server.cache ν•„λ“œμ— μΊμ‹œ 섀정을 μΆ”κ°€ν•©λ‹ˆλ‹€:
ν•„μˆ˜ ν•„λ“œ:
  • default: 기본으둜 μ‚¬μš©ν•  μŠ€ν† μ–΄ 이름
  • stores: μŠ€ν† μ–΄ μ„€μ • 객체 (μ΅œμ†Œ 1개 이상 ν•„μš”)

λ“œλΌμ΄λ²„ μ’…λ₯˜

SonamuλŠ” 5κ°€μ§€ λ“œλΌμ΄λ²„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

memory

λ©”λͺ¨λ¦¬ 기반 μΊμ‹œ (λΉ λ₯΄μ§€λ§Œ ν”„λ‘œμ„ΈμŠ€ μž¬μ‹œμž‘ μ‹œ μ‚­μ œ)

redis

Redis 기반 μΊμ‹œ (μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€ κ°„ 곡유 κ°€λŠ₯)

file

파일 μ‹œμŠ€ν…œ 기반 μΊμ‹œ (영ꡬ μ €μž₯)

knex

λ°μ΄ν„°λ² μ΄μŠ€ 기반 μΊμ‹œ (κΈ°μ‘΄ DB ν™œμš©)

redisBus

λΆ„μ‚° μΊμ‹œ λ¬΄νš¨ν™” λ²„μŠ€ (μ—¬λŸ¬ μ„œλ²„ κ°„ 동기화)

Import 방법

Store ꡬ성

L1 λ ˆμ΄μ–΄ (λ©”λͺ¨λ¦¬ μΊμ‹œ)

L1은 둜컬 λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄ κ°€μž₯ λΉ λ¦…λ‹ˆλ‹€.
νŠΉμ§•:
  • ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œλ§Œ 유효
  • μ„œλ²„ μž¬μ‹œμž‘ μ‹œ μ‚­μ œλ¨
  • λ„€νŠΈμ›Œν¬ I/O μ—†μŒ (κ°€μž₯ 빠름)

L2 λ ˆμ΄μ–΄ (영ꡬ μ €μž₯μ†Œ)

L2λŠ” μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€/μ„œλ²„ κ°„ 곡유 κ°€λŠ₯ν•œ μ €μž₯μ†Œμž…λ‹ˆλ‹€.
Redis μž₯점:
  • μ—¬λŸ¬ μ„œλ²„ κ°„ μΊμ‹œ 곡유
  • 영ꡬ μ €μž₯ (μž¬μ‹œμž‘ 후에도 μœ μ§€)
  • λΉ λ₯Έ λ„€νŠΈμ›Œν¬ μ•‘μ„ΈμŠ€

Bus λ ˆμ΄μ–΄ (λΆ„μ‚° λ¬΄νš¨ν™”)

μ—¬λŸ¬ μ„œλ²„κ°€ μžˆμ„ λ•Œ, ν•œ μ„œλ²„μ—μ„œ μΊμ‹œλ₯Ό μ‚­μ œν•˜λ©΄ λ‹€λ₯Έ μ„œλ²„μ—λ„ μ•Œλ¦½λ‹ˆλ‹€.
Bus 없이:
Bus μ‚¬μš©:

λ©€ν‹° μŠ€ν† μ–΄ μ„€μ •

μš©λ„μ— 따라 μ—¬λŸ¬ μŠ€ν† μ–΄λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

μŠ€ν† μ–΄ μ‚¬μš©ν•˜κΈ°

λ°μ½”λ ˆμ΄ν„°μ—μ„œλ„ μŠ€ν† μ–΄ μ§€μ • κ°€λŠ₯:

μ‹€μ „ 예제

1. 단일 μ„œλ²„ (λ©”λͺ¨λ¦¬λ§Œ)

μ ν•©ν•œ 경우:
  • 단일 μ„œλ²„ 운영
  • μΊμ‹œ μž¬μƒμ„±μ΄ 빠름
  • μ„œλ²„ μž¬μ‹œμž‘μ΄ λ“œλ¬ΌμŒ

2. 닀쀑 μ„œλ²„ (Redis 곡유)

μ ν•©ν•œ 경우:
  • λ‘œλ“œ λ°ΈλŸ°μ„œ + μ—¬λŸ¬ μ„œλ²„
  • μ„œλ²„ κ°„ μΊμ‹œ 곡유 ν•„μš”
  • μ„œλ²„ μž¬μ‹œμž‘ 후에도 μΊμ‹œ μœ μ§€

3. 계측별 μ„€μ • (μ„±λŠ₯ μ΅œμ ν™”)

λ“œλΌμ΄λ²„ μ˜΅μ…˜ 상세

Memory Driver

크기 λ‹¨μœ„: "10kb", "5mb", "1gb" λ˜λŠ” λ°”μ΄νŠΈ 수(1024)

Redis Driver

File Driver

Knex Driver

ν…Œμ΄λΈ” μŠ€ν‚€λ§ˆ (μžλ™ 생성):

Redis Bus Driver

ν…ŒμŠ€νŠΈ ν™˜κ²½

ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œλŠ” μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬ λ“œλΌμ΄λ²„κ°€ μ‚¬μš©λ©λ‹ˆλ‹€:
λ‚΄λΆ€ κ΅¬ν˜„:

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

μΊμ‹œ μ„€μ • μ‹œ μ£Όμ˜μ‚¬ν•­:
  1. λ©”λͺ¨λ¦¬ μ œν•œ: maxSizeλ₯Ό λ„ˆλ¬΄ 크게 μ„€μ •ν•˜λ©΄ OOM(Out of Memory) λ°œμƒ κ°€λŠ₯
  2. Redis μ—°κ²° 곡유: Redis μΈμŠ€ν„΄μŠ€λŠ” driver와 busμ—μ„œ 같은 μΈμŠ€ν„΄μŠ€ μ‚¬μš©
  3. μŠ€ν† μ–΄ 이름 일치: λ°μ½”λ ˆμ΄ν„°μ˜ store μ˜΅μ…˜μ€ 섀정에 μ •μ˜λœ 이름과 μΌμΉ˜ν•΄μ•Ό 함
  4. Bus 없이 L2만 μ‚¬μš©: μ—¬λŸ¬ μ„œλ²„μ—μ„œ L2(Redis)만 μ‚¬μš©ν•˜λ©΄ L1이 λ™κΈ°ν™”λ˜μ§€ μ•ŠμŒ

λ‹€μŒ 단계

@cache λ°μ½”λ ˆμ΄ν„°

λ©”μ„œλ“œμ— μΊμ‹œ μ μš©ν•˜κΈ°

μΊμ‹œ λ¬΄νš¨ν™”

Tag 기반 μΊμ‹œ λ¬΄νš¨ν™”

μΊμ‹œ μ „λž΅

TTL, Grace, Namespace ν™œμš©