2025/12/01 Django - Project 6

김기훈·2025년 12월 1일

TIL

목록 보기
70/191

오늘 학습 내용 ✅


  • Django - Pystargram


Django Signal

  • Django는 특정 이벤트가 발생하였을 때
    • 다른 수신기에 시그널을 보내 특정 동작을 수행할 수 있도록 해주는 Signal 객체가 구현되어 있음
    • 이를 활용하면 특정 모델이 생성되었을때 / 특정 api에 요청이 들어왔을 때 등의 상황에서
      • 해당 상황에 맞는 동작을 구현할 수 있음

  • 정의

    • 특정 이벤트가 발생할 때 다른 부분에서 알림을 받아 추가 작업을 수행할 수 있도록 하는 기능

      • 이 시그널은 이벤트 기반 프로그래밍의 한 형태로
        • 모델의 저장, 삭제 등의 중요한 작업이 발생할 때 추가적인 로직을 실행할 수 있음
    • 시그널을 사용 ex.

      • 모델이 저장되거나 삭제될 때 이를 감지하여 다른 작업을 트리거
      • Django는 이런 이벤트들을 처리하기 위해 여러 내장 시그널을 제공하며,
        • 사용자 정의 시그널을 만들 수도 있음

  • 주요 개념

    • 1. 시그널 (Signal)

      • 시그널은 특정 이벤트가 발생했을 때 발송
      • 예를 들어, 모델의 인스턴스가 저장될 때 시그널이 발송될 수 있음
      • Django는 다양한 내장 시그널을 제공하며, 사용자는 이를 직접 정의할 수도 있음
    • 2. 수신기 (Receiver)

      • 수신기는 시그널을 받아 처리하는 함수
      • 시그널이 발송될 때 이를 수신하여 특정 동작을 수행하는 역할
      • 일반적으로 시그널을 정의하고 나면, 이 시그널에 수신기를 등록하여 시그널을 처리함
    • 3. 발송자 (Sender)

      • 시그널이 발송될 때, 어떤 객체나 클래스가 시그널을 발송했는지를 나타냄
      • 시그널을 특정 발송자와 연결하여, 그 발송자에서 발생하는 이벤트에 대해서만 시그널을 수신 가능

  • Django 내장 시그널

    • Django는 몇 가지 내장 시그널을 제공 / 아래의 예시는 가장 자주 사용되는 시그널
        1. pre_save: 모델의 인스턴스가 저장되기 에 호출
        1. post_save: 모델의 인스턴스가 저장된 에 호출
        1. pre_delete: 모델의 인스턴스가 삭제되기 에 호출
        1. post_delete: 모델의 인스턴스가 삭제된 에 호출
        1. m2m_changed: 다대다 관계가 변경될 때 호출
        1. request_started: HTTP 요청이 시작될 때 호출
        1. request_finished: HTTP 요청이 끝났을 때 호출

signal 사용 방법

  • 1. 시그널 정의 및 수신기 연결

    • 시그널을 사용하기 위해서는 수신기(Receiver)를 정의 및 이 수신기를 특정 시그널에 연결 필요
    • Django에서 시그널을 정의할 필요는 없음
      • 내장 시그널을 사용하거나 필요에 따라 사용자 정의 시그널을 만들 수 있음
  • 2. 수신기 함수 작성

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

# 수신기 함수 정의
@receiver(post_save, sender=MyModel)
def my_model_post_save(sender, instance, created, **kwargs):
    if created:
        print(f"{instance}이(가) 생성되었습니다!")
    else:
        print(f"{instance}이(가) 수정되었습니다!")
  • 수신기 함수는 시그널이 발송될 때 호출되는 함수

    • 수신기 함수는 반드시 두 개의 인자를 받아야 함 -> sender / **kwargs
  • 3. 시그널과 수신기 연결

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

# 시그널과 수신기 연결
@receiver(post_save, sender=MyModel)
def my_model_post_save(sender, instance, created, **kwargs):
    # 저장된 후 처리할 로직
    if created:
        print(f"새 인스턴스 {instance}가 생성되었습니다!")
  • 시그널과 수신기를 연결하기 위해 @receiver 데코레이터를 사용할 수 있음
    • 이 데코레이터는 특정 시그널이 발송될 때 해당 수신기 함수를 실행하도록 설정함
    • 또는 signals.connect() 메서드를 사용해 시그널과 수신기를 명시적으로 연결도 가능

사용자 정의 시그널

  • 내장 시그널 외에도 사용자 정의 시그널을 만들어 특정 이벤트가 발생했을 때 알림을 발송할 수 있다.

    1. 시그널 정의

    • Django의 Signal 클래스를 사용하여 사용자 정의 시그널을 정의 가능
from django.dispatch import Signal

# 사용자 정의 시그널 정의
my_custom_signal = Signal(providing_args=["arg1", "arg2"])
  • 2. 수신기 연결

    • 사용자 정의 시그널과 수신기 함수를 연결
from django.dispatch import receiver

@receiver(my_custom_signal)
def handle_my_custom_signal(sender, **kwargs):
    print("사용자 정의 시그널이 호출되었습니다!")
    print(f"인자: {kwargs}")
  • 3. 시그널 발송

    • 특정 이벤트가 발생했을 때 시그널을 발송
# 시그널 발송
my_custom_signal.send(sender=None, arg1="Hello", arg2="World")

시그널의 예시

  • 1. 사용자 생성 후 프로필 생성

    • 사용자가 회원가입 할 때, 자동으로 프로필을 생성하는 시나리오 가능
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from myapp.models import Profile

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

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()
  • 2. 모델 삭제 전후 처리

    • 모델이 삭제되기 전 또는 후에 특정 작업을 수행 가능
from django.db.models.signals import pre_delete, post_delete
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(pre_delete, sender=MyModel)
def before_model_delete(sender, instance, **kwargs):
    print(f"{instance}이(가) 삭제되기 전입니다.")

@receiver(post_delete, sender=MyModel)
def after_model_delete(sender, instance, **kwargs):
    print(f"{instance}이(가) 삭제된 후입니다.")

시그널의 장점과 단점

  • 장점

    • 중앙 집중화된 이벤트 처리: 특정 이벤트가 발생할 때마다 다른 곳에서 로직을 실행할 수 있음
    • 코드의 분리: 모델의 로직과 추가 작업을 분리하여 코드의 응집도를 높일 수 있음
    • 확장성: 추가 로직을 별도의 파일에 두어 유지보수와 확장이 용이
  • 단점

    • 디버깅 어려움: 시그널은 이벤트 기반이기 때문에 디버깅이 어려울 수 있음
    • 복잡성 증가: 여러 시그널이 동시에 작동할 때 로직의 흐름을 파악하기 어려울 수 있음
    • 성능 저하: 대규모 애플리케이션에서 시그널이 과도하게 사용되면 성능 문제가 발생 가능

Django JWT


사용법

  • poetry add djangorestframework-simplejwt

  • JWT를 이용한 회원가입 기능 구현

새롭게 알게된 내용 ✅

어려운 내용(추가 학습 필요) ✅

오늘 발생한 문제(발생 했다면) ✅

profile
안녕하세요.

0개의 댓글