Published on

무한 댓글 시스템(aka 대댓글) 구축하기 Django와 PostgreSQL 활용

Authors

웹 애플리케이션에서 댓글 시스템은 웹개발씬에서 자주 거론되는 기능 입니다. 특히, 댓글의 댓글, 댓글의 댓글의 댓글 등 무한하게 확장될 수 있는 댓글 시스템을 구축하는 것은 많은 개발자에게 생각할 점을 남겨 줍니다. 이 글에서는 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을 사용하면, 무한 댓글 시스템을 효과적으로 구현할 수 있습니다. 자기 참조를 사용한 모델 설계와 재귀적 쿼리를 통해 사용자들이 서로 상호작용할 수 있는 강력한 댓글 시스템을 만들 수 있습니다. 다만, 성능과 깊이 관리에 주의를 기울여야 합니다.

hongreat 블로그의 글을 봐주셔서 감사합니다!