[장고] 알림 앱: 사용자에게 새 댓글 알리기

소요 시간: 5분

이 글은 다음 글과 이어집니다.

  1. [장고] 알림 앱
  2. [장고] 알림 앱: 상단 네비게이션 바에 알림 메시지 추가하기

사용자가 작성한 글에 새로운 댓글이 달렸을 때만 알림을 생성하는 기능을 구현하기 위해서는 댓글 작성 시 게시물의 작성자를 기준으로 알림을 생성하도록 시그널을 수정해야 합니다.

아래에 그 방법을 설명합니다.


댓글 알림 기능

댓글 알림 기능은 웹사이트나 애플리케이션에서 사용자 상호작용을 강화하고 커뮤니티의 활발한 참여를 유도하는 중요한 역할을 합니다. 이 기능의 상세한 역할은 다음과 같습니다:

1. 즉각적인 피드백 제공

댓글 알림 기능은 사용자가 작성한 게시물이나 댓글에 다른 사용자가 새로운 댓글을 달았을 때 이를 실시간으로 알려줍니다. 이는 사용자가 자신의 의견이나 질문에 대한 반응을 즉시 확인할 수 있도록 하여, 대화의 흐름을 끊김 없이 이어가도록 합니다. 즉각적인 피드백은 사용자에게 자신의 참여가 가치 있음을 느끼게 하여, 지속적인 참여를 촉진합니다.

2. 사용자 참여 유도

댓글 알림은 사용자에게 지속적인 상호작용을 유도하는 도구로 작용합니다. 사용자가 자신의 게시물에 대한 댓글을 받을 때마다 알림을 받게 되면, 대화에 다시 참여하고 더 많은 정보를 공유하거나 토론을 이어가는 동기가 됩니다. 이는 커뮤니티의 활성화를 도모하고, 더 많은 사용자가 적극적으로 참여하도록 합니다.

3. 소셜 상호작용 강화

댓글 알림 기능은 사용자가 자신의 댓글에 대한 다른 사람들의 반응을 실시간으로 확인할 수 있게 하여, 소셜 상호작용을 강화합니다. 이는 사용자들 간의 관계 형성에 도움을 주며, 더 깊이 있는 대화를 가능하게 합니다. 또한, 알림을 통해 사용자들은 서로의 의견을 존중하고 공감할 수 있는 기회를 갖게 됩니다.

4. 사용자 만족도 증대

댓글 알림을 통해 사용자는 자신의 의견이 주목받고 있다는 느낌을 받을 수 있습니다. 이는 사용자 만족도를 높이는 중요한 요소로 작용합니다. 사용자가 자신의 참여가 인정받고 있다는 느낌을 받으면, 웹사이트에 대한 충성도가 강화되고, 지속적인 이용이 촉진됩니다.

5. 문제 해결 촉진

댓글 알림은 사용자가 제기한 질문이나 문제에 대한 답변이 달릴 때 이를 즉시 알려줍니다. 이는 문제 해결 시간을 단축시키는 데 큰 도움이 됩니다. 사용자가 빠르게 응답을 받을 수 있으면, 불편함을 최소화하고 만족스러운 경험을 제공할 수 있습니다.

6. 콘텐츠 품질 향상

활발한 댓글 상호작용은 콘텐츠의 품질을 향상시키는 데 기여합니다. 다양한 사용자들이 의견을 공유하고 피드백을 제공하면, 콘텐츠의 정확성, 유용성, 다양성이 증대됩니다. 이는 커뮤니티 내 지식 공유를 활성화하고, 더 나은 정보를 제공할 수 있는 기반을 마련합니다.

7. 사용자 재방문 유도

댓글 알림은 사용자가 웹사이트를 지속적으로 방문하도록 유도하는 중요한 요소입니다. 알림을 통해 사용자는 새로운 반응이나 정보를 확인하기 위해 자주 사이트를 방문하게 되며, 이는 웹사이트의 트래픽 증가로 이어집니다. 또한, 반복적인 방문은 사용자와 사이트 간의 관계를 더욱 공고히 합니다.

댓글 알림 기능을 효과적으로 활용하면, 사용자 간의 활발한 상호작용을 촉진하고, 커뮤니티의 참여를 높이며, 웹사이트의 이용 경험을 크게 향상시킬 수 있습니다.


새 댓글 알리기 코드

1. 시그널 수정

댓글이 생성될 때 게시물 작성자에게만 알림을 보내도록 시그널을 수정합니다. notifications 앱의 signals.py 파일을 다음과 같이 수정합니다.

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Notification
from forum.models import Comment  # Comment 모델은 포럼 앱에 있다고 가정

@receiver(post_save, sender=Comment)
def create_notification(sender, instance, created, **kwargs):
    if created:
        post_author = instance.post.author
        if instance.user != post_author:  # 댓글 작성자와 게시물 작성자가 다른 경우에만 알림 생성
            Notification.objects.create(
                user=post_author,
                message=f'New comment on your post "{instance.post.title}"'
            )

2. 모델 설정 확인

댓글과 게시물 모델이 정확히 설정되어 있는지 확인합니다. 예시로 posts 앱의 models.py 파일을 아래와 같이 설정합니다.

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'Comment by {self.user.username} on {self.post.title}'

3. 앱 설정

notifications 앱이 포럼 앱의 댓글 생성 시그널을 받을 수 있도록 apps.py에서 시그널을 연결합니다.

from django.apps import AppConfig

class NotificationsConfig(AppConfig):
    name = 'notifications'

    def ready(self):
        import notifications.signals  # 시그널 등록

4. 네비게이션 바 알림 표시

알림을 네비게이션 바에서 표시하도록 base.html을 설정합니다. 이 부분은 이전에 설명한 코드와 동일하게 유지합니다.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>My Forum</title>
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>
  <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <a class="navbar-brand" href="#">My Forum</a>
    <div class="collapse navbar-collapse" id="navbarNav">
      <ul class="navbar-nav ml-auto">
        <li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            <i class="fas fa-bell"></i>
            {% if request.user.notifications.filter(read=False).exists %}
              <span class="badge badge-danger">!</span>
            {% endif %}
          </a>
          <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
            {% for notification in request.user.notifications.all %}
              <a class="dropdown-item {% if not notification.read %}font-weight-bold{% endif %}" href="{% url 'mark_as_read' notification.pk %}">
                {{ notification.message }}
                <small class="text-muted d-block">{{ notification.created_at }}</small>
              </a>
            {% empty %}
              <span class="dropdown-item">No notifications</span>
            {% endfor %}
          </div>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="{% url 'logout' %}">Logout</a>
        </li>
      </ul>
    </div>
  </nav>

  <div class="container mt-4">
    {% block content %}
    {% endblock %}
  </div>
</body>
</html>

5. 마이그레이션 적용

모델을 변경하거나 새로 만들었으면 데이터베이스에 변경 사항을 적용합니다.

python manage.py makemigrations
python manage.py migrate

이제 사용자가 작성한 게시물에 새로운 댓글이 달렸을 때만 해당 사용자에게 알림이 생성됩니다. 네비게이션 바에서 알림 아이콘을 클릭하면 팝업 메뉴처럼 알림 메시지를 볼 수 있으며, 새 알림이 있을 경우 아이콘 옆에 빨간 점이 표시됩니다. 알림을 클릭하면 해당 알림이 읽음 처리됩니다.

장고 리스트