본문 바로가기

개발

[오픈소스에서 배우다] 믹스인 클래스 활용하기 (Django Rest Framework)

반응형

믹스인이란 특정한 클래스에 상속을 통해 새로운 속성이나 새로운 기능을 추가(Mix in)하는 것을 의미한다. 이를 잘 활용한 오픈소스가 있는데 바로 Django Rest Framework이다. Django Rest Framework에서는 GenericAPIView에 생성, 수정 등의 다양한 믹스인 클래스를 추가해 쉽게 API View를 구현할 수 있게 해준다.

Django Rest Framework 공식문서 에서 제공하는 예제를 보자. ListModelMixinCreateModelMixin을 상속받음으로써 get메소드와 post메소드에서 listcreate라는 메소드를 사용할 수 있다. 이를 통해 개발자들은 본인들이 원하는 기능을 보다 쉽고 간편하게 이용할 수 있다.

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클래스는 ListModelMixinlist메소드를 사용할 수 있게된다. list메소드는 GenericAPIViewself.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님의 블로그]에 굉장히 설명이 잘되어있다.


참조

반응형