Django 는 Python의 오픈 소스 웹 프레임워크이자 풀 스택 프레임워크
🧐 Web framework? Web application framework? 는 웹 서비스 개발을 위한 framework이다.
Web framework | Full-stack | |
---|---|---|
Java | Spring | ✔️ |
Python | Django | ✔️ |
Python | Flask | |
Node.js | Express | |
PHP | Laravel | |
Rudy | on Rails | ✔️ |
MVT 패턴에서 Model의 경우 데이터베이스와 연동이 편하게 만들어져 있다.
기본적으로 Model에 해당하는 DBMS는 SQLite를 사용하게 되어있으며, Django Admin 기능 을 통해 쉽게 조회/편집이 가능하다.
ORM을 기본적으로 제공한다.
관리자 페이지를 기본적으로 제공한다.
자주 사용되는 로직들을 묶어서 기본적으로 제공한다.
만들어진 엔티티에 따라 권한 목록을 알아서 제공한다.
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 한 서버를 만들기에 최적인 프레임워크이다.
Django 안에서 RESTful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리입니다.
DRF를 사용한 누군가가 말한 글귀..
DRF는 개발자가 만든 API들을 디버그하기 쉽게 만들어줍니다. DRF의 큰 기능은 Models를 serializers로 변환하는 것입니다. DRF에서 serializers는 복잡한 구조들을 이미 구성해두었습니다. serializers는 모델을 전달하고, 그 모델들을 json 객체로 변환하는 것만이 전부가 아닙니다. 클라이언트로부터 백엔드에게 데이터를 전달하기도합니다. 코드를 검증하는 것도 자동으로 할 수 있습니다. 코드를 정리해서 security issues를 해결하기도 합니다.
✏️ Stream : '흐르는 시냇물'
- 입출력을 데이터 스트림으로 해석함 즉, C 프로그램은 외부와 스트림을 통해서 상호작용을 함
- 처리 단위 :크게, 바이트(텍스트) 스트림 및 바이너리(이진) 스트림으로 구분 처리
Object는 메모리에 존재하고, 추장적인데 비해서 String or bytes 데이터는 드라이브에 저장 할 수 있고, 통신선으로 전송도 가능하기 때문이다.
서버와 web-browser 에서 데이터를 주고 받을때,
1. object에서 json 파일로 직렬화 해서 전송을 하고
2. 다운로드 받은 것은 json 파일을 역직렬화해서 object를 복구한다.
위와 같은 방법으로 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 형태로 전송, 저장 하게 한다음 전송 저장된 곳에서 다시 역직렬화를 해서 기존의 데이터를 사용하는데 여기서 직렬화 할때의 데이터 포맷 형태를 알고있어야만 역직렬화 할때 똑같은 데이터포맷으로 역직렬화 시킬수있다.
이것을 단순하게 이해하려면 내가 지금까지 진행해온 프로젝트를 보면 return JSONResponse
를 이용해서 JSON 형태를 취해서 데이터를 쏴주었다. 하지만 DRF를 사용하면 JSON 형태로 만들어서 보내주기때문에 JSONResponse
를 사용안하는 것이 아닐까라는 생각을한다. 점차 적으로 DRF의 편의성과 무엇이 좋아서 다들 쓰고있는지 알꺼같다. 좀 더 파보자