좋아요 갯수 데이터 정합성 어떻게 해결할까?

딩딩당당·2022년 12월 16일
1

이번 미니 프로젝트에서 게시글 좋아요를 맡게 되었는데 저번주 협업 프로젝트에서도 나왔던 주제이다. 게시글 테이블에 좋아요 갯수를 표시하는 컬럼을 추가했을 때 좋아요 요청이 한번에 몰려서 온다면? 게시글 테이블에 좋아요 갯수와 실제 좋아요 갯수의 데이터 정합성이 깨질 가능성이 있다.

이를 해결하려면 어떤 방법이 있을까?

Native Query

좋아요 요청이 왔을 때 현재 게시글의 좋아요 개수를 불러와 거기에 +1을 해준 뒤 저장하는 방법이 있을 것이다.
해당 방법은 분명 정합성은 지켜질 것이지만.... 원래는 좋아요를 저장하는 쿼리만 날리던 반면에 좋아요 개수까지 조회하는
쿼리문도 날려야한다. 정합성은 깨지지 않지만 서버에 무리가 많이 갈 가능성이 있다.

Lock

조회 쿼리에 락을 걸어 데이터 정합성을 맞추는 것이다. A 트랜잭션이 likecount 를 변경하는 업데이트 작업을 하고 커밋을 할 때 까지 B 트랜잭션은 likecount에 대한 조회에 대한 접근을 할 수 없다. 결과적으로 A 트랜잭션이 커밋 되고 나서 B 트랜잭션은 likecount를 얻기 때문에 정확한 likecount 데이터에서 1을 더하게 된다 때문에 데이터 정합성이 깨질 일을 방지할 수 있다.

Scheduled

@Scheduled 어노테이션을 활용해 주기적으로 좋아요 개수의 싱크를 맞춰주는 방법이다. 주기적으로 맞춰주기 때문의 당장의 서버 무리는 가지 않을 것이다.
하지만 이건 게시글의 개수가 적을 경우이고 게시글이 많아진다면 아무리 주기적으로 싱크를 맞춰준다 한들 각각의 게시글 좋아요의 개수를 조회해서 정합성이 깨진 개수를 맞춰줘야하기 때문에 스케줄로 싱크를 맞출 주기가 왔을 때 문제가 생기지 않을지 생각된다. 실제로 이 때문에 유튜브에서도 좋아요 개수를 정확히 표시하지 않는 것 같다.

profile
자바공부해요흑흑

1개의 댓글

comment-user-thumbnail
2023년 1월 3일

멋져요

답글 달기