Chapter 10-1 Django 시그널과 @receiver 데코레이터 완전 정복

2025. 5. 15. 15:50·Django

🛰️ Django 시그널과 @receiver 데코레이터 완전 정복

대용량 데이터일 때 검색 성능을 높이기 위해 태그(Tag) 기능을 함께 활용할 수 있습니다.


1️⃣ @receiver란?

@receiver는 Django의 시그널(Signals) 시스템과 함께 사용하는 데코레이터로, 특정 이벤트가 발생했을 때 자동으로 실행되는 **신호 수신 함수(Signal Handler)**를 정의하는 데 사용됩니다.

  • 📡 시그널(Signal): Django에서 이벤트가 발생했음을 알리는 메커니즘입니다.
  • 🧭 핸들러(Handler): 시그널을 수신하고 그에 따라 실행되는 함수입니다.

2️⃣ 시그널의 구조와 흐름

단계 설명

1 Django 내부 이벤트 발생 (ex. 모델 저장)
2 해당 이벤트에 연결된 시그널 발송 (ex. post_save)
3 @receiver가 등록된 핸들러 함수 실행

3️⃣ 대표 시그널 종류

시그널 설명

pre_save 객체 저장 전에 호출됨
post_save 객체 저장 후 호출됨 ✅
pre_delete 객체 삭제 전에 호출됨
post_delete 객체 삭제 후 호출됨

👉 추가로 django.core.signals에서는 요청/응답과 관련된 시그널도 제공됩니다.


4️⃣ 기본 사용법 예시

# post/models.py

@receiver(post_save, sender=Post)
def post_post_save(sender, instance, created, **kwargs):
    hashtags = re.findall(r'#(\w{1,100})(?=\s|$)', instance.content)

    instance.tags.clear()

    if hashtags:
        tags = [
            Tag.objects.get_or_create(tag=hashtag)
            for hashtag in hashtags
        ]
        tags = [tag for tag, _ in tags]
        instance.tags.add(*tags)

🧠 코드 설명

  • @receiver(post_save, sender=Post) → Post 모델이 저장된 직후 시그널을 감지
  • hashtags = re.findall(...) → 본문에서 해시태그 추출
  • instance.tags.clear() → 기존 태그 초기화
  • get_or_create → 태그가 없으면 생성
  • add(*tags) → 태그를 다대다 필드에 추가

5️⃣ 실무 활용 팁 💡

  • 🔄 모델 로직과 분리: 시그널은 저장/삭제 시점의 처리 로직을 모델에서 분리할 수 있어 유지보수에 유리합니다.
  • 📂 핸들러 모듈 분리 가능: signals.py 파일로 핸들러를 따로 분리하고 앱의 apps.py에서 import하면 됩니다.
  • 🚨 주의사항: 순환 참조, 신호 중복 연결, 성능 이슈에 유의하세요!

✅ 정리 요약

항목 설명

데코레이터 @receiver로 신호 핸들러 함수 정의
이벤트 처리 모델 저장/삭제 등 특정 이벤트 후 자동 실행
활용 사례 자동 태그 생성, 알림 전송, 로그 기록 등
장점 비즈니스 로직을 핵심 모델에서 분리하여 깔끔하게 유지

이제 @receiver를 활용하면 Django에서 모델 이벤트에 반응하는 자동화된 처리 로직을 손쉽게 구성할 수 있습니다 ⚙️

'Django' 카테고리의 다른 글

Chapter 10-3 Django 데코레이터와 템플릿 태그 실전 정리  (0) 2025.05.15
Chapter 10-2 Django에서 LoginRequiredMixin 완전 정복  (0) 2025.05.15
Chapter 9-5 Django 댓글 모델 만들기, 태그 모델 만들기  (0) 2025.05.14
Chapter 9-4 Django 포스트 생성, 수정 페이지 만들기  (0) 2025.05.14
Chapter 9-3 Django Post 목록 무한 스크롤 만들기  (0) 2025.05.14
'Django' 카테고리의 다른 글
  • Chapter 10-3 Django 데코레이터와 템플릿 태그 실전 정리
  • Chapter 10-2 Django에서 LoginRequiredMixin 완전 정복
  • Chapter 9-5 Django 댓글 모델 만들기, 태그 모델 만들기
  • Chapter 9-4 Django 포스트 생성, 수정 페이지 만들기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (799) N
      • Python (32)
      • 프로젝트 (118) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    homebartrend
    lawsuitculture
    뷔
    travel ban
    btsdischarge
    americaparty
    RM
    remittance
    newpoliticalparty
    btsreunion
    btscomeback
    college reunions
    btsjungkook
    trumpmuskclash
    self-growth
    chatgpterror
    smartphonedurability
    basalcellcarcinoma
    urbantrends
    livebroadcast
    chinanightlife
    americanlaw
    classaction
    youngprofessionals
    titaniumcase
    gpterror
    global politics
    bts
    hotcoffeecase
    life reflection
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 10-1 Django 시그널과 @receiver 데코레이터 완전 정복
상단으로

티스토리툴바