CS keyword) Restful api

Mongle·2020년 8월 5일
0

DjangoBoard

목록 보기
7/7

😺 Restful api

Restful api란,

어플리케이션을 만드는 다양한 언어가 존재하는데 각각의 플랫폼을 모두 만족시키는 서버가 없기 때문에 한 서버에서 모든 플랫폼의 요청을 받고 응답을 보내주기위해 약속을 정하여 고유한 식별자로 하나의 서버가 여러 플랫폼과 통신할 수 있게 만들어 주는 것.

Rest 기반의 규칙들을 지켜서 설계된 API를 Rest API 혹은 Restful API이라고 한다.
자원을 URI로 표시하고 해당 자원의 상태를 주고 받는 것을 의미한다.

REST의 구성 요소

자원(Resource): URI
행위(Verb): HTTP METHOD
표현(Representations)으로 이루어져 있다.
즉, Rest는 URI를 통해 자원을 표시하고, HTTP METHOD를 이용하여 해당 자원의 행위를 정해주며
그 결과를 받는 것을 말한다.

HTTP METHOD란,
GET, POST, PUT DELETE를 말한다.
get - select
post - insert
put - update
delete - delete

rest api가 정보를 주고받는 형식은?
JSON이다.
JSON = javascript object notation (자바스크립트의 형태를 따라 쓴 것 = 자바스크립트아님)


2020.10.16일 보완

😺 Django REST framework

왜 Django REST framework를 사용해야하는가?

프론트엔드와 백엔드의 완전한 분리를 가능하게하기 위해서이다. Django는 MTV디자인 패턴을 이용해서 프로트엔드와 백엔드 모두 구현이 가능하지만 React JS, View JS 같이 자바스크립트 언어를 이용해서 더 쉽게 퀄리티 높은 프론트엔드를 구현할 수가 있고 DJango의 역할은 프론트로부터 정보를 받고 데이터베이스에 정보를 저장하는 정보 송수신의 역할이 극대화되고 있다. 따라서 정보를 효율적으로 송수신하고 사전 지식이 없는 사람또한 그 흐름을 이해할 수 있게 하기 위해서는 정해진 약속에 따라야하고, 이는 생산성을 높여준다.

코드를 재활용성을 높일 수 있다. 한 페이지에 하나의 클래스나 함수를 할당하게 되면 새로운 페이지를 만들 때 계속 새로운 함수를 만들어야한다. REST framework를 통해서 하나의 웹 페이지가 여러 API로부터 정보를 얻을 수 있게되고 이는 코드의 재활용성을 높여준다.

😺 Django REST framework 사용 예시

1. Models 생성

# api/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)

Post라는 모델을 생성
user, title, subtitle, content, created_at 이라는 컬럼으로 구성되어있는 모델

def __str__(slef)는,
django admin페이지에서 칼럼을 표시하는 방식을 설정해둔 것이다.

2. Serializers 생성


기존 Django를 이용한 웹 개발에서 Django ORM의 Queryset은 Django template로 넘겨지며 HTML로 렌더링되어 Response로 보내지게 된다.
하지만 JSON으로 데이터를 보내야 하는 RESTful API는 HTML로 렌더링 되는 Django template를 사용할 수 없습니다. 그래서 (Queryset을 Nested한?) JSON으로 매핑하는 과정을 거쳐야 하는데, 이 작업을 지금 작성할 Serializer이 하게 됩니다.

Django REST framework가 제공하는 ModelSerializer를 사용하면 된다.

# api/serializers.py
from rest_framework import serializers
from .models import Post
from django.contrib.auth.models import User

# User 모델과 관련된 데이터를 JSON으로 매핑하는 과정
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email')

# POST 모델과 관련된 데이터를 JSON으로 매핑하는 과정
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',)

3. Views 생성

이제 실질적으로 Queryset을 컨트롤하고 데이터를 조작해 Serializer을 통해 매핑시켜주는 View를 작성할 수 있다. 여러개의 뷰를 작성하지 않고, Viewset을 이용해 Model 하나를 컨트롤하는 CRUD를 1개의 View로 구현할 수 있다.

# api/views.py
from rest_framework import viewsets
from .serializers import PostSerializer
from .models import Post
from rest_framework import permissions

# 하나의 View로 구현
class PostView(viewsets.ModelViewSet):
    queryset = Post.objects.all() # Post모델의 모든 칼럼
    serializer_class = PostSerializer # serializer 가져오기
    permission_classes = (permissions.IsAuthenticated,)
    
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

4. URL mapping

한 자원을 아우르는 CRUD는 크게 2가지 URL패턴(list, detail)으로 분리되기 때문에 각각 따로 매핑 시켜주어야 합니다.

# api/urls.py
from django.urls import path, include
from rest_framework.urlpatterns import format_suffix_patterns
from .views import PostView

post_list = PostView.as_view({
    'post': 'create',
    'get': 'list'
})
post_detail = PostView.as_view({
    'get': 'retrieve',
    'put': 'update',
    'patch': 'partial_update',
    'delete': 'destroy'
})

# django REST framework에서 제공하는 format_suffix_patterns
urlpatterns = format_suffix_patterns([
    path('auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('posts/', post_list, name='post_list'),
    path('posts/<int:pk>/', post_detail, name='post_detail'),
])

참고자료
RESTful API in Django
Django REST API의 필요성과 간단한 사용 방법

profile
https://github.com/Jeongseo21

0개의 댓글