1차 캐싱 적용 이후 실제 운영 환경에서 QA를 진행하던 중 콜드스타트(Empty Cache) 문제가 발생하였다.
초기 조회 시 트윗이 없을 경우, 빈 캐시가 TTL 동안 유지되어 신규 트윗이 반영되지 않는 현상이 확인되었는데,
이는 since_id 기반 비교 로직이 “LastId 없음(null)” 상태를 올바르게 처리하지 못해 전체 갱신이 생략되는 것이 원인이었다.
👀 What I Faced
- 초기 조회 시 0건인 상태 → 빈 캐시 저장
- 15분 내 새 트윗이 생성되어도 search/recent 호출 시 hasNew=false 로 판단
- 캐시 만료 전까지 계속 0건 반환
- TTL 만료 후 /users/:id/tweets 전체 조회 시점에서야 데이터 갱신
🧩 Root Cause / Theory
- 캐싱 로직이 “빈 캐시 + LastId 없음(null)” 상태를 정상적으로 처리하지 못함
- 이로 인해 since_id 비교에서 항상 “신규 없음”으로 인식 → 전체 조회 생략
- 결과적으로 0건 상태가 TTL이 끝날 때까지 유지됨
🧰 How I Solved / How I Learned
1️⃣ 캐싱 시간 조정
- 첫 조회 시 /users/:id/tweets 결과의 TTL: 15분 → 10분 단축
- 콜드스타트 상태에서 더 빠르게 재검증 가능하도록 수정
2️⃣ 확인 로직 개선
- 캐시 없음: /users/:id/tweets 전체 조회 후 캐시 생성
- 캐시 있음: /search/recent 로 신규 여부 확인
- 신규 없음 → 캐시 그대로 반환
- 신규 있음 → 병합 후 캐시 갱신
- 오류(400 이상)
- /search/recent 재조회 후 캐싱
- data 가 비어있어도 [] 로 반환 (null 방지)
- 프론트에서도 빈 리스트 바인딩 지원
⚙️ Caching Strategy
- TTL: 10분
- Key: tw:media:{userId}:{fromYmd}:v1
- 정책: Cache-Aside + Fallback + Negative Caching
- 에러 대응: 400 이상 시 재조회, 429 시 캐시 리턴 유지
🧪 Test & Verification
- 로컬 환경에서 정상 갱신 확인
- 콜드스타트 이후 5분 내 신규 트윗 반영 확인
📋 Results
- “빈 캐시 유지” 문제 해결
- 신규 트윗 생성 시 10분 내 반영
- TTL 단축으로 캐시 재검증 주기 개선
🔍 Key Takeaways
- 캐싱 구조 설계 시 “빈 상태(empty)”도 만료 주기를 가져야 함
- since_id 비교 로직에 “기준 없음(null)” 상태를 명시적으로 처리해야 함
- TTL 단축 + fallback 처리로 실시간성 확보
🧾 References / Links
- Twitter API v2 Docs
- Redis / InMemory Cache TTL 전략
🧭 Reflection
- 삭제된 트윗 캐시 처리 필요
- 다중 캠페인 조회 시 캐시 충돌 방지 로직 보완
- 장기 등록 캠페인(>7일) 구간별 조회 로직 추가 검토
- 캐싱 정책 추가 검토
✍️ Afterthoughts
이번 프로젝트를 진행하면서, 국내외 여러 서비스들의 SNS 연동 구조를 꽤 많이 들여다봤다.
그중에서도 국내 서비스들은 Twitter 연동이 거의 없다는 걸 새삼 깨달았다.
진심으로 이유가 이런 Rate Limit 문제 때문이 아닐까 싶었다. 😅
Twitter API는 다른 API들과는 뭔가 다르다.
처음 포스트맨으로는 요구하는것도 없이 너무 간단하게 보였는데...까다롭 API 원탑 드립니다
덕분에 캐싱도 새로 도입하고, 레이트리밋을 모델링하고, 스테일 캐시를 직접 돌려보는 등 좋은 경험을 했다.^^... 다 네 덕이야🤬
솔직히 국내 서비스였다면
“Twitter 연동은 나중에 붙이죠...”
라고 제안했을지도 모르겠다.
하지만 해외 사용자를 대상으로 하는 서비스니까, 이건 피할 수 없는 과정이었고, 결국 또 하나의 큰 경험이 되었다.
잘될 거다.... 잘 돼야 한다.....
잘 되게 해주세요.....
'개발일지 > 개발로그 (실무)' 카테고리의 다른 글
| X(Twitter) API 캐싱 도입 (1편) (0) | 2025.11.04 |
|---|