Django REST Framework 란

RESTful이란 Representational State Transfer의 줄임말이다. 먼저 REST에 대해서 소개를 하자면, http의 url과 http method(GET, POST, PUT, DELETE)를 사용해서 API 가독성을 높인 구조화된 시스템 아키텍쳐(framework)라고 생각하면 된다. 하나의 URL로 우리는 최소 4가지의 HTTP method를 전송할 수 있다.

쉽게 말하면 자원을 이름 등으로 구분해서 자원에 대해서 여러 정보를 주고 받는 것 자체를 REST라고 생각하면 된다.

REST는 이전에 한번 학습 요약 차원에서 정리했다.

DRF(Django REST Framework)

본론으로 들어와서 DRF(Django REST Framework)란 Django 안에서 RESTful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리다. Django 프로젝트는 템플릿에 바로 데이터를 전달하는 것에서 더 나아가서 DRF를 사용하면 JSON과 같은 양식을 사용해 다양한 플랫폼에 클라이언트에 데이터를 제공해줄 수 있는 API 서버를 만들 수 있다.

Django REST framework 장점 및 사용하면 좋은 경우

  • 웹 브라우저 API는 범용성이 크다. 개발을 쉽게 만들어준다.
  • 인증 정책에 OAuth1, OAuth2 를 위한 추가적인 패키지가 추가되어 있는 경우
  • 시리얼라이즈 기능을 제공해준다. (DB data -> JSON)
  • 문서화 및 커뮤니티 지원이 잘 되어있다.

Serializer

DRF의 특징이면서 매력적인 기능

시리얼라이저(Serializer)만 알아도 Django/DRF 차이점은 다 파악했다. 단순히 말하면 직렬화인데, Django 프로젝트에서는 모델 인스턴스를 JSON 타입으로 바꾸는 것이다.

Serializer : 파이썬 형식의 코드를 다른 네트워크 환경과의 통신을 위해 직렬화 할 때, DRF에서 직렬화를 담당하는 클래스. queryset, model instance등의 복잡한 데이터를 python datatype으로 변환시켜 json, xml등의 컨텐츠 타입으로의 변환을 쉽게 만들어준다

# DRF 공식 문서 예제
from rest_framework import serializers

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

# Serializing objects
serializer = CommentSerializer(comment)
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}

ModelSerializer

modelserializers는 serializer내의 클래스입니다.매번 모델을 작성하는 앞의 코드를 일일히 작성하면 실수할 일이 많아지기 때문에 대안으로 나온 방법입니다.

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

메타클래스에 fields='__all__'라고 쓸 경우, 한번에 모델 내의 모든 필드가 사용될 수 있다.

모델시리얼라이저의 장점은 다음과 같다.

  • 작성해둔 models.py에 따라 필드가 자동으로 생성된다.
  • 데이터에 대한 validator도 자동으로 생성한.
  • .create().update()가 간단한 기본 구현이 포함되어 있다.
# ModelSerializer 동작 자세히 보기
>>> from myapp.serializers import AccountSerializer
>>> serializer = AccountSerializer()
>>> print(repr(serializer))
AccountSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(allow_blank=True, max_length=100, required=False)
    owner = PrimaryKeyRelatedField(queryset=User.objects.all())

serializer에 비해 코드가 깔끔하고 간단해졌다. 여기에 추가로 validation도 자동으로 생성된다.