Django ReviewComment와 ReviewLike 모델 설계 시 의사결정 과정

2star_·2025년 1월 5일
0

최종 프로젝트

목록 보기
7/32

Django 모델 설계 시 의사결정 과정 - ReviewComment와 ReviewLike 모델 사례

오늘은 Django를 활용해 ReviewCommentReviewLike 모델을 설계하며, 의사결정 과정과 주요 고려사항을 정리했습니다. ERD 구조를 기반으로 각 모델의 필드와 관계를 명확히 설정하고, 비즈니스 로직과 확장 가능성을 고려해 설계했습니다.


1. 리뷰 댓글 (ReviewComment) 모델 설계

📌 주요 필드 설계:

class ReviewComment(models.Model):
    review = models.ForeignKey(
        Review,
        on_delete=models.CASCADE,  # 리뷰 삭제 시 댓글도 삭제
        related_name="comments"
    )
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,  # 유저 삭제 시 댓글 작성자는 "알수없음"으로 표시
        null=True,
        blank=True,
        related_name="review_comments"
    )
    content = models.TextField()  # 댓글 내용
    created_at = models.DateTimeField(auto_now_add=True)  # 댓글 생성 시간
    updated_at = models.DateTimeField(auto_now=True)  # 댓글 수정 시간

    def __str__(self):
        return f"Comment by {self.user.nickname if self.user else '알수없음'} on Review {self.review.id}"

    class Meta:
        ordering = ["created_at"]  # 생성 순서대로 정렬

의사결정 이유:

  1. 리뷰와의 관계 설정:

    • 댓글은 특정 리뷰와 연결되며 Many-to-One 관계를 가짐.
    • 리뷰 삭제 시 해당 댓글도 함께 삭제되도록 on_delete=models.CASCADE 설정.
  2. 유저와의 관계 설정:

    • 댓글 작성자가 삭제된 경우에도 댓글 데이터는 유지하기 위해 SET_NULL 설정.
    • 삭제된 유저는 "알수없음"으로 표시.
  3. 정렬 기준:

    • 댓글은 작성된 순서대로 표시하기 위해 ordering = ["created_at"] 설정.
  4. 데이터 무결성:

    • 댓글 작성자와 내용은 필수로 입력되도록 설계했으며, 유저가 삭제된 경우에도 데이터 손실을 최소화함.

2. 리뷰 좋아요 (ReviewLike) 모델 설계

📌 주요 필드 설계:

class ReviewLike(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,  # 유저가 삭제되면 좋아요 기록도 삭제
        related_name="review_likes"
    )
    review = models.ForeignKey(
        Review,
        on_delete=models.CASCADE,  # 리뷰가 삭제되면 좋아요 기록도 삭제
        related_name="likes"
    )
    is_active = models.IntegerField(
        choices=[
            (1, "좋아요"),
            (-1, "비추천"),
            (0, "중립")  # 기본값
        ],
        default=0  # 기본 상태는 중립
    )
    created_at = models.DateTimeField(auto_now_add=True)  # 생성 시간
    updated_at = models.DateTimeField(auto_now=True)  # 상태 변경 시간

    def __str__(self):
        return f"Review {self.review.id} - Liked by {self.user.nickname if self.user else 'Unknown'} ({'좋아요' if self.is_active == 1 else '비추천' if self.is_active == -1 else '중립'})"

    class Meta:
        unique_together = ('user', 'review')  # 유저-리뷰 조합 중복 방지
        ordering = ['-created_at']  # 최신 좋아요 순서대로 정렬

의사결정 이유:

  1. 리뷰와의 관계 설정:

    • 특정 리뷰에 대한 좋아요 또는 비추천 상태를 저장하기 위해 Many-to-One 관계로 연결.
    • 리뷰 삭제 시 관련된 좋아요 기록도 삭제되도록 on_delete=models.CASCADE 설정.
  2. 유저와의 관계 설정:

    • 좋아요/비추천 상태는 특정 유저와 연결되며, 유저 삭제 시 관련 기록도 함께 삭제됨.
  3. 중복 방지:

    • 동일 유저가 동일 리뷰에 대해 여러 개의 좋아요를 남길 수 없도록 unique_together 설정.
  4. 상태 관리:

    • is_active 필드를 통해 좋아요(1), 비추천(-1), 중립(0) 상태를 관리.
    • 기본값을 중립(0)으로 설정해 명시적으로 상태 변경 가능.
  5. 정렬 기준:

    • 최신 좋아요 상태가 상단에 표시되도록 ordering = ['-created_at'] 설정.
  6. 데이터 무결성 및 효율성:

    • 유저와 리뷰 간 관계를 명확히 하여 데이터 무결성을 유지.
    • 추후 캐싱을 도입해 좋아요/비추천 수를 빠르게 집계 가능.

3. 비즈니스 로직과 확장 가능성

📌 댓글 관리:

  • 댓글 작성자를 "알수없음"으로 유지하며 데이터 손실 방지.
  • 댓글 작성 및 수정 시간을 기록해 최신 댓글 표시 기능 구현 가능.

📌 좋아요 관리:

  • 좋아요와 비추천 상태를 함께 관리해 데이터 중복을 방지하고 무결성을 유지.
  • 중립 상태를 추가해 명확한 상태 변경 로직 구현.
  • 추후 Redis와 같은 캐시를 활용해 리뷰의 좋아요/비추천 집계를 효율적으로 수행 가능.

이번 설계를 통해 Django ORM을 활용해 복잡한 비즈니스 로직을 모델로 구현하는 방법을 체계적으로 익혔습니다. ERD 구조를 기반으로 명확한 관계와 필드 설정이 중요하며, 데이터 무결성과 확장 가능성을 고려한 설계가 향후 유지보수와 성능 최적화에 큰 도움이 된다는 점을 다시 한번 깨달았습니다.

profile
안녕하세요.

0개의 댓글

관련 채용 정보