2026/01/14 합동프로젝트 - 6

김기훈·2026년 1월 14일

TIL

목록 보기
111/194
# 어제 무엇을 했나요?
- 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를 받아서 덮어씀
      • 네트워크 지연 등으로 인한 화면과 서버의 데이터가 달라지는것을 방지하기 위함

새롭게 알게된 내용 ✅


오늘 발생한 문제(발생 했다면) ✅

profile
안녕하세요.

0개의 댓글