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.signalsLast updated
