유누킴

DRF(Django Rest framework) 소개 본문

Tech/Django

DRF(Django Rest framework) 소개

Yunhoo_kim 2017. 12. 6. 14:41
728x90

DRF(Django Rest framework) 소개



DRF(Django Rest Framework, http://www.django-rest-framework.org)란 Django 안에서 RESTful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈 소스 라이브러리이다.


RESTful이란 Representational Satate Transfer 의 줄임말이다. 사실 정의를 아무리 읽어도 정확한 감이 오지 않기 때문에 사용해보고 느낀점을 통해 REST를 설명하겠다.


REST 란 HTTP의  URL과 HTTP Method(GET, POST, PUT, DELETE)를 사용해서 API 사용 가독성을 높인 구조화된 시스템 아키텍쳐(Framework)라고 생각하면 된다.

하나의 URL로 우리는 최소 4가지의 HTTP Method를 전송할 수 있다. 

GET은 정보를 읽을 때, POST는 정보를 추가할 때, PUT은 정보를 업데이트할 때, DELETE는 정보를 삭제할때 사용한다고  URI를 설계한다.


스마트폰이 나오기전 많은 IT 기업들은 사용자들이 접근할 수 있는 웹 페이지를 서빙하는 웹 서버만 있으면 됐다.

그 웹 서버에서 DB서버의 데이터도 읽어오고 사용자들이 글을 남기면 DB서버에 저장까지 하는 기능 모두를 담당했다.

하지만 이때에도 데이터를 저장하는 method는 POST, PUT 함수를 사용해서 html, css, javasciprt 정적 파일 서빙이 아닌 데이터 저장 혹은 삭제를 담당하는 기능을 했다.

스마트폰이 출시되고, 어플리케이션 등장으로 더 이상 웹으로만 서비스를 제공하지 않고 스마트폰으로도 서비스를 제공해야했다.

따라서 HTML로 렌더링하는 웹 서버가 아닌, JSON 혹은 XML 과 같은 형식을 통해서 데이터를 다루는 별도의 API 서버가 필요했다.

그 이유는 스마트폰 어플과 웹에서 동일한 기능을 제공하는데 기존의 웹 서버를 계속해서 사용하면 매번 HTML을 읽어서 해당 태그에 들어있는 정보를 찾아내서 스마트폰 화면에 보여주는 멍청한 짓을 할 수는 없기 때문이다.


따라서 RESTful 아키텍쳐를 HTTP Method와 함께 사용해 웹, 데스크탑 앱, 스마트폰 어플들까지 하나의 API 서버를 생성할 수 있다.


Django 또한 View 클래스 자체가 RESTful 한 서버를 만들기에 최적의 프레임워크이다.


class RestTestView(View):


    def __init__(self):

        pass

    def get(self, request):

        a = request.GET.get('a')

        b = request.GET.get('b')

        return JsonResponse({'a' : a, 'b' : b })


    def post(self, request):

        return JsonResponse({'result' 'bad request' })




위 코드와 같이 Django View 클래스는 get, post, put, delete의 함수를 오버라이딩해서 구현하면, 각 HTTP의 메소드에 따라 HTML 응답이 아닌 JSON 혹은 XML로 응답하게 된다.

사실 저 코드 자체가 RESTful API가 되는것이다.


하지만 우리가 웹 어플리케이션을 파이썬을 이용해 처음부터 전부 만들수 있지만, Django 라는 프레임워크를 사용하는 이유도 이미 만들어진 좋은 기능을 활용하기 위해 사용하는것과 같이  DRF(Django Rest Framework)도 Restful API 서버를 보다 쉽고 빠르게 만들수 있도록 도와주는 라이브러리라고 생각하면 된다.



페이타임도 별도의 RESTful API 서버를 IOS, Android에서 접근하여 사용하고 있다. 현재 대부분의 어플들은 이러한 별도의 API 서버를 사용하여서 구현하고 있다.



from rest_framework.views import APIView

from rest_framework.renderers import JSONRenderer

from rest_framework.permissions import IsAuthenticated, AllowAny

from rest_framework.response import Response


class DRFView(APIView):

    permission_classes = (AllowAny,)

    renderer_classes = (JSONRenderer,)

    authentication_classes = (JSONWebTokenAuthentication,)


위 코드는 간단한 DRF의 APIView 구조이다.  

permission_classes는 API에 접근하는 사용자의 허가 정도를 설정한다. 모든 사람이 접근가능한 AllowAny, authentication_classes에 의해 인증이 완료된 사용자만 접근 가능한 IsAuthenticated를 사용할 수 있다.

renderer_classes는 사용자에게 응답이 전송될때 어떤 렌더링을 사용할지 설정한다. 페이타임은 기본적 JSON을 통신 규약으로 설정하고 있기 때문에 사용자 정보를 JSON 형태로 렌더링할 수 있도록 하는 설정이다.

authentication_classes는 permission_classes가 IsAuthenticated로 설정되었을때 필요한 역할을 한다. 해당 클래스에서는 현재 요청을 보낸 사용자가 인증된 사용자인지 아닌지를 나타내서 접근 권한을 책임진다.

추후 포스팅에서 Custom authentication_class를 구성하는 방법을 다룰 예정이다. 기본적으로 DRF에서 제공하는 클래스들이 있지만, 각 서비스에서 원하는 인증 클래스가 여러가지가 있을 수 있다. 예를 들면, 폰을 인증한 사용자만 접근이 가능하도록 하는 인증 클래스가 필요할 것이고,  폰 인증을 하진 않았지만 로그인된 사용자가 접근 가능한 인증 클래스가 있을 수 있기 때문에 자신의 입맛에 맞는 인증 클래스를 구성하는 방법이 필요하다.



Serializer

또한 DRF의 가장 큰 매력적인 기능중 Serializer가 있다.

Serializer는 말 그대로 직렬화하는 클래스로서 사용자의 DB안에 사용자 프로필 사진, 이메일, 이름, 성별이 있다고 가정하면, 사용자 모델 인스턴스를 JSON형태 혹은 Dictionary형태로 직렬화 할 수 있다.

예를 보면.

user = User(email="user@user.user", name="user", sex="male", profile_image="user.png")

UserSeriallizer(user).data

{

    "email" : "user@user.user",

    "name" : "user",

    "sex" : "male",

    "profile_image" : "user.png"

}



위와 같은 사용자가 있다면 DRF의 serializer를 통해서 모델 인스턴스를 직렬화 할 수 있다.


실 사용시에는 만약 사용자 정보를 열람하는 URL이 /serializer/user/<user_id>/가 있고 해당 View에서는 user_id의 해당하는 모델 인스턴스의 정보를 리턴한다고 가정하자.

그렇게 되면 만약 우리가 /serializer/user/1/ 이라는 URL로 요청을 했을시에 user_id가 1인 사용자의 정보를 JSON형태로 응답받을수 있을것이다.

이는 사용자 프로필 페이지에 접근했을때 사용하는 View라고 하면 사용자 페이지의 들어갈때마다 해당하는 사용자의 user_id만 URL에 입력해주게되면 각 사용자의 정보를 JSON형태로 응답 받을 수 있을 것이다.


위와 같은 기능을 하는 Serializer를 ModelSerializer라고 부른다. 위와 같은 UserSerializer는 아래와 같이 구성할 수 있다.



class UserSerializer(ModelSerializer):

    class Meta:

        model = User

        fields = ("email", "name", "sex", "profile_image",)


DRF의 ModelSerializer를 사용해서 각 모델 인스턴스를 쉽게 직렬화 할 수 있게 된다. model_to_dict 필요없이!

또한 모델 저장시에 데이터가 유효한지 검사할 수 있어서, DB 정보 저장시에도 Serializer를 가장 많이 이용한다.

ModelSerializer 활용법에 대해서는 다른 포스팅을 이용해서 자세히 설명할 예정이다.


이번 포스팅에서는 간단한 DRF소개와 DRF에서 가장 많이 쓰이는 APIView와 ModelSerializer의 겉핧기를 해보았습니다. 

앞으로 DRF를 사용해서 실제 API를 구축할때 필요한 기능들을 추가 포스팅하며 DRF의 설명은 이어가도록 할 예정입니다.


이 포스팅은 작성자가 공부하고 개발하며 느낀 경험을 다른 사람들에게 도움을 주고자 작성하였습니다.

오류가 있거나, 질문이 있으신 분들은 주저없이 질문과 지적 부탁드립니다.


읽어주셔서 감사합니다.



스팸 선물세트 8호...





'Tech > Django' 카테고리의 다른 글

Django Restframework ModelSerializer 활용 방법  (1) 2017.12.07
Django urls.py 설정 방법  (0) 2017.12.05
Django란  (0) 2017.12.04