📌 파이썬 데코레이터 완벽 정리 - 함수에 기능을 덧붙이는 마법

2025. 5. 7. 13:10·기술블로그-Django편

📌 파이썬 데코레이터 완벽 정리 - 함수에 기능을 덧붙이는 마법


1. ✅ 데코레이터란?

**데코레이터(Decorator)**는 함수나 클래스에 추가 기능을 부여하는 Python의 문법적 도구입니다.

함수 위에 @데코레이터이름을 붙이는 방식으로 사용하며, 원래 함수의 코드를 수정하지 않고도 동작을 바꿀 수 있습니다.

@decorator
def my_function():
    ...

이 코드는 사실 다음과 같은 의미입니다:

def my_function():
    ...

my_function = decorator(my_function)

➡ 즉, my_function을 데코레이터 함수에 전달하여 기능을 추가하는 구조입니다.


2. 🧩 기본 구조 이해하기

def decorator(func):
    def wrapper(*args, **kwargs):
        print("함수 실행 전")
        result = func(*args, **kwargs)
        print("함수 실행 후")
        return result
    return wrapper

@decorator
def say_hello():
    print("Hello!")

say_hello()

📌 실행 결과:

함수 실행 전
Hello!
함수 실행 후

➡ say_hello() 함수에 전후 기능이 "덧붙여진 것"입니다.


3. 🚀 실전 예시: Django에서 자주 쓰는 데코레이터

데코레이터 이름 기능 설명

@login_required 로그인한 사용자만 접근 허용
@require_GET GET 요청만 허용
@require_POST POST 요청만 허용
@csrf_exempt CSRF 보안 체크 해제
@staff_member_required 스태프 권한만 허용

예시:

from django.contrib.auth.decorators import login_required

@login_required
def my_page(request):
    ...

➡ 로그인하지 않은 사용자는 자동으로 /accounts/login/으로 리디렉션됩니다.


4. 🧠 커스텀 데코레이터 만들기

def check_admin(func):
    def wrapper(request, *args, **kwargs):
        if not request.user.is_superuser:
            return HttpResponse("접근 권한 없음")
        return func(request, *args, **kwargs)
    return wrapper

@check_admin
def admin_view(request):
    ...

5. 🔍 정리 요약

항목 내용

개념 기존 함수에 추가 기능을 더하는 구조
문법 @데코레이터이름으로 함수 위에 붙임
활용 인증, 권한 제한, 로깅, 전후 처리 등
장점 코드 수정 없이 기능 확장 가능

💡 보너스: 데코레이터 체이닝도 가능!

@log
@login_required
def update_profile(request):
    ...

위처럼 여러 데코레이터를 겹쳐 쓸 수도 있습니다.


 

'기술블로그-Django편' 카테고리의 다른 글

📌 파이썬 키워드 인자 (Keyword Arguments) 완전 정복  (0) 2025.05.07
📌 Django form.save(commit=False) 완전 정복  (0) 2025.05.07
✅ Django 모델에서 ForeignKey(User, ...) 에서 'User'는 인자일까? 매개변수일까?  (0) 2025.05.07
✅ Django 서버 실행 시 "That port is already in use" 에러 해결법 (포트 점유 강제 종료)  (0) 2025.05.06
✅ 왜 로그인은 자동인데, 회원가입은 우리가 직접 만들어야 할까?  (0) 2025.05.06
'기술블로그-Django편' 카테고리의 다른 글
  • 📌 파이썬 키워드 인자 (Keyword Arguments) 완전 정복
  • 📌 Django form.save(commit=False) 완전 정복
  • ✅ Django 모델에서 ForeignKey(User, ...) 에서 'User'는 인자일까? 매개변수일까?
  • ✅ Django 서버 실행 시 "That port is already in use" 에러 해결법 (포트 점유 강제 종료)
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (612)
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (10)
      • 특강 (31)
      • 기술블로그 (32)
      • 기술블로그-Fastapi편 (0)
      • 기술블로그-Django편 (143)
      • 기술블로그-Flask편 (35)
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (66)
      • Fastapi (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
📌 파이썬 데코레이터 완벽 정리 - 함수에 기능을 덧붙이는 마법
상단으로

티스토리툴바