Django를 사용한다면, 반드시 알아야하는 Django Rest Framework에 대해 공부해보자!
전체적인 개념만 훑고, 실 사용 방식은 따로 정리해야겠다!
✔️ Rest란?
Representational State Transfer이라는 용어의 약자이다.
✔️ Rest의 구성
: 자원(Resource) => URI
행위(Verb) => HTTP Method
표현(Representations)
✔️ Rest의 특징
1) Uniform (유니폼 인터페이스)
Uniform Interface는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말합니다.
2) Stateless (무상태성)
REST는 무상태성 성격을 갖습니다. 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않습니다. 세션 정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 됩니다. 때문에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해집니다.
3) Cacheable (캐시 가능)
REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용이 가능합니다. 따라서 HTTP가 가진 캐싱 기능이 적용 가능합니다. HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능합니다.
4) Self-descriptiveness (자체 표현 구조)
REST의 또 다른 큰 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체 표현 구조로 되어 있다는 것입니다.
5) Client - Server 구조
REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됩니다.
6) 계층형 구조
REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 합니다.
✔️ Rest API 사용 예시
Category name을 생성/조회/수정/삭제하는 http method를 작성해야한다면?
ex)
http method: GET url: /categoryname => 카테고리 이름을 나타내기
http method: POST url: /categoryname => 카테고리 이름을 추가
http method: PUT url: /categoryname => 카테고리 이름을 변경
http method: DELETE url: /categoryname => 카테고리 이름을 삭제
✔️django-Rest-Framework
:
Restful한 api를 django를 통해 쉽게 만드는 방식
✔️ api : Application Programming Interface
애플리케이션 소프트웨어를 구축하고 통합하기 위한 정의 및 프로토콜 세트
✔️ serializer
:
models 객체와 queryset같은 복잡한 데이터를 JSON, XML과 같은 native data로 바꿔주는 역할
각 모델 별로 serializer.py
파일을 만들고, 그 안에 모델을 import 해와
공통으로 들어가는 내용들을 기입해준다.
view의 request.body
에 해당 내용을 불러오면 유용하게 사용할 수 있다.
✔️ JSON은 ? JavaScript Object Notation
Key와 Value로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷.
✔️ XML
: 텍스트 데이터 형식으로 유니코드를 사용해 전세계 언어를 지원한다.
✔️ viewset
:
여러 뷰에 들어가는 공통적인 행위를 그룹화하여 간결하게 사용 가능. viewset을 router에 연결하면 url을 자동으로 맵핑해주기 때문에 편리하게 이용할 수 있다!
(2개의 url 하나의 클래스에서 처리할 수 있음)
✔️ Swagger
:
django에서 제공하는 API 문서 작업화를 도와주는 툴. 직접 테스트도 가능한 Postman같은 존재...! Response의 각 object를 확인하기가 조금 불편하다는 단점이 있다.
✔️ API View
:
rest_framework.views에서 import 하고 class에서 불러와 사용하는 형태.
하나의 url만 처리가 가능하다! Rest_framework의 request instance.
(response를 반환한다)
ex)
from rest_framework.views import APIView
class RecruitListView(APIview) :
django rest framework를 사용하려면, 터미널에서
pip install djangorestframework
설치를 한다.
settings.py
의 Installed_APP에 'rest_framework'
와 framework를 추가할 모델을 각각 추가해준다.
📌 Models.py 작성하기
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=144)
subtitle = models.CharField(max_length=144, blank=True)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return '[{}] {}'.format(self.user.username, self.title)
Models.py는 특별히 다른 것은없다!
📌 Serializer.py 작성하기
from rest_framework import serializers
from .models import Post
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
class PostSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
class Meta:
model = Post
fields = (
'id',
'title',
'subtitle',
'content',
'created_at',
)
read_only_fields = ('created_at',)
: serializers와 models를 import해오고,
serializer class를 생성하여 class Meta값까지 불러와준다. Serializer 파일은 User와 Post로 크게 나누어진다.
UserSerializer class는 class Meta를 이용해 User Model을 불러오고,
Id, username, email 3가지의 field로 이루어져 있다.
PostSerializer는 userSerializer를 불러와 값을 읽어오고,
class Meta 안에 불러올 내용을 field로 지정해준다.
from rest_framework import viewsets
from .serializers import PostSerializer
from .models import Post
from rest_framework import permissions
class PostView(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = (permissions.IsAuthenticated,)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
: 뷰가 엄청 간단해졌다!
serializer와 model, rest_framework의 Permissions까지 import 해온다.
queryset으로 Post를 모두 불러오고, form 형태를 함수를 통해 create하고 저장해준다.
아직은 개념이 명확하지는 않아서 Udemy 강의를 결제했다.
기업협업동안 DRF를 완벽하게 익히는 것을 목표로! 부지런히 공부해보자!
참고자료(출처) :
https://meetup.toast.com/posts/92
https://berkbach.com/%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%82%B4%ED%8E%B4%EB%B3%B4%EB%8A%94-rest-api-79422dfc0a7d
https://berkbach.com/restful-api-in-django-16fc3fb1a238