개요

프로젝트를 진행하며, 조회수를 어떻게 적용할 지에 대해 회의를 했습니다.

요구 사항 중에 인기 순으로 게시물을 나열하는 기능이 있기 때문에 게시물 별로 조회수를 측정하기로 결정하였습니다.

조회수를 측정하는 방법에는 아래와 같이 여러가지가 있었습니다.

여러 방법 중에서 저희 팀은 조작되지 않은 순수 조회수를 얻기 위해 IP 검증을 이용한 Redis 저장 방식으로 조회수를 측정하기로 선택했습니다.

검증 방법

구현

Version1

처음 시도 했던 흐름은 중복 접근 체크를 한 뒤에 조회수를 바로 증가 시켜주는 방법이었습니다.

Untitled

위 방법은 매번 조회수를 증가 시키는 쿼리를 날려야 하기 때문에 DB I/O과정에서 부하가 걸립니다.

@Transactional
public GuideRes getGuide(Long id, String ipAddress){
    Guide guide = guideRepository.findById(id).orElseThrow(() -> new NotFoundException(NOT_FOUND_GUIDE));
    if(!isDuplicateAccess(ipAddress, guide.getId())) {
        guide.increaseViewCount();
    }
    return GuideRes.of(guide);
}

private boolean isDuplicateAccess(String ipAddress, Long guideId) {
    ValueOperations<String, Object> redisRepository = redisTemplate.opsForValue();
    if(redisRepository.get(ipAddress + "_" + guideId) == null) {
        redisRepository.set(ipAddress + "_" + guideId, "TRUE");
        return false;
    }
    return true;
}