프로젝트 지식(7) - 장고 시그널

1 minute read

장고 시그널

프로젝트를 진행하면서 모델 하나가 저장되면 다른 모델이 자동으로 생성되는 기능이 필요했다(스터디 팀 프로필을 생성하거나 팀에 참가했을 때 자동으로 리더인지 아닌지 판단해주는 모델). 여기서는 팀프로필을 생성한 작성자는 리더로(1, True), 후에 참가한 인원은 그냥 멤버로(0, False) 자동으로 지정해주어야 했다. 이러한 기능을 해결해줄 수 있는 것이 무엇이 있을까 서치하다 장고의 시그널 기능을 발견했다. 이 시간에는 시그널 기능을 자세히 한 번 알아보려한다.

정의

Django 공식문서에서 시그널에 대한 정의는 다음과 같이 나와있다.

장고는 신호 발송자(signal dispatcher)가 포함되어 있어 분리된 응용프로그램이 프레임워크의 다른 곳에서 작업이 발생할 때 알림을 받을 수 있다. 간단히 말해, 신호는 특정 송신자가 일부 작업이 수행되었을 수신자 집합에 알릴 수 있도록 한다. 많은 코드 조각이 같은 이벤트에 관심이 있을 때 특히 유용하다.

다양한 빌트인 시그널이 있는데 중요한 몇 개만 살펴보면, 모델이 저장되기 전이나 후에 전송하는 pre_save, post_save, 모델이 삭제되기 전이나 후에 전송하는 pre_delete, post_delete, ManytoManyField가 바뀌면 전송되는 m2m_changed, HTTP request가 시작하거나 끝날 때 전송되는 request_started, request_finished 등이 있다. 이외에도 커스텀 시그널을 만들 수도 있다.

시그널 받기

시그널을 받기 위해서는 Signal.connect() 메서드를 이용할 수 있다.

def my_callback(sender, **kwargs):
    print("Request finished!")

from django.core.signals import request_finished

request_finished.connect(my_callback)

아니면 receiver() 데코레이터를 이용할 수도 있다.

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

sender 인자를 추가해서 특정 sender로부터 시그널을 받을 수도 있다.

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel


@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
    ...

Leave a comment