본문 바로가기
Web/Django

[DRF] 1. 개요 / REST / JSON / Serializer

by 조엘 2021. 1. 13.

안녕하세요! 파피몬입니다! 🎺

백엔드 API 서버가 어떻게 구축되는지 조금 알 필요가 있다고 생각이 들어서 Django Rest Framework(이하 DRF)를 공부하고 있습니다. 제가 유일하게 써본 웹 프레임워크인 Django가 이를 학습하는데 조금 편하지 않을까 싶어서 DRF를 선택했어요. 공부하면서 배운 것들을 정리해보고자 합니다 :) 

 

아직 개발자를 지망하는 학생입니다! 틀린 부분이 있으면 댓글로 알려주시면 정말 감사하겠습니다!! 

 

 

*** 개요 ***

지금까지 Django로 실컷 웹 만들었는데, 왜 DRF가 필요하나?라는 점을 조금 짚고 넘어가 보자.  

Django는 프론트엔드와 백엔드가 분리되어 있지 않았다. 클라이언트가 요청을 보내면, DB에서 필요한 데이터를 모두 갖고 와서 완전한 HTML, CSS, JS를 만들어서 제공하였다. 

 

하지만 최근에는 이렇게 웹 개발을 진행하지 않는다. 프론트엔드와 백엔드가 분리되면서 백엔드 측에서는 요청에 따른 필요한 데이터만을 전달해 주는 방식으로 발전했다. (본 포스팅에서는 JSON으로 전달하는 방식을 다룰 예정). 이제, DRF를 통해서 Django를 필요한 데이터 만을 전달해주는 서버로 만들 수 있다.

 

DRF 포스팅 시리즈에서는 Django로 RESTful한, 사용자의 request에 따라 JSON 형식으로 response를 하는 API 서버를 만들어보는 연습을 기록한다. 

 

 

*** REST ***

DRF에서의 R 자체가 REST를 뜻하고, 위에서 잠깐 RESTful이라며 계속해서 REST란 단어가 등장하는 것을 볼 수 있다. 

REST에 대한 내용은 해당 포스팅(medium.com/@hckcksrl/rest%EB%9E%80-c602c3324196)에서 잘 정리해 주셨다. 아주 간략히 요약하자면, REST란 HTTP URI를 통해 자원을 명시하고, HTTP Method를 통해 자원의 CRUD 작업을 수행하는 것을 뜻한다. 

 

REST는 3가지 구성요소를 갖는다. 

1. 자원 (HTTP URI) : 서버에 존재하는 고유한 ID를 가진 자원

2. 행위 (HTTP Method) : 클라이언트가 자원을 조작하기 위해 사용하는 방식. GET, POST, PUT, PATCH, DELETE 등

3. 표현 (Representation) : 클라이언트가 서버로 요청을 보낸 뒤, 서버가 응답으로 보내주는 자원 상태. JSON, XML 등

이러한 REST 아키텍쳐를 따르는 API를 RESTful API 라고 일컫는다. 

 

 

*** JSON ***

이번엔 JSON을 알아볼 차례이다. (참고: developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/JSON)

JSON이란, "데이터 송수신자바스크립트 객체로써 수행할 수 있도록 하는, 가벼운 문자열 데이터 표현식" 이다. 

JSON이 허용하는 자료형은 숫자, 문자열, Boolean, 배열, 또 다른 객체가 있다. 

JSON 예시

다음과 같이 key-value의 패턴으로 표현이 되는 JSON은 텍스트로 이루어져 있어, 사람과 기계 모두 읽고 쓰기 쉽다.

또한 프로그래밍 언어와 플랫폼에 독립적이여서, 서로 다른 시스템간의 객체를 교환하기에도 좋다. 하지만 여기에는 약간의 트릭이 필요한데, 바로 직렬화serializer 라는 과정이다. 

 

 

*** Serializer ***

직렬화란, "어떠한 데이터 구조를 송수신하거나 저장하기 위해, 전송에 적합한 형식으로 변환하는 과정"이다. 

여기서 JSON은 문자열로 직렬화가 된다. 왜 이 과정이 필수적인지를 알아보기 위해 구글링을 하던 중 잘 설명해주신 선배님의 글을 찾을 수 있었다. (참고: okky.kr/article/224715)

 

데이터를 클라이언트와 서버가 송수신 한다는 것은 그 안에 유의미한 정보를 담고 있을 때 가치가 있을 것이다. 

서버가 데이터를 저장하고 있는 방식은 크게 두가지로 나뉠 수 있는데, 다음과 같다. 

1. 값 형식 데이터: Int, float, char, string 등

2. 레퍼런스 형식 데이터: 메모리 번지를 저장해두고, 해당 번지에 비로소 값이 있음. (포인터 개념)

 

여기서 만약 JSON의 value 값이 레퍼런스 형식의 데이터(ex. 또다른 객체) 이고, 이를 그대로 클라이언트가 넘겨 받게 된다면, 서버에서 해당 객체가 저장되었던 엄한 메모리 주소를 넘겨 받게 된다. 이는 피해야 할 것이다!

따라서 직렬화가 필요해지는데, 주소값의 실체를 다 끌어와서 값 형식 데이터로 모두 변조하는 작업을 수행한다. JSON 같은 경우는 직렬화 이후 텍스트로 된 데이터 모양을 띄게 된다. 클라이언트는 해당 정보를 받아 parse를 통해 서버에서 보낸 유의미한 정보를 받아볼 수 있다. 

 

 

 

+) 파이썬의 변수 저장 방식등을 잘 몰라서 조금 공부해보니 파이썬은 모든 변수가 객체의 참조로, serializer가 왕왕 필요할 거 같다는 생각이 들었다. (참고: ahracho.github.io/posts/python/2017-05-01-everything-in-python-is-object-integer/)

 

+) JSON의 stringify와 serialization이 헷갈려서 조금 찾아보았다. 간략히 요약하자면, JSON에 한해서는 stringify가 serialization의 역할을 충분히 해내지만, 다른 serialization format (ex. XML, CSV)을 처리하기 위해서는 다른 조치가 필요하다고 한다. (참고: stackoverflow.com/questions/30044724/json-stringify-versus-serialization)

 

반응형

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

[DRF] 4. Pagination / Filtering & Search  (0) 2021.01.15
[DRF] 3. ViewSet / Router  (0) 2021.01.14
[DRF] 2. APIView / Mixins / Generic CBV  (0) 2021.01.13
[Django] 자소설 닷컴 총 복습!  (0) 2020.08.29
[Django] Django 소개  (0) 2020.05.16

댓글