[DRF] What is Django REST Framework? (1차 수정)

ifyouseeksoomi·2020년 8월 23일
4

Django Rest Framework

목록 보기
1/15
post-thumbnail

DRF

Django안에서 Restful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리
(REST: HTTP의 URL과 HTTP method(GET, POST, PUT, DELETE)를 사용하여 API 사용 가독성을 높인 구조화된 시스템 아키텍쳐(프레임워크))

스마트폰의 탄생 이전 많은 IT 기업들은 웹 페이지를 사용자에게 렌더하기 위한 웹 서버만을 필요로 했다. 그 웹 서버에서 DB 서버의 데이터를 읽어오거나(GET), DB 서버에 데이터를 저장, 수정, 삭제하는(POST, PUT, DELETE) 기능을 모두 담당했다. 하지만 스마트폰 출시 이후 어플리케이션의 등장으로 더 이상 웹으로만은 서비스를 제공할 수 없었다. 즉, HTML로 렌더링하는 웹 서버가 아닌, JSON 혹은 XML과 같은 형식을 통해 데이터를 다루는 별도의 API 서버가 필요해진 것이다. (생각해보면 웹이나 앱이나 제공하는 기능과 주고받는 데이터가 동일한데 기존의 웹 서버만을 사용하여 매번 HTML을 읽고 --> 해당 태그에 들어있는 정보를 찾아내어 --> 스마트폰 화면에 띄우는 절차를 진행하는 것은 상당히 비효율적인 일이다.)

따라서 RESTful한 아키텍쳐를 HTTP method와 함께 사용하여 웹, 앱, 데스크탑, 스마트폰 어플들까지 범용 가능한 하나의 API를 선호하게 되었다.
자체 View 클래스 자체가 RESTful한 서버를 만들기에 최적의 프레임워크인 Django 역시 그 기능을 제공하게 된 것이 DRF인 것.

DRF의 장점 및 DRF를 사용하면 좋은 경우

- 범용성이 좋은 웹 브라우저 API를 사용한 쉬운 개발 ( == RESTful한 서버를 보다 쉽고 빠르게 만들자!)
- OAuth1, OAuth2를 위한 추가적인 패키지가 인증 정책에 추가되어 있는 경우
- DB data를 Json으로 직렬화하는(serialize)기능
- 국제적인 기업들을 포함해서 다수의 기업이 사용 --> 커뮤니티가 잘 되어 있음

Serializer

DRF를 가장 매력적으로, 혹은 강력하게 만들어주는 요소

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

'직렬화'는 정말 말 그대로 이해하는 것이 좋다.
models에 작성한 폼 그대로 json 형태로 linear하게 보여주는 것.

조금 더 자세히 들어가보자.
(아래 글은 https://bmh8993.github.io/network/data-serialisation/ 을 정리한 것이다.)

직렬화
데이터 구조나 오브젝트 상태를
동일한 포맷으로, 혹은 다른 컴퓨터 환경에 저장한 후 이후에 재구성할 수 있는 포맷으로 변환하는 과정

PC-A에서 구조체 데이터를 인터넷 너머에 있는 PC-B로 보낸다고 가정해보자. 네트워크 데이터는 연속된 바이트의 흐름일 뿐이다. 따라서 구조체를 바이트 배열로 만들어야하는데, 이를 직렬화라고 한다. 직선으로 쭉 나열한다는 의미로 보면 되겠다. 직렬화된 데이터를 받는 측에서는 사용하기 위해서 다시 구조체로 만들어야한다. 이를 역직렬화라고 한다.

데이터를 직렬화 하고 역직렬화 하려면, 데이터 포맷을 알고 있어야 한다. JSON, XML, YAML과 같은 문서 포맷이 주로 직렬화의 대상이 된다.

IP, TCP, UDP는 네트워크를 가로지르는 메세지들의 데이터 타입이나, 의미를 찾을 수가 없다. 그저 단순한 바이트의 흐름으로 볼 뿐이다. 따라서 응용 프로그램들은 바이트 흐름을 판독에 적합한 데이터로 직렬화하고, 반대로 바이트의 흐름으로 만들어주는 비직렬화 작업을 수행해야한다.

직렬화 되는 방법과 비직렬화 되는 방법이 동일해야 다른 환경과 데이터를 주고 받을 수 있다.

직렬화는 models를 serializer로 json 형태로 변환하는 것 이외에도

- API 디버깅을 쉽게 만들어주며
- 코드를 정리해서 보안 이슈를 해결하기도 하며
- validation도 검증해준다.

ModelSerializer

modelserializers는 serializer내의 클래스로, 이미 models.py에 작성해둔 필드에 맞는 serializer를 만들 수 있도록 해주는 지름길과 같다. 다시 말해, 각 모델 인스턴스를 model_to_dict 과정이 없이 쉽게 직렬화할 수 있게 해주는 것이다. 아래의 사진을 보면서 modelserializer가 사용될 때의 장점을 살펴보자.

위 사진에서 Article 모델을 그냥 Serializer를 사용하여 직렬화하면,

이런 그림으로 직렬화된다. 상당히 코드가 길다. 하지만,
ModelSerializer 클래스를 사용하여 직렬화할 경우,

똑같은 기능을 수행하는 코드인데 위처럼 코드가 깔끔하고 간결해진다! (심지어 발행일로부터의 시간을 계산해주는 get_time_since_publication 메소드는 위에 없었다.)

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

CRUD 활용 맛보기 (@api_view 데코레이션을 이용한 Function Based View)

튜토리얼을 따라하며 만들어진 view를 통해 몇 가지 특징을 정리하면

- api_view를 데코레이터로 임포트하여 사용한다. `@api_view([ method명 ])` 형식으로 작성 가능.
- is_valid() : get 메소드를 사용할 경우에는 작성하지 않아도 되지만 post 메소드 사용시에는 검증 절차가 반드시 필요하다. Create나 Update의 경우 `.save()` 메소드를 사용하게 되는데, 이 전에 is_valid()를 사용하여 검증된 serializer에 한하여만 사용한다.


references:
https://www.geeksforgeeks.org/serialization-in-java/
https://bmh8993.github.io/network/data-serialisation/ (배민혁 개발자님) DRF 관련 모두 참고
https://youtu.be/qrQZOPZmt0w 직렬화와 역직렬화
https://www.youtube.com/watch?v=TmsD8QExZ84&feature=youtu.be serialize tutorial by Dennis
https://butter-shower.tistory.com/50 (butter_shower님) DRF의 개념
https://yunhookim.tistory.com/7 (유누킴님)

profile
묻고 더블로 가는 중인 백엔드 개발자입니다.

1개의 댓글

comment-user-thumbnail
2021년 5월 9일

저에게 필요한 내용이었는데 감사합니다!!

답글 달기