Django Signal이란?
2025. 3. 11. 11:51ㆍ개발 문서/Django
728x90
반응형
Django Signal은 애플리케이션에서 특정 이벤트가 발생했을 때 미리 등록된 리스너(핸들러)가 자동으로 호출되는 기능입니다. 예를 들어, 데이터베이스에 객체가 생성, 변경 또는 삭제되었을 때 특정 작업을 자동으로 수행하고 싶을 때 유용하게 사용할 수 있습니다.
Django에서는 기본적으로 제공하는 내장 Signal과 사용자가 직접 정의하여 사용하는 사용자 정의 Signal로 나눌 수 있습니다.
주요 내장 Signal
- pre_save, post_save: 모델의 객체가 저장되기 전과 후에 호출됩니다.
- pre_delete, post_delete: 모델의 객체가 삭제되기 전과 후에 호출됩니다.
- m2m_changed: ManyToManyField 필드가 변경될 때 호출됩니다.
- request_started, request_finished: HTTP 요청이 시작되거나 종료될 때 호출됩니다.
Signal을 사용하는 이유
- 비즈니스 로직을 모델에서 분리하여 코드의 유지보수를 편리하게 합니다.
- 코드 재사용성을 높이고, 모듈 간의 결합도를 낮출 수 있습니다.
Django Signal 사용법
기본적인 사용법
다음은 객체가 저장될 때(post_save) 이메일을 발송하는 예제입니다.
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
@receiver(post_save, sender=User)
def send_welcome_email(sender, instance, created, **kwargs):
if created:
print(f'새로운 사용자 {instance.username} 님에게 환영 이메일 발송!')
Signal 연결하기(connect)
Signal을 연결하는 또 다른 방법은 다음과 같습니다.
from django.db.models.signals import post_save
from django.contrib.auth.models import User
def send_welcome_email(sender, instance, created, **kwargs):
if created:
print(f'새로운 사용자 {instance.username} 님에게 환영 이메일 발송!')
post_save.connect(send_welcome_email, sender=User)
사용자 정의 Signal 만들기
필요에 따라 사용자가 직접 Signal을 정의할 수도 있습니다.
from django.dispatch import Signal
# Signal 정의
user_logged_in = Signal()
# Signal 호출 (보통 view 등에서 호출됨)
user_logged_in.send(sender=None, user=request.user)
# Signal 수신
@receiver(user_logged_in)
def on_user_logged_in(sender, user, **kwargs):
print(f'{user.username}님이 로그인하셨습니다.')
주의사항
- Signal의 과도한 사용은 코드의 흐름을 파악하기 어렵게 만들 수 있습니다.
- 디버깅이 어려워질 수 있으므로 꼭 필요한 경우에만 사용하는 것이 좋습니다.
- Signal은 동기적으로 실행되기 때문에 무거운 작업은 비동기 처리(예: Celery)를 고려하는 것이 좋습니다.
마치며
Django Signal은 애플리케이션의 유연성을 높이고, 중복 코드를 줄이는 데 효과적인 도구입니다. 그러나 사용 목적과 상황을 잘 파악하여 적절하게 활용하는 것이 중요합니다.
'개발 문서 > Django' 카테고리의 다른 글
Django 트랜잭션(Transaction) 이해 및 활용법 (0) | 2025.03.15 |
---|---|
Django 기본 유저 모델과 Custom 유저 모델의 차이점 완벽 정리 (0) | 2025.03.15 |
serializers.ModelSerializer와 serializers.Serializer의 차이점 (0) | 2024.07.05 |
Django ORM에서 Group By 사용하기 (0) | 2024.01.18 |
Django의 bulk_create 메서드를 활용한 효율적인 대량 데이터 삽입 (0) | 2023.12.09 |