티스토리 뷰

INTRO

- REST 용어

- API 용어

- Django REST Framework 용어

- ModelForm vs ModelSerialzer 비교

 

# Restfull API server 기능 구현하기

- CBV(Class Based View)와 FBV(Function Based View) CRUD Control 비교
    Create : 생성(POST)
    Read : 조회(GET)
    Update : 수정(PUT)
    Delete : 삭제(DELETE)

 

 

용어설명

Representational State Transfer (REST) : service-architecture.com 원문 번역

 네트워크 리소스를 정의하고 처리하는 방법을 설명하는 일련의 원칙을 기반으로 하는 아키텍처 스타일입니다. 이러한 원칙은 2000년 Roy Fielding이 박사 학위 논문의 일부로 처음 설명했습니다. REST는 SOAP 및 JSON(JavaScript Object Notation)의 대안입니다.

 REST는 일련의 표준과 대조되는 소프트웨어 아키텍처 스타일이라는 점에 유의하는 것이 중요합니다. 결과적으로 이러한 애플리케이션 또는 아키텍처를 RESTful 또는 REST 스타일 애플리케이션 또는 아키텍처라고도 합니다. REST는 웹 서비스 구현에 널리 사용되는 선택임이 입증되었습니다. 예를 들어, 이러한 많은 기사 페이지의 맨 아래에 제안된 책은 부분적으로 REST 아키텍처를 사용하여 동적으로 생성됩니다. Amazon Web Services의 옵션 중 하나입니다.

 RESTful 또는 REST 스타일로 간주되는 애플리케이션 또는 아키텍처는 다음과 같은 특징이 있습니다.
 - 상태와 기능을 분산 리소스로 나눕니다.
 - 모든 리소스는 균일하고 최소한의 명령 집합을 사용하여 고유하게 주소를 지정할 수 있습니다.

   (일반적으로 인터넷을 통해 GET, POST,   PUT 또는 DELETE의 HTTP 명령 사용)
 - 프로토콜은 클라이언트/서버, 상태 비저장, 계층화 및 캐싱 지원
 - 이것은 본질적으로 인터넷의 아키텍처이며 REST의 인기도와 사용 용이성을 설명하는 데 도움이 됩니다.

 

원문 : https://www.service-architecture.com/articles/web-services/representational-state-transfer-rest.html

 

API(Application Programming Interface) : wiki

 API(Application Programming Interface 애플리케이션 프로그래밍 인터페이스, 응용 프로그램 프로그래밍 인터페이스)는 컴퓨터나 컴퓨터 프로그램 사이의 연결이다. 일종의 소프트웨어 인터페이스이며 다른 종류의 소프트웨어에 서비스를 제공한다. 이러한 연결이나 인터페이스를 빌드하거나 사용하는 방법을 기술하는 문서나 표준은 API 사양으로 부른다. 이 표준을 충족하는 컴퓨터 시스템은 API가 구현(implement)되었다거나 노출(expose)되었다고 말한다. API라는 용어는 사양이나 구현체를 의미할 수 있다.

 컴퓨터와 인간을 연결시키는 사용자 인터페이스와 반대로, API는 컴퓨터나 소프트웨어를 서로 연결한다. 직접 사람(최종 사용자)에 의해 사용되도록 고안된 것이 아니며, 대신 소프트웨어에 이를 통합하고자 하는 컴퓨터 프로그래머가 사용하도록 고안되었다. API는 각기 다른 부분으로 구성되기도 하며 프로그래머가 사용할 수 있는 도구나 서비스의 역할을 한다. 이러한 부분들 중 하나를 사용하는 프로그램이나 프로그래머는 API의 해당 부분을 호출(call)한다고 말한다. API를 구성하는 호출들은 서브루틴, 메소드(method), 요청, 통신 엔드포인트라고도 부른다. API 사양은 이 호출들을 정의하며, 다시 말해 이들을 어떻게 사용하거나 구현하는지를 설명한다는 것을 의미한다.

 API의 한 가지 목적은 시스템이 동작하는 방식에 관한 내부의 세세한 부분을 숨기는 것으로, 내부의 세세한 부분이 나중에 변경되더라도 프로그래머가 유용하게 사용할 수 있고 일정하게 관리할 수 있는 부분들만 노출시킨다. API는 특정 시스템용으로 커스텀하게 빌드될 수도 있고, 아니면 수많은 시스템 간 상호운용성을 허용하는, 공유가 되는 표준일 수도 있다.

 API라는 용어는 웹 API를 의미하기도 하며, 이는 인터넷에 의해 병합된 컴퓨터들 간 통신을 허용한다. 프로그래밍 언어, 소프트웨어 라이브러리, 컴퓨터 운영 체제, 컴퓨터 하드웨어를 위한 API도 존재한다. API는 1940년대에 기원하였으나 이 용어는 1960년대, 70년대 들어서야 모습을 드러냈다.

 

원문 : https://ko.wikipedia.org/wiki/API

 

 

