[오픈소스에서 배우다] 믹스인 클래스 활용하기 (Django Rest Framework)
믹스인이란 특정한 클래스에 상속을 통해 새로운 속성이나 새로운 기능을 추가(Mix in)하는 것을 의미한다. 이를 잘 활용한 오픈소스가 있는데 바로 Django Rest Framework
이다. Django Rest Framework
에서는 GenericAPIView
에 생성, 수정 등의 다양한 믹스인 클래스를 추가해 쉽게 API View를 구현할 수 있게 해준다.
Django Rest Framework 공식문서 에서 제공하는 예제를 보자. ListModelMixin
과 CreateModelMixin
을 상속받음으로써 get
메소드와 post
메소드에서 list
와 create
라는 메소드를 사용할 수 있다. 이를 통해 개발자들은 본인들이 원하는 기능을 보다 쉽고 간편하게 이용할 수 있다.
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics
class SnippetList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
ListModelMixin
을 살펴보자. 이 Mixin
을 상속받은 GenericAPIView
클래스는 ListModelMixin
의 list
메소드를 사용할 수 있게된다. list
메소드는 GenericAPIView
의 self.filter_queryset
, self.get_queryset
, self.get_serializer
등의 메소드를 활용해 데이터베이스에 저장되어 있는 데이터들을 목록형태로 리턴해주는 역할을 한다.
class ListModelMixin:
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
그렇다면 왜 믹스인 클래스를 사용할까? 만약 Django Rest Framework 위의 Mixin을 사용하지 않다면, 위의 모든 기능을 모든 VIew에 직접, 반복적으로 구현해야할 것이다. 하지만 API를 작업할 때 목록을 보여주거나, 생성, 삭제, 수정 등은 항상 사용되는 반복적인 일이다. 이러한 반복적인 기능을 하나의 Mixin 클래스로 제공한다면 반복적인 일을 줄여주고 가독성, 생산성을 높여줄 수 있다.
단, Mixin 클래스에 존재하는 메소드나 속성을 상속받는 클래스에서 사용할 경우 믹스인 클래스의 메소드가 오버라이딩되어 의도하지 않게 작동할 수 있으니 주의해야한다. (의도적으로 오버라이딩하는 경우도 있다.)
+ Mixin클래스 이외의 다중상속은 해가될 수 있다는 점도 추가적으로 알아두자.
+ Django Rest Framework
에 대해서는 [RACCOONY님의 블로그]에 굉장히 설명이 잘되어있다.
참조