REST(Representational State Transfer)는 네트워크 상에서 클라이언트와 서버 간의 상호작용을 정의하는 아키텍처 스타일입니다.
그래서 이 개념을 가져다가 API로 만든것이 RESTful API라고 한다.
그래서 RESTful API란?
먼저, RESTful API에 POST는 생성, GET은 조회, DELETE는 삭제, PUT은 전체적인 수정이 들어갈 때, PATCH는 일부를 수정할 때 쓰인다.
JSON
JSON(JavaScript Object Notation)
JS 표기법을 따른 일종의 데이터를 담는 형식 - XML, CSV, YAML 등의 형식이 있지만, JSON을 일반적으로 사용 쉽고 간편하며, 분석하기 쉽다
파이썬의 dict 처럼 key-value 형식의 구조
예를 들어 테이블 테이러를, 그 자체를 전송할 수 없으니, 다른 형식으로 바꿔서 보내야 하는데, 그 중에 JSON이 편하다.
참고로 JSON은 코드가 아니다. 데이터를 담는 형식일 뿐이며, .json 형식으로 사용한다. 문자는 ''으로 묶어야 하며, true, false, 숫자 등을 사용 사용이 가능하다
형식
참고로 key:value 중에 value에서 또 다른 object가 안에 담길 수 있다 예를 들어 {'name' : 'kevin' }에서 kevin 말고 name으로 접근하면 {'KO' : '케빈'}, {'EN' : 'Kevin'} 이렇게 다양한 값들이 다시 들어갈 수 있다. 참고로 리스트도 가능
JSON Response와 Serialization
그런데 계속해서 creat하는 것이 귀찮을 때 쓰는 것이 있습니다 바로 Django Seed 입니다.
pip install django-seed
설치후,
settings에서 apps에 django_seed 등록
그리고 이렇게 씁니다 articles 앱에다 seeding을 하는데, 30개만 해라 라는 뜻입니다.
자, 이제 이것을 이제 JSON으로 받게 해야합니다 우리가 보통 runserver를 하면 html로 답변을 받는데 이것을 JSON으로 받아야 합니다.
이렇게 나오도록
바로
이렇게 말입니다. 저렇게 빈 리스트 하나 만들고, for을 통해 돌면서 title하고, content를 넣어주는 겁니다 밑에 JsonResponse로 바꿔줘야 합니다. 이전에는 HTML을 렌더링해주는 render가 있다면 이제는 Json형식으로 답해주는 것이 필요합니다. 그것이 바로 JsonResponse입니다.
from django.http import JsonResponse
이렇게 바꿔주고, 첫번째 인자로, 우리가 만든 빈 리스트 json_res(곧 안에 값이 들어가게됨) 두번째로 safe= False인데 먼저, 알아야 하는게, 만약 첫번째 인자가 dict 형태로 들어가면 safe=False를 안 적어도 되지만, 지금은 우리는 [] w즉, 리스트로 적었기 때문에 적어주는 겁니다.
이렇게 되면, 처음 articles는 queryset의 객체가 되는데, (즉, Article.objects.all()을 통해 값을 전부 가져옴) 그것은 JSON 형태로 바꿔줘야 하기 때문에, views에서 직접 만들어서 JsonResponse로 돌려줌.
그러면 이렇게 나옵니다.
자, 여기서 조금 더 자세히 나옵니다. 사실 JsonResponse는 HttpResponse를 JSON 형식으로 감싸서 나온 것이고, safe는 dict 타입이 아닌 객체를 직렬화를 위해 적는 것입니다.
그러면 직렬화(Serialization)?는 뭘까요? 직렬화 객체 또는 데이터 구조를 저장, 전송을 위해 다른 포맷으로 변경하는 것입니다. → 데이터의 구조는 유지하면서 추후 재구성이 가능한 포맷으로 변환해요! 현재 Python 객체 형태인 Queryset 혹은 Model의 Instance를 전송 가능한 형태로 직렬화를 통해 JSON, XML, YAML 등의 형태로 변환하는 것입니다. Django도 내부적으로 다른 데이터 포맷으로 쉽게 직렬화 할 수 있는 기능을 제공합니다.
어디서? 이미 장고는 있다
from django.core import serializers
serializers에서 serialize(직렬화)를 하는데, format은 json이고 직렬화 할 데이터를 두번째로 넣어줍니다. 하지만 이번에는 직렬화를 해줬고, 그것을 다시 넣어줌으로써 HttpResponse를 씁니다, 그러면 content_type은? application/json은? content_type은 실제로 response 구조 중에 정보로 들어가 있습니다. 클라이언트가 request를 보내고, 서버가 response를 줄 때, 이 response가 이 response가 진짜 json인지를 적어주는 것을 content_type으로 적어주게 됩니다. 즉, response를 줄 때, application/json 형식이라고 알리는 역할을 합니다.
그러면 이렇게 model, pk 등 여러 정보들까지 전부 알려줍니다.
하지만 단점이 있습니다 만약 title, content등...models하고 pk가 필요없고 나머지만 필요한데 할 때, 이 serializers.serialize은 그것을 커스텀할 수 없습니다. 즉, 유연하지가 않습니다. 즉, 직렬화된 데이터의 구조를 변경하거나 새로운 필드를 구성하는 것에 많은 추가 작업이 필요합니다. 유연한 API를 위한 기능이라기보다 모델 구조로 저장되어있는 데이터를 export 하는 용도에 가깝습니다. ⇒ 모델에 종속적이지 않고 유연하지만 사용하기 편한 Serializer의 필요성! 즉, 이것을 해결하기 위해 나온것이 Django Rest Framework(DRF입니다)
Django REST Framework
DRF는 사실 장고의 개념에 조금 더 붙인것이며, 어렵진 않습니다. 즉, DRF를 사용해서 JSON을 응답하는 API를 설계하는 것입니다.
그런데 이 DRF는 따로 파일을 만들어야 합니다.(이제부터 구조는 DRF base는 Django입니다) 먼저 1. serializers.py를 생성(각 앱) 보통 이 파일에 앞으로 상요할 serializer들을 정의합니다.
먼저, 그 파일 안에 이렇게 클래스를 정의합니다.
일단 serizliers에서 ModelSerializer를 상속을 받고, 그 밑은 뭐..많이 해봤으니까.
참고로 이 부분은 forms.py랑 매우 비슷하죠? 그래서 장고 기초를 다 학습하신분만 이해를 하실 수 있습니다. 그리고 views에선
이렇게 씁니다. 먼저 api_view라는 데코레이터를 사용해야 합니다.
from rest_framework.decorators import api_view
이렇게 불러옵니다 먼저 이 데코레이터는 코드가 실행되기 전에 미리 어떤 "준비 작업"을 해주는 특별한 도구이며, 여기서 @api_view는 Django REST Framework(짧게 DRF)에서 제공하는 데코레이터입니다. 그리고 이 데코레이터는 저희가 만든 함수를 "API로 변신"시켜 줍니다. 여기서 GET은 위에서 설명했듯, '조회'를 뜻합니다.
그리고 리스트 안에 넣는 이유는 나중에 ['POST'] 같은 다른 방식도 추가할 수 있기 때문입니다. 데코레이터 @api_view(['GET'])는 이 함수를 "API로 사용할 거야"라고 알려주고, "GET 방식으로만 동작하도록" 만들어 줍니다.
함수 내부 코드에서는 우리가 데이터베이스에서 Article 정보를 가져오고, 가져온 정보를 ArticleSerializer로 변환해서, Response로 사용자에게 돌려주는 겁니다.
참고로 DRF에서 views안에 함수형을 만들 때, 저 api 데코레이터를 달아주셔야 합니다. 그리고 그 안에는 허용할 메서들르 넣으면 됩니다.
이러면 위에서 했던 방식들하고 매우 비슷합니다. article 변수에 Article 모델에 있는 모든 정보를 담고, 그것을 이제 직렬화를 시켜야하는데, 그것을 아까 만든 직렬화 클래스를 만들어서, 첫번째 인자로 모든 정보를 담고있는 article를 넣주는데, 만약 넣어주는 값이 단일개체면 옆에 many=True를 빼주셔도 됩니다. 하지만 all()을 쓰고 있기 때문에 many=True를 넣어야 합니다. 그리고 serializer.data란 속성으로 Response에 담아주면 됩니다. 참고로 Response는
from rest_framework.response import Response
그러면
이렇게 나옵니다. 뭔가 다르게 나오는데, 이 방식은 만약 JsonResponse는 맞는데, 만약 HTML로 접근하면 template을 적용해줍니다.
그리고 알아야 할 점은 우리가 적은 models에서 적은 fields들을 다시 한번 serializers.py에 있는 ArticleSerializer모델에 넣어줌과 동시에 fields를 '__all__'로 해놓았기 때문에 다 보여주고 있습니다. 즉, 이제 model에 종속된 것이 아니라, 이 serializers.py을 통해 컨트롤이 가능합니다. 즉, fields를 제거 같은 유연하게 컨트롤을 할 수 있는 것입니다.
Postman
자, 저렇게 만들고 실제로 값을 어떻게 불러올까?
먼저, my_program.py를 만듭니다.(app x, project x, manage.py가 있는 경로에)
그리고 이렇게 쓰면, 저렇게 request를 보내게 됩니다. 그리고 response의 json()으로 값을 불러오게 되면 실제로 값을 전부 불러옵니다. 그런데 이렇게 request를 하기 위해 파일 하나하나를 보내는게 맞을까요? 아닙니다.
저렇게해서 state code 200을 받는게 맞을까요? 아닙니다. 그것을 위해 postman을 씁니다. 그래서 postman이 뭐다? - 개발자가 API를 디자인, 테스트, 문서화, 공유를 할 수 있도록 도와주는 소프트웨어입니다. - API 테스트, 환경 관리, 협업 등을 위한 강력한 기능을 제공하여 보다 효율적으로 API를 개발하고 테스트 할 수 있게 도와줍니다.
그래서 다운받고 키고, create collection을 누르고 여기서 이제 request를 하나씩 정의합니다.(저기 add new request 클릭)