Spring/Issue

레디스와 스케쥴러를 이용한 조회수 증가

블로그 주인장 2024. 1. 3.

Issue

이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션(Session)을 사용했다.

https://miiro-under.tistory.com/260

 

조회수 기능 구현하기 - 중복 방지(Session)

Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션 쿠키(Session-Cookie)를 사용했다. https://miiro-under.tistory.com/259 조회수 기능 구현하기 - 중복 방지(Cookie) Issue 커뮤니티 서비스를 구현

miiro-under.tistory.com

 

현재 로직의 경우 게시글을 조회할 때마다 DB에 조회수를 증가하는 카운팅을 쓰는 작업을 수행하고 있습니다.

 

하지만 조회수만 증가를 시키는 게 목적인데, 요청마다 테이블을 조회해서 불필요한 쿼리연산이 발생됩니다.

 

이를 해결하기 위해서 조회수를 Redis에 저장한 다음

일정 시간이 되면 Spring Scheduler를 이용해서 특정 주기마다 DB에 반영해보겠습니다.

 

 

Redis에 대한 정보는 이전 포스팅을 참고하시면 됩니다.

https://miiro-under.tistory.com/255

 

[Redis] 레디스란 무엇인가?

Redis(Remote Dictionary Server) Redis는 Remote(원격)에 위치하고 프로세스로 존재하는 In-Memory 기반의 Dictonary(key-value) 구조 데이터 관리 시스템이다. 여기서 key-value 구조 데이터란? mysql과 같은 관계형 데이

miiro-under.tistory.com

 

 

Redis를 통한 조회 수 증가

 

기존 로직에 비교해서 현재 로직이 달라진 부분은 데이터를 증가하는 부분입니다.

기존에는 post.increseView() 라는 메서드에서 카운팅을 진행했다면 현재는 redis에 데이터를 저장하는 방식으로 변경이 되었습니다.

 

redisSevice.increaseData() 에 대해 자세하게 확인해보겠습니다.

 

redisTemplate를 이용하여 해당 key 값이 존재하면 key의 value 값을 redis의 incr 명령어를 통해 증가시킵니다.

만약에 해당 key 값이 존재하지 않는다면 자동으로 1로 초기화가 됩니다.

 

Scheduler를 통한 DB 반영하기

Spring Scheduler 활성화

해당 어플리케이션에 @EnableScheduling 어노테이션을 추가해줍니다.

 

코드 작성

 

redisSevice에 VIEW_PREFIX 라는 키값을 가진 모든 키를 조회합니다.

 

조회한 다음 null이 아니면 키에 해당하는 게시글 ID와 viewCount를 받아옵니다.

 

그리고 해당 viewCount 데이터를 DB에 저장합니다.

 

 

@Scheduled 어노테이션을 활용해서 주기적으로 데이터에 반영되도록 만들었습니다.

여기서 사용한 @Scheduled(cron = "* * * * * *") 은 cron 표현식을 이용해서 작업을 예약하는 방식입니다.

@Scheduled(cron = "* * * * * *")

1번 * : 초(0-59) 
2번 * : 분(0-59) 
3번 * : 시간(0-23) 
4번 * : 일(1-31) 
5번 * : 월(1-12) 
6번 * : 요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토)

 

자세한 내용은 해당 링크를 참고하시면 됩니다. https://dev-coco.tistory.com/176

현재 프로젝트에서는 application.yml 파일을 활용하여 따로 분리해놓은 상태입니다.

해당 크론식에서 [ / ] 를 사용하여 5분마다 업데이트할 수 있도록 되어있습니다.

 

Scheduler 동작 방식

Scheduer를 기본적으로 하나의 쓰레드를 이용하여 동기 형식으로 처리가 됩니다.

하지만 비동기로 처리하고 싶은 경우에는 @Async 어노테이션을 사용하여 처리할 수 있습니다.

 

Redis + Scheduler 동작 확인

조회 시에 레디스에 저장된 데이터를 확인을 해보면 게시글 : ID 형식으로 저장된 것을 확인할 수 있습니다.

 

해당 키 값을 조회하면 현재 레디스에 저장되어 있는 조회수인 "8" 을 확인할 수 있습니다.

 

스케쥴러에 설정된 시간이 5분마다 update 쿼리가 수행되고, DB에 반영된 것을 확인할 수 있습니다.

 

 

한 줄 정리

Redis + Scheduler 를 이용해서 주기적으로 데이터를 DB에 저장하는 것을 구현해봤습니다.

쿼리를 전부 조회해서 하는 것보다 세부적으로 구현을 하면 불필요한 데이터를 지울 수 있다는 것을 알게되었습니다.

추가적으로 Redis와 Scheduler 를 이용해서 다른 코드도 리팩토링을 진행해보면 좋을 거 같습니다.

 

틀린점이 있거나 다른 부분으로 고쳐야할 게 있으면 댓글 남겨주세요!

반응형

댓글