드랍 조회수는 애플리케이션 메모리 카운팅 대신 Redis 중복 방지 키(SETNX + TTL) 와 DB 원자 증가 쿼리를 결합해, 고트래픽에서도 중복 카운트를 억제하고 DB 업데이트 부하를 줄였다.
드랍 상세 페이지는 오픈 직전/직후 트래픽이 몰리며, 같은 사용자의 반복 조회가 많다.
요청마다 DB view_count를 증가시키면:
drop:view:{dropId}:{viewerIdentifier}viewerIdentifier:emailip + userAgent를 SHA-256 해시setIfAbsent(key, "1", TTL) 성공 시에만 "첫 조회"로 간주현재 TTL 값:
dropshop.drops.view-count-ttl-seconds = 600(기본 10분)
즉, 기본 설정에서는 동일 식별자가 10분 내 재조회해도 1회만 카운트된다.
엔티티를 로드/저장하지 않고 원자 쿼리로 직접 증가:
update Drops d
set d.viewCount = d.viewCount + 1
where d.id = :dropId
읽기-수정-쓰기 경쟁을 줄이고 DB 부하를 낮춘다.
흐름은 다음과 같다:
① Redis SETNX 성공
② DB 증가 쿼리 수행
③ DB 증가 실패 시 → catch 블록에서 Redis 키 delete 수행 (수동 롤백)
즉, Redis 롤백은 트랜잭션 이벤트 리스너가 아니라 예외 처리(catch) 기반 수동 delete로 처리한다.
@Transactional 범위에서 수행현재 구현은 Fail-Close에 가깝다.
Redis 처리(SETNX)에서 예외 발생 시:
| 내용 | |
|---|---|
| 장점 | 중복 폭주/오염 카운트 방지 |
| 단점 | Redis 장애 구간에서 조회수 과소집계 가능 |