diff --git a/src/kbo/CACHING.md b/src/kbo/CACHING.md index 47c08c4..7fd7160 100644 --- a/src/kbo/CACHING.md +++ b/src/kbo/CACHING.md @@ -61,14 +61,16 @@ KBO 외부 API 호출을 줄이기 위한 3계층 캐시 구조를 정리한다. ## 2. 게임센터 — 메모리 캐시 (10초) ### 저장 -Functions 인스턴스의 `Map`. +Functions 인스턴스의 `Map` (`lib/memCache.ts`의 `MemCache`). - 키: `${date}|${series}|${league}` - TTL: 10초 -- 사이즈 cap: 100개 (초과 시 가장 오래된 항목 evict) +- 사이즈 cap: **미설정**. `gameListService`는 `new MemCache(10_000)`로 `maxSize`를 주지 않는다. + 만료 항목은 `set()` 시 정리되지만 동시 보관 개수 상한은 없다(키 카디널리티 = 날짜×시리즈×리그로 작아 사실상 무해). + 상한이 필요하면 `MemCache` 생성자 2번째 인자로 `maxSize`를 전달하면 LRU-ish evict가 켜진다. ### 조회 흐름 -1. `memGet(key)` — TTL 이내면 즉시 반환 (Firestore/외부 API 호출 0) -2. 미스 → `fetchGameList()` 호출 → `memSet()` +1. `get(key)` — TTL 이내면 즉시 반환 (Firestore/외부 API 호출 0) +2. 미스 → `fetchGameList()` 호출 → `set()` (`getOrFetch`가 동일 키 동시호출도 coalesce) ### 특성 - **라이브 데이터 특성에 맞춘 짧은 TTL**. 10초 이내 재요청은 외부 호출 안 나감. @@ -76,8 +78,8 @@ Functions 인스턴스의 `Map`. - CLI는 서비스 레이어를 우회하므로 캐시 적용 안 됨 (HTTP `/kbo/games`만 적용). ### 메트릭 -`/metrics/gameListCache/{YYYYMMDD}/{hit|miss}` (RTDB). -`ServerValue.increment(1)`로 원자적 증가, fire-and-forget (오류 무시). +현재 hit/miss 메트릭은 구현되어 있지 않다(`/metrics/gameListCache/...` 미구현). +도입한다면 `ServerValue.increment(1)` 기반 fire-and-forget RTDB 카운터를 권장. ---