- Published on
무한 댓글 시스템(aka 대댓글) 구축하기 Django와 PostgreSQL 활용
- Authors
- Name
- hongreat
- ✉️hongreat95@gmail.com
웹 애플리케이션에서 댓글 시스템은 웹개발씬에서 자주 거론되는 기능 입니다. 특히, 댓글의 댓글, 댓글의 댓글의 댓글 등 무한하게 확장될 수 있는 댓글 시스템을 구축하는 것은 많은 개발자에게 생각할 점을 남겨 줍니다. 이 글에서는 Django, PostgreSQL을 사용하여 '자기참조'를 통해 무한 댓글 시스템을 구현하는 방법을 설명합니다.
모델 설계
먼저, Comment
모델(댓글)을 설계합니다. 이 모델은 자신에게 달린 댓글을 참조하기 위해 자기 참조 필드를 포함합니다. 또한, 각 댓글이 어떤 사용자에 의해 작성되었는지 추적하기 위해 User
모델과의 관계를 정의합니다.
from django.db import models
from django.contrib.auth.models import User
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
content = models.TextField()
# 기타 필드들...
데이터베이스 최적화
PostgreSQL을 사용하면, Common Table Expressions (CTE)를 통해 재귀적 쿼리를 구현할 수 있습니다. 이를 통해 특정 댓글에 연결된 모든 자식 댓글을 효율적으로 조회할 수 있습니다. 하지만, 깊이가 깊어질수록 성능에 주의해야 합니다.
API 설계
Django REST Framework를 사용하여 다음과 같이 API를 설계할 수 있습니다:
- 댓글 생성: 사용자가 댓글을 작성할 수 있는 API.
- 댓글 조회: 특정 댓글과 그 자식 댓글을 조회하는 API.
- 댓글 수정/삭제: 사용자가 자신의 댓글을 수정하거나 삭제할 수 있는 API.
ORM 사용 예시
Django ORM을 사용하여 다양한 댓글 관련 작업을 수행할 수 있습니다:
# 자식 댓글 조회
child_comments = Comment.objects.filter(parent=some_comment)
# 특정 댓글과 그 자식 댓글 모두 조회
from django.db.models import Q
all_related_comments = Comment.objects.filter(Q(id=comment.id) | Q(parent=comment))
# 상위 댓글 조회
def get_ancestors(comment):
ancestors = []
current = comment
while current.parent is not None:
ancestors.append(current.parent)
current = current.parent
return ancestors
ancestors = get_ancestors(comment)
결론
Django와 PostgreSQL을 사용하면, 무한 댓글 시스템을 효과적으로 구현할 수 있습니다. 자기 참조를 사용한 모델 설계와 재귀적 쿼리를 통해 사용자들이 서로 상호작용할 수 있는 강력한 댓글 시스템을 만들 수 있습니다. 다만, 성능과 깊이 관리에 주의를 기울여야 합니다.