Django REST Framework : django-rest-framework 공홈 원문 번역

 Django REST 프레임워크는 웹 API 구축을 위한 강력하고 유연한 툴킷입니다.

 REST 프레임워크를 사용해야 하는 몇 가지 이유:
 - 웹 탐색 ​​가능 API는 개발자에게 큰 유용성을 제공합니다.
 - OAuth1a 및 OAuth2용 패키지를 포함한 인증 정책.
 - ORM 및 비ORM 데이터 소스를 모두 지원하는 직렬화.
 - 끝까지 사용자 정의 가능 - 보다 강력한 기능이 필요하지 않은 경우 일반 기능 기반 보기를 사용하십시오.
 - 광범위한 문서 및 훌륭한 커뮤니티 지원.
 - Mozilla, Red Hat, Heroku 및 Eventbrite를 비롯한 국제적으로 인정받는 회사에서 사용하고 신뢰합니다

 

원문 : https://www.django-rest-framework.org/

 

Django vs Django REST Framework : ModelForm vs ModelSerialzer 비교

링크 : https://velog.io/@codren/Serializer

 

 

# Restfull API server 기능 구현하기

 web service의 기능 중 데이터 중심 service 방법으로 Django REST Framework(DRF) 오픈소스 라이브러리를 이용해 본다. django form을 이용한 template 표현 방식(참고 : django form을 이용한 MVT 방식의 record CRUD control)과 비교하여 model-serializer를 통한 json 직렬화를 통한 표현 방식과 API_view를 이용한 record CRUD control을 이해한다.

 

django rest framework 설치 및 settings.py 등록

$ pip install djangorestframework 

 

- config/settings.py

INSTALLED_APPS = [
    'rest_framework',

    ....

]

 

- Serializer를 이용하여 model json 직렬화

 python 활용 #13에서 사용한 board app의 model을 활용

board/models.py 수정
class BoardTest(models.Model):
	title   = models.CharField(db_column='title', max_length=200)
	author  = models.CharField(db_column='author', max_length=30)
	article = models.TextField(db_column='article', null=True)
	date    = models.DateTimeField(auto_now_add=True)

	class Meta:
		managed = False
		db_table = 'board_boardtest'
	
	def __str__(self):
		return self.title

$ ./manage.py makemigrations board

$ ./manage.py migrate

 

board/serializers.py
from rest_framework import serializers
from .models import BoardTest


class BoardSerializer(serializers.ModelSerializer):
	
	class Meta:
		model = BoardTest
		fields = "__all__"

 

- CBV(Class Based View)와 FBV(Function Based View) CRUD Control 비교

-1- CBV(Class Based View) APIView CRUD Control

board/views.py
from rest_framework.response import Response
from rest_framework.views import APIView
from django.shortcuts import get_object_or_404

from .models import BoardTest
from .serializers import BoardSerializer


### CBV APIView 
# List, Create
class BoardListAPIView(APIView):
	def get(self, request):
		serializer = BoardSerializer(BoardTest.objects.all(), many=True)
		return Response(serializer.data)

	def post(self, request):
		serializer = BoardSerializer(data=request.data)
		if serializer.is_valid():
			serializer.save()
			return Response(serializer.data, status=201)
		return Response(serializer.errors, status=400)  
      

# Read, Update, Delete
class BoardDetailAPIView(APIView):
	def get_object(self, pk):
		return get_object_or_404(BoardTest, pk=pk)
      
	def get(self, request, pk, format=None):
		board = self.get_object(pk)
		serializer = BoardSerializer(board)
		return Response(serializer.data)
    
	def put(self, request, pk):
		board = self.get_object(pk)
		serializer = BoardSerializer(board, data=request.data)
		if serializer.is_valid():
		    serializer.save()
		    return Response(serializer.data)
		return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
      
	def delete(self, request, pk):
		board = self.get_object(pk)
		board.delete()
		return Response(status=status.HTTP_204_NO_CONTENT)

 

board/urls.py
from django.urls import path
from . import views

app_name = 'board'

urlpatterns = [
    path('cbv/board_list/', views.BoardListAPIView.as_view()),
    path('cbv/board_detail/<int:pk>/',views.BoardDetailAPIView.as_view()),
]

 

browser : localhost:8000/board/cbv/board_list/

 

 

browser : localhost:8000/board/cbv/board_detail/1/

 

-2- FBV(Function Based View) api_view decorator CRUD Control

board/views.py
from django.shortcuts import render, redirect
from django.http import JsonResponse

from rest_framework.response import Response
from django.shortcuts import get_object_or_404
from rest_framework.decorators import api_view

from .models import BoardTest
from .serializers import BoardSerializer


### FBV api_view decorator
@api_view(['GET','POST'])
def board_list(request):
    if request.method == 'GET':
        boards = BoardTest.objects.all()
        serializer = BoardSerializer(boards, many=True)
        return Response(serializer.data)
    else:
        serializer = BoardSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

@api_view(['GET','PUT','DELETE'])
def board_detail(request, pk):
    board = get_object_or_404(BoardTest, pk=pk)
    if request.method == 'GET':
        serializer = BoardSerializer(board)
        return Response(serializer.data)
    elif request.method == 'PUT':
        serializer = BoardSerializer(board, data=reqeust.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    else:
        board.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

board/urls.py
from django.urls import path
from . import views

app_name = 'board'

urlpatterns = [
    path('fbv/board_list/', views.board_list), 
    path('fbv/board_detail/<int:pk>/',views.board_detail),    
]

 

 

browser : localhost:8000/board/fbv/board_list/

 

browser : localhost:8000/board/fbv/board_detail/1/

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함