From 14fd893ad4126a205a23085b4dd6ecb17ed03a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EC=A0=95=EB=AF=BC?= Date: Thu, 28 May 2026 17:35:15 +0900 Subject: [PATCH] Correct CACHING.md gameListCache drift (doc) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CACHING.md의 gameListCache 관련 잘못된 내용 정정 - 사이즈 cap(100개) 및 RTDB 메트릭 카운터 항목을 실제 코드 동작에 맞게 수정 --- src/kbo/CACHING.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) 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 카운터를 권장. ---