<aside> <img src="/icons/reorder_gray.svg" alt="/icons/reorder_gray.svg" width="40px" />

목차


</aside>

1. 문제 상황


<aside> 🛠

개요


경매 상세 조회 API(/auctions/{seq}/detail)를 호출할 때마다

DB의 조회수(view) 필드가 매번 증가하면서 다음과 같은 문제가 발생했다.

2. 원인 분석


<aside> 🛠

원인분석


원인 내용
중복 조회 제한 없음 동일 사용자의 반복 조회도 모두 view 증가 처리됨
TTL 미설정 Redis에 저장된 조회 key에 만료 시간이 없어서 한 번 등록되면
영구히 남음 or 아예 저장되지 않음
Redis Key 전략 미흡 사용자 구분을 위한 userId 또는 IP 기반 키 설계가 없었음
실시간 통계 요구 미반영 단순 카운터 증가 로직이 실시간 통계 목적에 비해 부적절했음
</aside>

3. 문제 해결 의사결정


<aside> 🛠

문제 해결


선택지 설명 최종 결정
사용자 기반 조회 캐시 사용자별로 조회 여부를 기록해 중복 차단 ✅ 적용
TTL 설정 (시간 제한) 일정 시간 내 동일 유저의 조회는 무시 ✅ 적용
Redis 저장 Key 구조 개선 view:auction:{auctionId}:user:{userKey} 구조로 명확하게 함 ✅ 적용
DB 조회수 직접 증가 제거 Redis로 중복 체크 후에만 DB 업데이트 수행 ✅ 적용
</aside>

4. 적용


<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>

5. 결과