Django Signals, 꼭 필요할 때만 현명하게 사용하기

Django 시그널은 특정 동작이 발생했을 때 다른 함수에게 알림을 보내는 옵저버 패턴 기반 시스템. 핵심 비즈니스 로직이 아닌 부가적인 작업에만 사용해야 하며, 잘못 사용하면 코드 추적과 디버깅이 어려워짐

Django Signals 기본 개념

  • Signal: 특정 이벤트를 의미하는 객체 (예: post_save)

  • Sender: 이벤트를 발생시키는 주체 (보통 Django 모델)

  • Receiver: 이벤트 알림을 받아 로직을 수행하는 함수

  • Connecting: Signal, Sender, Receiver를 연결하는 과정

시그널 사용하기 좋은 경우

  • 캐시 무효화: 모델 데이터 변경 시 관련 캐시 삭제

  • 알림 전송: 특정 이벤트 발생 시 이메일, 푸시 알림 전송

  • 활동 로그: 모델의 생성, 수정, 삭제 이력 추적

  • 검색 엔진 인덱싱: 모델 변경 시 검색 인덱스 업데이트

  • 통계 정보 업데이트: 한 모델 변경이 다른 모델 통계에 영향

시그널 사용을 피해야 하는 경우

  • 핵심 비즈니스 로직: 반드시 성공해야 하거나 트랜잭션 일부인 경우

  • 복잡한 데이터 전달: 여러 데이터를 복잡하게 가공해야 하는 경우

  • 제어 흐름이 중요한 경우: 실행 순서가 보장되지 않음

실무 주의사항

  • 트랜잭션 문제: transaction.on_commit 사용으로 트랜잭션 완료 후 실행

  • 테스트 복잡성: 테스트 시 시그널 연결 해제 필요

  • 디버깅 어려움: 코드 흐름 파악이 어려워지는 "원격 유령 액션" 현상

기본 사용법

# signals.py
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

# apps.py
def ready(self):
    import users.signals

Last updated