본문 바로가기

코딩

django REST Framework Mixin 패턴

728x90
반응형

mixing Coffee by midjourney

Django REST Framework(DRF)의 mixins 클래스공통적인 CRUD(생성, 읽기, 업데이트, 삭제) 동작을 구현하는 데 필요한 재사용 가능한 코드를 제공한다. mixins는 DRF에서 제네릭 뷰와 결합하여 API 엔드포인트를 효율적으로 구현할 수 있도록 설계된 추상 클래스이다.


개념

Mixins는 객체 지향 프로그래밍(OOP)에서 다중 상속을 통해 특정 기능을 재사용할 수 있도록 설계된 클래스이다. DRF의 mixins 클래스는 API에서 흔히 사용되는 작업을 수행하도록 메서드를 제공하며, 개발자가 전체 기능을 직접 구현하지 않아도 되도록 한다.


주요 mixins 클래스

DRF에서 제공하는 mixins 클래스는 다음과 같다:

  1. CreateModelMixin
    • 객체를 생성하는 동작(POST 요청)을 처리.
    • perform_create 메서드를 통해 저장 로직을 커스터마이징 가능.
  2. RetrieveModelMixin
    • 특정 객체를 조회하는 동작(GET 요청)을 처리.
  3. UpdateModelMixin
    • 객체를 수정하는 동작(PUT 또는 PATCH 요청)을 처리.
    • perform_update 메서드를 통해 수정 로직을 조정 가능.
  4. DestroyModelMixin
    • 객체를 삭제하는 동작(DELETE 요청)을 처리.
  5. ListModelMixin
    • 객체의 목록을 조회하는 동작(GET 요청)을 처리.

사용법

mixins는 단독으로 사용되지 않고, 제네릭 뷰 클래스와 함께 사용된다.

기본 예제:

from rest_framework import mixins, generics
from .models import Article
from .serializers import ArticleSerializer

class ArticleListView(
    mixins.ListModelMixin,
    mixins.CreateModelMixin,
    generics.GenericAPIView
    ):

    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

주요 특징과 동작

  1. 재사용성
    • CRUD와 관련된 공통 동작을 mixins에 정의하여 코드 중복을 줄임.
  2. 유연성
    • 필요한 동작만 포함할 수 있도록 여러 mixins 클래스를 선택적으로 조합 가능.
  3. GenericAPIView와 결합
    • DRF의 GenericAPIView와 함께 사용되며, URL 매칭, 쿼리셋 설정, 직렬화 등을 추가로 제공.
  4. 메서드 오버라이딩 가능
    • 각 mixins에서 제공하는 메서드(예: perform_create, perform_update)를 오버라이딩하여 커스터마이징 가능.

실제 활용 예제:

게시글 목록 조회 및 생성

from rest_framework import mixins, generics
from .serializers import PostSerializer
from .models import Post

class PostListCreateView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

 

특정 게시글 조회, 수정 및 삭제

from rest_framework import mixins, generics
from . import Post
from api.serializers import PostSerializer

class PostRetrieveUpdateDeleteView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)

장점

  1. 효율성: 자주 사용하는 CRUD 동작을 쉽게 추가.
  2. 재사용성: 특정 기능을 구현한 코드를 다른 클래스에서 재사용 가능.
  3. 유연성: 필요한 mixins만 선택하여 원하는 조합으로 동작 구현 가능.

주의사항

  1. 제네릭 뷰와 비교
    • ListCreateAPIView, RetrieveUpdateDestroyAPIView 같은 제네릭 뷰는 mixins를 이미 포함하고 있으므로, mixins를 별도로 사용하는 경우는 커스터마이징이 필요한 상황에 더 적합.
  2. 중복 사용 방지
    • 필요 없는 mixins를 상속받으면 코드가 불필요하게 복잡해질 수 있음. 필요한 동작만 추가해야 함.

결론

DRF의 mixins 클래스는 기본적인 API 동작을 효율적으로 구현할 수 있도록 돕는다. 이를 통해 코드 중복을 줄이고, 필요한 기능을 커스터마이징하면서도 간결한 코드 작성이 가능하다. GenericAPIView와 조합하여 사용하면 더욱 강력한 RESTful API를 구현할 수 있다.

728x90
반응형

'코딩' 카테고리의 다른 글

데코레이터; 가마솥에 온도계를 꽂다  (1) 2024.12.12
Codeium  (3) 2024.12.12
@api_view 데코레이터  (3) 2024.12.05
파이썬 자료형; Data Types  (1) 2024.12.05
파이썬 출력 예쁘게 하기; python Format  (2) 2024.12.05