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을 사용하는 이유

  1. 비즈니스 로직을 모델에서 분리하여 코드의 유지보수를 편리하게 합니다.
  2. 코드 재사용성을 높이고, 모듈 간의 결합도를 낮출 수 있습니다.

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은 애플리케이션의 유연성을 높이고, 중복 코드를 줄이는 데 효과적인 도구입니다. 그러나 사용 목적과 상황을 잘 파악하여 적절하게 활용하는 것이 중요합니다.