# 어제 무엇을 했나요?
- 1. exception_handler 추가
- 에러메세지 출력 형식 통일
- 2. 리뷰 등록 api 구현
# 오늘은 무엇을 할 것인가요?
- 1. 리뷰 조회 api 구현 및 "좋아요" 기능 추가
- 2. ai 요약 시스템 기본틀 잡기
# 진행하는데 어려운 부분(도움이 필요한 부분)이 있나요?
- 1. 멘토님의 지시대로 스웨거에 api를 정리해서 연결시켜 놨는데 이 방식대로 하면 코드작성에 따라 자동으로 스웨거 생성이 안됨 해결이 필요할 듯
오늘 학습 내용 ✅
"좋아요"기능

- 목표
- 처음 "좋아요" 버튼을 눌렀을 때, "좋아요"처리
- "좋아요" 버튼을 다시 눌렀을 때, "좋아요"취소
- "좋아요"는 Many-to-Many 관계
- 한 명의 유저(User)가 여러 리뷰에 좋아요를 누를 수 있음
- 하나의 리뷰(Review)가 여러 유저에게 좋아요를 받을 수 있음
- 현재 내 코드의 ReviewLike라는 중간테이블 존재
ReviewLike
from django.db import models
from apps.community.models.reviews import Review
from apps.user.models.user import User
class ReviewLike(models.Model):
"""
댓글(리뷰) 투표/좋아요 테이블
"""
review = models.ForeignKey(
Review,
on_delete=models.CASCADE,
related_name="likes",
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name="liked_reviews",
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name="생성된 날짜")
class Meta:
db_table = "review_like"
constraints = [
models.UniqueConstraint(
fields=["review", "user"], name="uk_review_like_user"
)
]
내 코드 기준
직접 중간테이블 설계
- 동시성 문제를 방지 가능
- 누가 언제 좋아요를 눌렀는지 관리 가능
- "좋아요취소" 로직을 명확하게 제어 가능
like_count (Review 모델 컬럼)
- annotate로 ReviewLike테이블의 개수를 count로 세는것도 가능
- Review 모델에 like_count 컬럼을 두고, 좋아요 액션이 일어날 때마다 +1 또는 -1
select_for_update()
- DB 레벨에서 해당 Review 행(Row)을 잠굼
- 트랜잭션이 끝날 때까지 다른 요청이 이 리뷰의 like_count를 수정하지 못하게 막음
total_likes
- 단순히 +1을 하는 것보다, 서버가 계산 완료한 total_likes를 받아서 덮어씀
- 네트워크 지연 등으로 인한 화면과 서버의 데이터가 달라지는것을 방지하기 위함
새롭게 알게된 내용 ✅
오늘 발생한 문제(발생 했다면) ✅