[Django] DRF - Django Rest Framework?

김영환·2021년 3월 12일
0

django rest framework

목록 보기
3/4
post-thumbnail

0-1. Django

  • Django 는 Python의 오픈 소스 웹 프레임워크이자 풀 스택 프레임워크
    🧐 Web framework? Web application framework? 는 웹 서비스 개발을 위한 framework이다.

    Web frameworkFull-stack
    JavaSpring✔️
    PythonDjango✔️
    PythonFlask
    Node.jsExpress
    PHPLaravel
    Rudyon Rails✔️
  • MVT 패턴에서 Model의 경우 데이터베이스와 연동이 편하게 만들어져 있다.

  • 기본적으로 Model에 해당하는 DBMS는 SQLite를 사용하게 되어있으며, Django Admin 기능 을 통해 쉽게 조회/편집이 가능하다.

  • ORM을 기본적으로 제공한다.

  • 관리자 페이지를 기본적으로 제공한다.

  • 자주 사용되는 로직들을 묶어서 기본적으로 제공한다.

  • 만들어진 엔티티에 따라 권한 목록을 알아서 제공한다.

0-2. RESTful 이란?

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

  • 기존에는 웹 페이지를 보여주는 웹서버만 구현하여 웹 서버에서 DB서버의 데이터도 읽어오고, 사용자들이 글을 남기면 DB 서버에 저장까지 하는 기능을 모두 담당했다. 하지만 스마트폰이 출시되고, 어플리케이션의 등장으로 더이상 웹으로만 서비스를 제공하는 것에 한계가 있었다.

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

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

1. Django Rest Framework

Django 안에서 RESTful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리입니다.

  • Web browsable API는 개발자들에게 큰 유용성을 가져다줍니다.
  • Serialization은 ORM과 non-ORM 데이터 소스를 모두 지원합니다. 📌
  • 강력한 View도 있지만 일반적인 View를 커스터마이징 해서 사용할 수 있습니다. 📌
  • DRF를 사용하는 많은 유저들이 있기때문에, 문서와 커뮤니티를 제공할 수 있습니다.
  • 국제적인 기업들이 사용하고 있습니다.
    📌 아직 체감하지 못한부분.

DRF를 사용한 누군가가 말한 글귀..

DRF는 개발자가 만든 API들을 디버그하기 쉽게 만들어줍니다. DRF의 큰 기능은 Models를 serializers로 변환하는 것입니다. DRF에서 serializers는 복잡한 구조들을 이미 구성해두었습니다. serializers는 모델을 전달하고, 그 모델들을 json 객체로 변환하는 것만이 전부가 아닙니다. 클라이언트로부터 백엔드에게 데이터를 전달하기도합니다. 코드를 검증하는 것도 자동으로 할 수 있습니다. 코드를 정리해서 security issues를 해결하기도 합니다.

2. Serializer : 직렬화

✏️ Stream : '흐르는 시냇물'

  • 입출력을 데이터 스트림으로 해석함 즉, C 프로그램은 외부와 스트림을 통해서 상호작용을 함
  • 처리 단위 :크게, 바이트(텍스트) 스트림 및 바이너리(이진) 스트림으로 구분 처리
  • 직렬화 : 추상적인 object를 구체적이고, 저장가능하고, 전송가능한 텍스트파일 (연속된 byte파일 = stream of bytes)로 바꿔주는 것
  • 역직렬화 : 텍스트파일(연속된 byte 파일 = stream of bytes)를 직렬화된 데이터 포맷형태로 추상적인 object 데이터로 바꿔주는 것
  • 데이터를 직렬화 하고 역직렬화 하려면, 데이터 포맷을 알고 있어야한다. JSON, XML, YAML 과 같은 문서 포맷이 주로 직렬화의 대상이 됩니다.
  • IP, TCP, UDP는 네트워크로 통신하는 메시지들은 데이터 타입이나 데이터 포맷을 알수 없다.
    👉 단순한 바이트의 흐름으로 볼 뿐이다.

2-1. 직렬화를 하는 이유

Object는 메모리에 존재하고, 추장적인데 비해서 String or bytes 데이터는 드라이브에 저장 할 수 있고, 통신선으로 전송도 가능하기 때문이다.

서버와 web-browser 에서 데이터를 주고 받을때,
1. object에서 json 파일로 직렬화 해서 전송을 하고
2. 다운로드 받은 것은 json 파일을 역직렬화해서 object를 복구한다.

DRF에서 직렬화되는과정

serialiers.py


위와 같은 방법으로 DB에 있는 추상화된 데이터들을 Django Rest Framework 의 Serializer를 통해서 JSON 형태로 직렬화 시켜준다.

과정을 간단한게 살펴본다면 하나의 인스턴스로만 간단하게 흐름을 정리해보겠다.

User테이블의 첫번째 값을 하나 뽑아서 진행

>> user_instance = User.objects.first()
>> serializer = UserSerializer(user_instance)
>> class UserSerializer(serializers.Serializer):
        id = serializers.IntegerField(read_only=True)
        email = serializers.EmailField()
        password = serializers.CharField()

>> serializer = UserSerializer(user_instance)
>> serializer
UserSerializer(<User: 20409@naver.com>):
    id = IntegerField(read_only=True)
    email = EmailField()
    password = CharField()
>> serializer.data
{'id': 1, 'email': '20409@naver.com', 'password': '12341234'}
>> type(serializer.data)
<class 'rest_framework.utils.serializer_helpers.ReturnDict'>

이런식으로 Django 데이터베이스에 있는 데이터들을 직렬화를 시켜 준다. 데이터 포맷은 JSON이다.

python datatpye에서 JSON으로 출력하기 위해서 아래와 같이 렌더링을 거쳐야된다.

>> from rest_framework.renderers import JSONRenderer
>> json = JSONRenderer().render(serializer.data)
>> json
b'{"id":1,"email":"20409@naver.com","password":"12341234"}'
>> type(json)
<class 'bytes'>

stream of bytes 형태로 전달해주는 과정

파이썬 native datetype으로 deserializing objects 해준다.

>> import io
>> from rest_framework.parsers import JSONParser
>> stream = io.BytesIO(json)
>> stream
<_io.BytesIO object at 0x7fec5f9d4fb0>
>> data = JSONParser().parse(stream)
>> data
{'id': 1, 'email': '20409@naver.com', 'password': '12341234'}

모든 직렬화 과정이 개념은 똑같다 추상화된 object 를 streams of bytes 형태로 전송, 저장 하게 한다음 전송 저장된 곳에서 다시 역직렬화를 해서 기존의 데이터를 사용하는데 여기서 직렬화 할때의 데이터 포맷 형태를 알고있어야만 역직렬화 할때 똑같은 데이터포맷으로 역직렬화 시킬수있다.

Django vs DRF


이것을 단순하게 이해하려면 내가 지금까지 진행해온 프로젝트를 보면 return JSONResponse 를 이용해서 JSON 형태를 취해서 데이터를 쏴주었다. 하지만 DRF를 사용하면 JSON 형태로 만들어서 보내주기때문에 JSONResponse 를 사용안하는 것이 아닐까라는 생각을한다. 점차 적으로 DRF의 편의성과 무엇이 좋아서 다들 쓰고있는지 알꺼같다. 좀 더 파보자

0개의 댓글