<aside> <img src="/icons/reorder_gray.svg" alt="/icons/reorder_gray.svg" width="40px" />
목차
</aside>
<aside> 🛠
경매 상세 조회 API(/auctions/{seq}/detail
)를 호출할 때마다
DB의 조회수(view) 필드가 매번 증가하면서 다음과 같은 문제가 발생했다.
<aside> 🛠
원인 | 내용 |
---|---|
중복 조회 제한 없음 | 동일 사용자의 반복 조회도 모두 view 증가 처리됨 |
TTL 미설정 | Redis에 저장된 조회 key에 만료 시간이 없어서 한 번 등록되면 |
영구히 남음 or 아예 저장되지 않음 | |
Redis Key 전략 미흡 | 사용자 구분을 위한 userId 또는 IP 기반 키 설계가 없었음 |
실시간 통계 요구 미반영 | 단순 카운터 증가 로직이 실시간 통계 목적에 비해 부적절했음 |
</aside> |
<aside> 🛠
선택지 | 설명 | 최종 결정 |
---|---|---|
사용자 기반 조회 캐시 | 사용자별로 조회 여부를 기록해 중복 차단 | ✅ 적용 |
TTL 설정 (시간 제한) | 일정 시간 내 동일 유저의 조회는 무시 | ✅ 적용 |
Redis 저장 Key 구조 개선 | view:auction:{auctionId}:user:{userKey} 구조로 명확하게 함 |
✅ 적용 |
DB 조회수 직접 증가 제거 | Redis로 중복 체크 후에만 DB 업데이트 수행 | ✅ 적용 |
</aside> |
<aside> 🛠
Redis Key 구조 예시
view:auction:{auctionId}:user:{userId or IP}
TTL 설정 (Java 예시)
String redisKey = "view:auction:" + auctionId + ":user:" + userKey;
Duration ttl = Duration.ofMinutes(60); // 1시간 동안 동일 사용자 중복 차단
if (!redisService.isViewedRecently(redisKey)) {
auction.increaseViews(); // 실제 DB update
redisService.markViewed(redisKey, ttl); // 캐시 저장
}
</aside>