2 Commits

Author SHA1 Message Date
89e817206b Clamp future schedule cache TTL to the target day
- 모레 이후 일자의 TTL 이 7일 고정이라, 2~7일 앞서 캐시된 날짜가 경기 당일과
  그 이후까지 "경기 전" 스냅샷을 계속 내놓았다
- TTL 은 쓰는 시점의 미래 거리로만 정해지고 시간이 흘러도 재평가되지 않으므로,
  해당 날짜 00:00 을 넘지 않도록 잘라 경기 당일에는 반드시 다시 받아오게 한다.
  이후로는 '오늘'/'과거' 분기가 실제 진행 상태에 맞는 TTL 을 다시 매긴다
- 실제 사고: 07-27 에 담긴 08-01 스냅샷이 7일 TTL 로 08-03 까지 살아남아,
  폭염취소된 NC 경기가 달력에서 계속 scheduled 로 보였다
- dayTtlMs 를 export 하고 fake timer 기반 회귀 테스트 8건 추가
- 함수 주석의 TTL 표를 실제 동작대로 다시 적었다 (기존 "본 모듈 상단의 표
  참조" 는 존재하지 않는 표를 가리키고 있었다)
2026-08-03 14:54:03 +09:00
ed573a81e0 Cache games by date and invalidate on writes
- gameRepository에 날짜 키 공유 캐시(MemCache, 15초) 추가 — 날짜별 경기 목록은 유저 독립 전역 데이터라 요청 간 공유할 수 있다. GET /prediction/games가 요청마다 range 쿼리를 재발행하던 것을 인스턴스당 분당 수 회로 수렴시킨다
- games 문서 쓰기 경로에 무효화 연결: syncGamesForMonth는 여러 날짜에 걸치므로 전량 폐기, forceSyncDay는 해당 날짜만
- createGameDayCache가 공유 캐시를 경유하도록 변경 — 요청마다 새로 만드는 짧은 수명 인스턴스도 실제 쿼리를 유발하지 않는다
- predictionHandlers의 games 분기에 Cache-Control public max-age=15 추가(무인증·전 유저 공통 응답이라 CDN·브라우저 중복 제거가 가능한데 그동안 헤더가 없었다)
- MemCache.getOrFetch가 truthy 대신 히트 여부로 판정하도록 수정 — 캐시된 null이 미스로 취급돼 fetcher가 매번 재실행되던 문제(존재하지 않는 상품 조회가 요청마다 Firestore read 유발)
- MemCache에 peek·clear 추가, 단위 테스트 6건 신설
2026-07-27 13:25:59 +09:00