데코레이터 (Decorator)

김의석 ·2024년 9월 17일

Django

목록 보기
38/39

데코레이터는 함수나 클래스의 동작을 확장하거나 수정할 수 있는 강력한 도구이다.

1. @csrf_exempt

  • 설명: CSRF 검사를 비활성화합니다.
  • 사용 이유: 보안상의 이유로 Django는 POST 요청에 대해 CSRF 토큰을 요구하지만, 특정 요청에 대해 이를 비활성화하고 싶을 때 사용합니다.
  • 예시:
    @csrf_exempt
    def my_view(request):
        # CSRF 토큰 없이 처리
        pass

2. @login_required

  • 설명: 로그인이 필요한 뷰에 적용합니다.
  • 사용 이유: 인증된 사용자만 접근할 수 있도록 제한합니다. 로그인하지 않은 사용자는 로그인 페이지로 리다이렉트됩니다.
  • 예시:
    @login_required
    def my_view(request):
        # 로그인한 사용자만 접근 가능
        pass

3. @permission_required

  • 설명: 특정 권한이 필요한 뷰에 적용합니다.
  • 사용 이유: 특정 권한을 가진 사용자만 접근할 수 있도록 제한합니다.
  • 예시:
    @permission_required('app_label.permission_code')
    def my_view(request):
        # 특정 권한을 가진 사용자만 접근 가능
        pass

4. @user_passes_test

  • 설명: 사용자가 특정 테스트(조건)를 통과해야만 뷰에 접근할 수 있게 합니다.
  • 사용 이유: 로그인 여부 외에도 사용자의 특정 속성(예: 관리자 여부 등)을 기준으로 접근을 제한할 수 있습니다.
  • 예시:
    @user_passes_test(lambda u: u.is_superuser)
    def my_view(request):
        # 관리자만 접근 가능
        pass

5. @require_http_methods

  • 설명: 특정 HTTP 메서드만 허용합니다.

  • 사용 이유: 특정 뷰에 대해 허용된 메서드(예: GET, POST, PUT 등)만을 허용할 때 사용합니다.

  • 예시:

    from django.views.decorators.http import require_http_methods
    
    @require_http_methods(["GET", "POST"])
    def my_view(request):
        # GET과 POST 메서드만 허용
        pass

6. @method_decorator

  • 설명: 클래스 기반 뷰에서 데코레이터를 메서드에 적용할 때 사용합니다.

  • 사용 이유: 함수 기반 뷰에서 사용하던 데코레이터를 클래스 기반 뷰에서도 사용하려면, @method_decorator로 적용할 수 있습니다.

  • 예시:

    from django.utils.decorators import method_decorator
    from django.views.decorators.csrf import csrf_exempt
    
    @method_decorator(csrf_exempt, name='dispatch')
    class MyView(View):
        def get(self, request):
            pass

7. @transaction.atomic

  • 설명: 뷰 전체를 데이터베이스 트랜잭션 안에서 실행합니다.

  • 사용 이유: 뷰 실행 중 발생하는 모든 데이터베이스 작업을 트랜잭션으로 묶어, 오류 발생 시 롤백합니다.

  • 예시:

    from django.db import transaction
    
    @transaction.atomic
    def my_view(request):
        # 데이터베이스 작업을 하나의 트랜잭션으로 묶음
        pass

데코레이터를 사용하는 목적

  1. 중복 제거: 동일한 기능을 여러 뷰에서 반복적으로 사용하지 않고, 데코레이터를 통해 재사용성을 높일 수 있다.
  2. 코드 가독성 향상: 인증, 권한 확인 등 공통 기능을 데코레이터로 분리함으로써 뷰 함수/메서드가 더 간결해지고 가독성이 향상된다.
  3. 보안: 로그인 필요 여부, CSRF 보호 등 보안 관련 기능을 데코레이터로 간편하게 적용할 수 있다.
  4. 특정 메서드 처리: 메서드 기반의 처리를 간단하게 적용할 수 있다 (예: GET, POST만 허용하는 경우).
  5. 트랜잭션 처리: 데이터베이스 작업 시 트랜잭션 처리를 쉽게 적용할 수 있다.
profile
널리 이롭게

0개의 댓글