알림 유형 구분의 어려움:
int
)로 관리하다 보니, 코드에서 의미를 직관적으로 파악하기 어려움type=1
이 무엇을 의미하는지 명확하지 않음알림 상태 관리의 불편함:
is_read
)를 별도로 관리하지 않아, 사용자가 읽은 알림을 처리하는 로직이 복잡해질 가능성이 있음확장성 부족:
type
관련 부분을 수정해야 하는 구조적 문제가 있음choices
필드를 활용한 유형 정의:
TYPE_CHOICES
를 도입해 알림 유형의 의미를 명확히 하고, 새 유형 추가 시 수정 범위를 최소화TYPE_GENERAL
, TYPE_FRIEND_REQUEST
등)를 정의해 코드 가독성을 높임읽음 여부 관리:
is_read
필드를 추가해 알림의 상태를 관리모델 기본값 및 정렬:
type
의 기본값을 지정하고, 생성일 기준 정렬을 기본으로 설정해 데이터 조회 성능 향상class Notice(models.Model):
user_id = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="accounts"
)
TYPE_GENERAL = 1
TYPE_FRIEND_REQUEST = 2
TYPE_COMMENT = 3
TYPE_CHOICES = [
(TYPE_GENERAL, "일반 알림"),
(TYPE_FRIEND_REQUEST, "친구 요청 알림"),
(TYPE_COMMENT, "댓글 알림"),
]
type = models.IntegerField(choices=TYPE_CHOICES, default=0)
content = models.CharField(max_length=50)
is_read = models.BooleanField(default=False) # 읽음 여부
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
TYPE_CHOICES
로 알림 유형 관리:
TYPE_FRIEND_REQUEST
등)를 사용해 가독성을 높이고, choices
를 통해 유효성을 보장.is_read
필드 추가:
직렬화 코드 변경:
NoticeSerializer
에서 추가적인 변경 없이 동작 가능:
class NoticeSerializer(serializers.ModelSerializer):
class Meta:
model = Notice
fields = ['id', 'type', 'content', 'is_read', 'created_at', 'updated_at']
get_type_display()
를 활용하려면 추가 필드를 정의 가능:
class NoticeSerializer(serializers.ModelSerializer):
type_display = serializers.CharField(source="get_type_display", read_only=True)
class Meta:
model = Notice
fields = ['id', 'type', 'type_display', 'content', 'is_read', 'created_at', 'updated_at']
조회 및 업데이트 로직 변경:
알림을 읽음 처리하거나 삭제하는 API를 간단하게 구현 가능:
# 읽음 처리
notice = get_object_or_404(Notice, id=notice_id, user_id=request.user)
notice.is_read = True
notice.save()
읽은 알림 삭제:
Notice.objects.filter(user_id=request.user, is_read=True).delete()
확장성 향상:
TYPE_CHOICES
에 값을 추가하기만 하면 쉽게 확장 가능:TYPE_LIKE = 4
TYPE_CHOICES.append((TYPE_LIKE, "좋아요 알림"))
가독성과 유지보수성:
choices
와 상수를 활용하면 코드를 더 직관적이고 관리하기 쉽게 만들 수 있다데이터 상태 관리:
is_read
)를 추가해 클라이언트와 서버 간의 데이터 동기화가 원활해짐확장 가능성:
실시간 알림 지원: