오늘은 Django를 활용해 ReviewComment와 ReviewLike 모델을 설계하며, 의사결정 과정과 주요 고려사항을 정리했습니다. ERD 구조를 기반으로 각 모델의 필드와 관계를 명확히 설정하고, 비즈니스 로직과 확장 가능성을 고려해 설계했습니다.
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"] # 생성 순서대로 정렬
리뷰와의 관계 설정:
on_delete=models.CASCADE
설정.유저와의 관계 설정:
SET_NULL
설정.정렬 기준:
ordering = ["created_at"]
설정.데이터 무결성:
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'] # 최신 좋아요 순서대로 정렬
리뷰와의 관계 설정:
on_delete=models.CASCADE
설정.유저와의 관계 설정:
중복 방지:
unique_together
설정.상태 관리:
is_active
필드를 통해 좋아요(1), 비추천(-1), 중립(0) 상태를 관리.정렬 기준:
ordering = ['-created_at']
설정.데이터 무결성 및 효율성:
이번 설계를 통해 Django ORM을 활용해 복잡한 비즈니스 로직을 모델로 구현하는 방법을 체계적으로 익혔습니다. ERD 구조를 기반으로 명확한 관계와 필드 설정이 중요하며, 데이터 무결성과 확장 가능성을 고려한 설계가 향후 유지보수와 성능 최적화에 큰 도움이 된다는 점을 다시 한번 깨달았습니다.