Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kkumi 118/feature/#73/likes #74

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from
Open

Conversation

eekrwl
Copy link
Member

@eekrwl eekrwl commented Nov 11, 2024

구현내용

1. 포스트 좋아요/취소

Likes 테이블 생성했습니다.
post_id, user_id, is_deleted 등이 column으로 있습니다.
특정 유저가 특정 포스트에 좋아요와 취소를 반복할 때, DB에 여러 row가 생겼다가 없어지는 것이 싫어서 is_deleted를 추가했습니다.
각 상황별 동작은 아래와 같습니다.

  1. 유저가 포스트에 좋아요를 처음 눌렀을 때, row가 생생
  2. 유저가 포스트에 좋아요 취소를 눌렀을 때, is_deleted=true
  3. 유저가 좋아요 취소했던 포스트에 다시 좋아요를 눌렀을 때, is_deleted=false

2. 포스트 조회 시 좋아요 개수 추가

포스트 조회 시 좋아요 개수도 함께 조회되도록 했습니다.
좋아요 개수는 일단 likes 테이블에서 select count(*)하여 가져옵니다. 후에 post 테이블의 like_count를 만들어 like_count만으로 가져올 생각입니다.
현재 구현되어 있는 방식은 아래와 같습니다.

  1. Redis에 해당 post의 좋아요 개수가 캐싱되어 있는지 확인
    2-1. 캐싱되어 있다면 그대로 리턴
    2-2. 캐싱되어 있지않다면 DB에서 select count(*) 하여 조회 후 PostLikeCountCacheMissEvent 발생시켜 Redis에 해당 post의 좋아요 개수 추가

3. 포스트 조회 시 현재 로그인한 유저가 좋아요 눌렀는지 여부 추가

좋아요 눌렀는지 여부를 "likedByCurrentUser": false와 같이 내려줬습니다.

고민사항

1. 좋아요 개수 조회시 캐시miss 났을 때, DB 접근 횟수

현재 좋아요 개수 조회시 Redis Cache miss가 났을 때, post 여러개 조회중이었다면 DB에 여러번 접근합니다.
Cache miss가 난 포스트들을 모아서 한번에 DB에 접근하는게 더 나을지 고민입니다.

2. 좋아요 개수 post의 like_count

좋아요 개수는 현재 likes 테이블에서 select count(*)로 조회되고 있지만, post테이블에 like_count를 만들어서 개수를 세도록 변경할 예정입니다.
이때 좋아요 개수가 하나 변할때마다 DB에 접근하지 않고 모아서 몇초마다 한번 씩 반영하는 식으로 만들려고 합니다.
저번에 ConcurrentHashMap을 이야기해주셨는데, 서버가 여러대인 환경에서 같은 post의 좋아요도 각서버별로 저장했다가 여러번 DB에 반영하게 되는 것은 아닐지 고민입니다.
이 부분도 Redis를 사용해서 모든 서버가 하나의 Redis에 좋아요 개수를 관리하고 한번에 업데이트할까 고민했는데, 그러면 서버가 여러대인 경우에 어떤 서버가 좋아요 개수를 DB에 업데이트해야하는지도 잘 모르겠어서 고민입니다.

eekrwl added 9 commits October 3, 2024 11:25
좋아요 누르는 기능만 추가
post_id, user_id로 unique 제약조건을 추가했습니다.
유저가 게시글에 좋아요를 처음누른다면 생성되고, 취소한다면 isDeleted가 true로 변하고, 다시 좋아요를 누르면 isDeleted가 false로 변하도록 했습니다.
눌렀다가 취소했다가를 빠르게 반복할 수 있기에 매번 생성되고 삭제되지 않도록 만들었습니다.
좋아요 누르거나 취소시 낙관적락으로 동시성 처리
맨처음 특정 유저가 특정 포스트에 여러기기로 좋아요 누르는 경우는 unique 제약조건으로 처리
기존: 500 서버 에러로 내려감
변경후: postId가 null이면 안된다는 메시지 내려감
무한 스크롤 중, 현재 유저가 좋아요 누른 상태인지 확인하여 내려주는 코드 추가
likedByCurrentUser에 true, false로 제공함
포스트 좋아요 개수 캐싱을 위한 Redis 설정 추가
포스트에 좋아요 개수를 조회하는 부분 구현, 한번 조회됐던 좋아요개수는 30초간 캐싱되도록 함
흐름은 아래와 같습니다.
1. Redis에서 post의 좋아요 개수 조회
2-1. Redis에 존재하면 바로 리턴
2-2. Redis에 존재하지 않으면 DB에서 조회 후 PostLikeCountCacheMissEvent 발생시켜 Redis에 캐싱되도록 함
@eekrwl eekrwl added the enhancement New feature or request label Nov 11, 2024
@eekrwl eekrwl requested a review from babjo November 11, 2024 08:13
@eekrwl eekrwl self-assigned this Nov 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant