5.1 Todo ๋ชฉ๋ก API ์์ํ๊ธฐ
5.2 Todo ์ ์ฒด ์กฐํ API ๋ง๋ค๊ธฐ
5.3 Todo ์์ธ ์กฐํ API ๋ง๋ค๊ธฐ
5.4 Todo ์์ฑ API ๋ง๋ค๊ธฐ
5.5 Todo ์์ API ๋ง๋ค๊ธฐ
5.6 Todo ์๋ฃ API ๋ง๋ค๊ธฐ
5.1 Todo ๋ชฉ๋ก API ์์ํ๊ธฐ
DRF๋ฅผ ํ์ฉํด ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ฐ๋ฐํ ํ๋ก์ ํธ๋ Todo ๋ชฉ๋ก ์๋น์ค ์ ๋๋ค.
5.1.1 Django ๊ธฐ๋ฐ Todo ๋ชฉ๋ก ์น ์๋น์ค ๋ณต์ต
์ฐ๋ฆฌ๊ฐ ์์ ์ ํ๋ Todo ์๋น์ค๋ ์๋ฃ๋์ง ์์ Todo์ ์๋ฃ๋ ๊ฒ์ ๋๋ ์ ๋ชฉ๋ก์ผ๋ก ๋ณผ ์ ์์๊ณ , Todo์ ๋ํ ๋ชฉ๋ก ๋ฐ ์์ธ ์กฐํ๊ฐ ๊ฐ๋ฅํ์ต๋๋ค. ๋น์ฐํ ์์ ๊ธฐ๋ฅ๋ ์์๊ณ , Todo๋ฅผ ์๋ฃ์ํค๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ์์ต๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ Todo ์๋น์ค๋ฅผ ํ๋ก ํธ ์์ญ๊ณผ ๋ถ๋ฆฌ์์ผ,
API์ ํํ๋ก ๊ฐ๋ฐํ๋ ค๊ณ ํฉ๋๋ค. โญ๏ธ
5.1.2 ํ๋ก์ ํธ ์์ฑํ๊ธฐ
๊ฐ์ํ๊ฒฝ ์ธํ
django-admin startproject mytodo .
5.1.4 Todo ๋ชจ๋ธ ์์ฑํ๊ธฐ
๋ชจ๋ธ์ ์์ ๊ฐ๋ฐํ Todo ์๋น์ค์ ๋์ผํฉ๋๋ค.
๊ฐ๋ฐ๋๋ ํํ๋ง ๋ฌ๋ผ์ก์ ๋ฟ, ๋ค๋ฃจ๋ ๋ฐ์ดํฐ๋ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์์ ์์ฑํ ๋ชจ๋ธ์ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ธ ์ ์์ต๋๋ค.
5.2 Todo ์ ์ฒด ์กฐํ API ๋ง๋ค๊ธฐ
Todo ์ ์ฒด ์กฐํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํด ๋ณด๊ฒ ์ต๋๋ค.
5.2.1 Todo ์ ์ฒด ์กฐํ ์๋ฆฌ์ผ๋ผ์ด์ ๋ง๋ค๊ธฐ
DRF ๊ฐ๋ฐ์ ์ฒซ ๋จ๊ณ๋?
-> ์๋ฆฌ์ผ๋ผ์ด์ ๊ฐ๋ฐ์ ๋๋ค.
์๋ฆฌ์ผ๋ผ์ด์ ๋ ์์์ ๋ดฃ๋ ๊ฒ ์ฒ๋ผ,
๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํํ๋ก ๋ณด๋ด๊ณ , ๋ฐ๊ธฐ ์ํ ์ผ์ข ์ ์์์ ๋๋ค.
๋ฐ๋ผ์ ๋ณด๋ด๊ณ ๋ฐ๋ ํํ์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ฆฌ์ผ๋ผ์ด์ ๊ฐ ํ์ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ๋ก ๊ฐ๋ฐํ ์๋ฆฌ์ผ๋ผ์ด์ ๋ ์ ์ฒด ์กฐํ์ฉ ์๋ฆฌ์ผ๋ผ์ด์ ์ธ๋ฐ,
์ ์ฒด ์กฐํ์์๋ Todo ์ค๋ช ์ ์ ์ธํ
์ ๋ชฉ, ์๋ฃ ์ฌ๋ถ, ์ค์ ์ฌ๋ถ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์
์ด๋ค๋ง์ ํฌํจํ ๊ฐ๋จํ ์๋ฆฌ์ผ๋ผ์ด์ ๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค.
serializers.ModelSerializer๋ฅผ ํ์ฉํด(๋งค๊ฐ๋ณ์๋ก)
๊ฐ๋จํ ์๋ฆฌ์ผ๋ผ์ด์ ๋ฅผ ์์ฑํ์ผ๋ฉฐ,
TodoSimpleSerializer๋ผ๊ณ ์ด๋ฆ ๋ถ์์ต๋๋ค.
TodoSimpleSerializer๋ Todo ๋ชจ๋ธ์ id, title, complete, important ํ๋๋ฅผ ์ง๋ ฌํํ๊ณ ์ญ์ง๋ ฌํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด Todo ๋ชจ๋ธ์ ์ธ์คํด์ค๋ฅผ JSON ํ์์ผ๋ก ๋ณํํ๊ฑฐ๋ JSON ๋ฐ์ดํฐ๋ฅผ Todo ๋ชจ๋ธ์ ์ธ์คํด์ค๋ก ๋ณํํ ์ ์์ต๋๋ค.
Todo ์ ์ฒด ์กฐํ ๋ทฐ ๋ง๋ค๊ธฐ
๋ค์์ ๋ทฐ ์ ๋๋ค. ์ด๋ฒ ํ๋ก์ ํธ์์๋ Todo ์๋ฃ ๋ฐ ์กฐํ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์
ViewSet๋ณด๋จ APIView๋ฅผ ํ์ฉํด ํ๋ ํ๋
์ง์ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ฒ ์ต๋๋ค.
์ ์ฒด ์กฐํ ๋ทฐ๋ GET๋ฐฉ์์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๋ฐ๋ผ์ TodosAPIView๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ
๋ด๋ถ์ get ๋ฉ์๋์์ complete์ด False์ธ Todo๋ค์ ํํฐ๋งํ๋๋ก ํฉ๋๋ค.
์ดํ ์๋ฆฌ์ผ๋ผ์ด์ ๋ฅผ ํต๊ณผ์์ผ ๋ณด๋ผ ์ ์๋ ํํ๋ก ๋ณํํ ๋ค์,
์ด๋ฅผ Response ๊ฐ์ฒด ํํ๋ก ์ ๋ฌํ๋ ๊ณผ์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
์ด ์ฝ๋๋ ํ ์ผ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ๋จ์ํ API ๋ทฐ๋ฅผ ์ ์ํ๊ณ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ํด๋น API ์๋ํฌ์ธํธ๋ก GET ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ฏธ์๋ฃ๋ ํ ์ผ๋ค์ ๋ชฉ๋ก์ JSON ํ์์ผ๋ก ๋ฐํํฉ๋๋ค.
5.2.3 Todo ์ ์ฒด ์กฐํ URL ์ฐ๊ฒฐํ๊ธฐ
์ด์ URL๋ง ์ฐ๊ฒฐํ๋ฉด ๋๋๊ฒ๋ ๊ตฌํ์ด ์๋ฃ๋ฉ๋๋ค.
TodosAPIView ํด๋์ค๋ todo/์ ์ฃผ์๋ฅผ ํ ๋นํ๊ฒ ์ต๋๋ค.
์ดํ ๊ฐ๋ฐํ ๋ค๋ฅธ ๋ฉ์๋๋ ํด๋น ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
5.2.4 Todo ์ ์ฒด ์กฐํ API ํ ์คํธํ๊ธฐ
๊ด๋ฆฌ์ ํ์ด์ง์ ๋ค์ด๊ฐ ๋ฏธ๋ฆฌ Todo๋ฅผ ์ถ๊ฐํด๋์ต๋๋ค.
๋๋ต ์์ ๊ฐ์ ํํ๋ก ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
-> ์ฑ ์ ์๋ ๋ถ๋ถ... ํใ ใ ใ ใ
-> ๋นผ๋จน์ผ๋ฉด 404์๋ฌ๊ฐ ๋๋ ์ฃผ์
์์ ์ฌ์ฉํ๋ Insomnia ๋๊ตฌ๋ฅผ ์ผ์ API ํ ์คํธ๋ฅผ ์งํํ๊ฒ ์ต๋๋ค.
GET์์ฒญ์ผ๋ก 127.0.0.1:8000/todo/์ ์์ฒญ์ ๋ณด๋ด๊ฒ ์ต๋๋ค.
5.3 Todo ์์ธ ์กฐํ API๋ง๋ค๊ธฐ
Todo ์์ธ ์กฐํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํด ๋ณด๊ฒ ์ต๋๋ค.
5.3.1 ์์ธ ์กฐํ์ฉ Todo ์๋ฆฌ์ผ๋ผ์ด์ ๋ง๋ค๊ธฐ
์ด๋ฒ์๋ Todo ์์ธ ์กฐํ์ฉ ์๋ฆฌ์ผ๋ผ์ด์ ์ ๋๋ค.
์์ ๊ฐ๋ฐํ ์๋ฆฌ์ผ๋ผ์ด์ ๊ฐ TodoSimpleSerializer์์ผ๋
์ด๋ฒ์๋ TodoDetailSerializer๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ฐ๋ฐํ๊ฒ ์ต๋๋ค.
ํ๋๋ Todo ๋ชจ๋ธ์ ๋ชจ๋ ํ๋๋ก ์ค์ ํ๋ฉด ๋๊ฒ ์ต๋๋ค.
5.3.2 Todo ์์ธ ์กฐํ ๋ทฐ ๋ง๋ค๊ธฐ
์์ธ ์กฐํ ๋ทฐ ์ญ์ GET๋ฐฉ์์ผ๋ก ํต์ ํฉ๋๋ค.
์ ์ฒด ์กฐํ(TodoAPIView)์๋ ์ฃผ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ๊ตฌ๋ถํด์ผํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ค๋ฅผ ๊ธฐ์ค์ผ๋ก URL์ ๋ถ๋ฆฌํ๋ค๊ณ ์๊ฐํ๋ฉด ํธํฉ๋๋ค.
: ๊ฐ์ ํด๋์ค -> ๊ฐ์ URL
get_object_or_404() ํจ์๋ ์ฃผ์ด์ง ๋ชจ๋ธ(Todo)์์ ์ฃผ์ด์ง ์กฐ๊ฑด(id=pk)์ ํด๋นํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ, ํด๋น ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ 404 ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. ๋ฐ๋ผ์ ์ด ์ฝ๋๋ pk์ ํด๋นํ๋ Todo ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
TodoDetailSerializer๋ todo ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ๊ธฐ ์ํ ์๋ฆฌ์ผ๋ผ์ด์ ์ ๋๋ค. ์๋ฆฌ์ผ๋ผ์ด์ ๋ Python ๊ฐ์ฒด๋ฅผ JSON ๋ฑ์ ํ์์ผ๋ก ๋ณํํ๊ฑฐ๋, ๋ฐ๋๋ก JSON ๋ฑ์ ํ์์ Python ๊ฐ์ฒด๋ก ๋ณํํ๋ ์ญํ ์ ํฉ๋๋ค. serializer.data๋ todo ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ ๋๋ค.
5.3.3 Todo ์์ธ ์กฐํ URL ์ฐ๊ฒฐํ๊ธฐ
TodoAPIView๋ ํน์ Todo์ id๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ๋ถ๋๋ฏ๋ก -> PK
todo// ์ฃผ์์ TodoAPIVIEW๋ฅผ ํ ๋นํ๊ฒ ์ต๋๋ค.
5.3.4 Todo ์์ธ ์กฐํ API ํ ์คํธ ํ๊ธฐ
์ด๋ฒ์๋ GET์์ฒญ์ ๋ณด๋ด๊ฒ ์ต๋๋ค.
5.4 Todo ์์ฑ API ๋ง๋ค๊ธฐ
Todo ์์ฑ API๋ฅผ ๊ฐ๋ฐํด๋ณด๊ฒ ์ต๋๋ค.
5.4.1 ์์ฑ์ฉ Todo ์๋ฆฌ์ผ๋ผ์ด์ ๋ง๋ค๊ธฐ
Todo ์์ฑ์ ํ์ํ ์ ๋ ฅ ๊ฐ์ title๊ณผ description, important ๋ฟ์ ๋๋ค.
๋๋จธ์ง ํ๋๋ ์๋์ผ๋ก ์ฑ์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
TodoCreateSerializer์๋ 3๊ฐ์ ํ๋๋ง ์์ฑํด๋์ผ๋ฉด ๋ฉ๋๋ค.
5.4.2 Todo ์์ฑ ๋ทฐ ๋ง๋ค๊ธฐ
Todo ์์ฑ์ /todo URL์์ ๋์ํ ๊ฒ์ ๋๋ค.
ํน์ Todo ์ id๊ฐ ํ์์๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ Todo ์์ฑ ๋ทฐ๋ TodosAPIView ํด๋์ค ๋ด์ ํฌํจ๋ ์ ์์ต๋๋ค.
Todo ์์ฑ์ POST ๋ฐฉ์์ผ๋ก ํต์ ํ๋๋ก ์์ฑํ ์ ์์ต๋๋ค.
from rest_framework import status
from rest_framework.generics import get_object_or_404
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import viewsets
from .models import Todo
from .serializers import TodoSimpleSerializer, TodoDetailSerializer, TodoCreateSerializer
class TodosAPIView(APIView):
def get(self, request):
todos = Todo.objects.filter(complete=False)
serializer = TodoSimpleSerializer(todos, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
serializer = TodoCreateSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
5.4.3 Todo ์์ฑ URL ์ฐ๊ฒฐํ๊ธฐ
์์ TodosAPIView์ ๋ํ URL์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์์ ์ ํ์ ์์ต๋๋ค.
-> ๊ทธ๋๋ก
5.4.4 Todo ์์ฑ API ํ ์คํธํ๊ธฐ
์์ฑ API ํ ์คํธ๋ฅผ ์ํด POST ์์ฒญ์ผ๋ก 127.0.0.1:8000/todo/์ ์์ฒญ์ ๋ณด๋ด๋ฉฐ,
Body์๋ JSON ํํ๋ก ๊ฐ์ ์ฑ์๋ฃ์์ต๋๋ค.
์ฐ๋ฆฌ๋ title, description ๊ทธ๋ฆฌ๊ณ ํ์์ ๋ฐ๋ผ important๋ง ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
์์ฑ์ด ์ ๋์๋์ง ์ ์ฒด ์กฐํ API๋ก ํ์ธํด๋ณด๋ฉด ์ ์ฒด ์กฐํ๊ฐ ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
5.5 Todo ์์ API ๋ง๋ค๊ธฐ
Todo ์์ API๋ฅผ ๊ฐ๋ฐํด๋ณด๊ฒ ์ต๋๋ค.
5.5.1 Todo ์์ ๋ทฐ ๋ง๋ค๊ธฐ
Todo ์์ API๋ ์์ ์์ฑํ Todo ์์ฑ๊ณผ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
๋์ผํ ํ๋๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ์๋ฆฌ์ผ๋ผ์ด์ ๋ ๋ฐ๋ก ์์ฑํ ํ์ ์์ด TodoCreateSerializer๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Todo ์์ ์ ํน์ Todo์ ๋ํด ์ด๋ค์ง๋ฏ๋ก TodoAPIView ํด๋์ค์ ํฌํจ์ํค๋ฉด ๋๊ฒ ์ต๋๋ค.
from rest_framework import status
from rest_framework.generics import get_object_or_404
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import viewsets
from .models import Todo
from .serializers import TodoSimpleSerializer, TodoDetailSerializer, TodoCreateSerializer
class TodoAPIView(APIView):
def get(self, request, pk):
todo = get_object_or_404(Todo, id=pk)
serializer = TodoDetailSerializer(todo)
return Response(serializer.data, status=status.HTTP_200_OK)
def put(self, request, pk):
todo = get_object_or_404(Todo, id=pk)
serializer = TodoCreateSerializer(todo, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
์์ ๊ธฐ๋ฅ์ put ๋ฉ์๋ ํํ๋ก ์์ฑํ ์ ์์ต๋๋ค.
ํน์ Todo๋ฅผ ์ฐพ์์ ์์ฒญ์ผ๋ก ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฆฌ์ผ๋ผ์ด์ ์ ํต๊ณผ์์ผ ์ ์ฅํ๋ ๋ฐฉ์
5.5.2 Todo ์์ URL ์ฐ๊ฒฐํ๊ธฐ
์ญ์ TodoAPIView๋ ์ด๋ฏธ URL์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก ์ถ๊ฐ์ ์ธ ์ฐ๊ฒฐ์์ ์ ํ์ ์์ต๋๋ค.
-> ์ด์ ์ฝ๋์ ๋์ผ
5.5.3 Todo ์์ API ํ ์คํธํ๊ธฐ
์์ ํ์ฌ ์์ฒญ์ ๋ณด๋ด๋๋๋ค.
์์ ์ด ์ ๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
5.6 Todo ์๋ฃ API ๋ง๋ค๊ธฐ
๋ง์ง๋ง์ผ๋ก Todo ์๋ฃ API๋ฅผ ๊ฐ๋ฐํด๋ณด๊ฒ ์ต๋๋ค.
5.6.1 Todo ์๋ฃ ๋ทฐ ๋ง๋ค๊ธฐ
Todo ์๋ฃ ๊ธฐ๋ฅ๋ง ๊ฐ๋ฐํ๋ฉด Todo ํ๋ก์ ํธ๋ ๋ง๋ฌด๋ฆฌ ๋ฉ๋๋ค.
Todo ์๋ฃ API๋ ๋ณ๋์ ํด๋์ค์ ์์ฑํ ๊ฒ ์ด๋ฉฐ,
์ญ์ ์๋ฃ ๋ชฉ๋ก ์กฐํ์ฉ API์
ํน์ Todo ์๋ฃ API๊ฐ ํ์ํฉ๋๋ค.
๊ฐ API๋ Todo id ํ์ ์ฌ๋ถ์ ๋ฐ๋ผ ์ฃผ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ฒ๊ฑฐ๋กญ์ง๋ง ๊ฐ๊ฐ ํ๋์ ํด๋์ค๋ก ์์ฑํด์ผ ํฉ๋๋ค.
๋ค์์ ์๋ฃ Todo๋ชฉ๋ก ์กฐํ์ฉ API์ ๋๋ค.
์ด ์ฝ๋๋ GET ์์ฒญ์ ๋ฐ์ผ๋ฉด ์๋ฃ๋ ํ ์ผ ๊ฐ์ฒด๋ค์ ์ง๋ ฌํํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ JSON ํ์์ ์๋ต์ผ๋ก ๋ฐํํฉ๋๋ค. ์๋ต์ HTTP ์ํ ์ฝ๋ 200(์ฑ๊ณต)๊ณผ ํจ๊ป ์ ์ก๋ฉ๋๋ค.
5.6.2 Todo ์๋ฃ ์กฐํ ๋ทฐ ๋ง๋ค๊ธฐ
๋ค์์ Todo ์๋ฃ API์ ๋ทฐ ์ ๋๋ค.
5.6.3 Todo ์๋ฃ URL ์ฐ๊ฒฐํ๊ธฐ
5.6.4 Todo ์๋ฃ API ํ ์คํธ ํ๊ธฐ
์์ฒญ์ ๋ณด๋ด๋ฉด ๊ธฐ์กด์ ์๋ Done ๋ชฉ๋ก์ด ๋ํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
chapter5 ๋ง์นฉ๋๋ค.