Redis 프로젝트 회고
실제 대규모 서비스에 Redis 캐시를 도입하면서 겪은 기술적 문제들과 해결 과정. 분산 캐시 동기화, 동시성 이슈, 대규모 장애 대응까지.
기본 RestTemplate의 ISO-8859-1 인코딩과 커스텀 ObjectMapper 미반영 문제를 직접 Primary Bean으로 등록해 해결한 과정을 기록합니다.
여기저기서 다른 규칙으로 만들어지던 Redis 키를 단일 진입점으로 강제해 정규화한 과정을 기록합니다.
ForkJoinPool.commonPool에 블로킹 I/O를 태워 발생한 스레드풀 고갈 현상을 CPU/IO 실행기 분리로 해결한 과정을 기록합니다.
캐시가 있음에도 초반 요청이 느린 아이러니를 WarmUp 비동기화, optionTTL 세분화, fastExpire 연계로 해결한 과정을 기록합니다.
외부 API에서 bnrSeq가 누락되거나 타입이 섞여 들어오는 케이스를 instanceof 타입 가드와 방어 로직으로 안전하게 처리한 과정을 기록합니다.
RedisFuture를 toCompletableFuture()로 브리지한 mget 비동기 체인에서 간헐적으로 발생한 complete() 예외를 분석하고, 브리지 제거와 명시적 타임아웃 처리로 해결한 과정을 기록합니다.
여러 Future에서 같은 객체 인스턴스를 공유하다 발생한 데이터 정합성 문제를 깊은 복사(Deep Copy)로 해결한 과정을 기록합니다.
로컬 Caffeine 캐시와 Redis 캐시를 병합 운영하던 중 발생한 인스턴스 간 캐시 불일치를 Redis Pub/Sub 무효화 이벤트로 해결한 과정을 기록합니다.
shopCode 기반 정적 properties 관리의 한계를 넘어, moduleCd와 Redis 헬스 응답을 기반으로 캐시 적용 여부를 런타임에 동적으로 판별하도록 개선한 과정을 기록합니다.
velocity 템플릿 직접 수정과 마케팅 프로모션 실수가 겹쳐 홈메인이 9분간 먹통이 된 배포 사고를 분석하고, 재발 방지 프로세스를 정리합니다.
개인화와 실시간성이 필요한 상품 상세 페이지에 풀 캐싱을 적용할 수 없는 이유를 분석하고, 데이터 성격에 따라 DB와 Redis를 혼합하는 STEP 기반 설계로 해결한 과정을 기록합니다.
프로젝트 종료 후 운영팀 배정 이후 겪은 운영 특화 문제들을 정리하고, Redis가 단순 캐시 솔루션이 아닌 서비스 성장의 핵심 인프라임을 깨달은 과정을 기록합니다.