FastAPI, Flask
FastAPI์ Flask๋ Python์ ํ๋ ์์ํฌ๋ค.
FastAPI
- ์์ ํซํ ํ๋ ์์ํฌ!
- ์ฑ๋ฅ, ๋น ๋ฅธ ์ฝ๋ฉ, ์๋ํ๋ API๋ฌธ์ ์์ฑ
- ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์ง์
- NodeJS์ ๋น์ทํ ์์ค์ ์ฑ๋ฅ์ด๋ฉฐ Flask์ Django๋ณด๋ค ํจ์ฌ ๋น ๋ฆ
Flask
- ๊ฐ๋ฒผ์ด ์น ์ดํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ
- ๊ธฐ๋ณธ์ ์ธ ํ์ ๊ธฐ๋ฅ๋ค๋ง ํฌํจํ๊ณ ์์ผ๋ฉฐ ํ์์ ๋ฐ๋ผ ํ์ฅํ ์ ์๋ค.
- ๊ฐ๋จํจ(๊ฒฝ๋ํ), ์ ์ฐ์ฑ
FastAPI, Django, Flask์ค์์ ๋ญ ์ ํํ๋๋?
- ์ ์ผ ๋์ธ๋ FastAPI
- ๊ท๋ชจ๊ฐ ์ข ์๋ ํ๋ก์ ํธ๋ Django
์ ๋๋ก ์ ๋ฆฌํด๋ณด๋ฉด,
๋ผ์ดํธํ ํ๋ก์ ํธ: FastAPI
์ข ๋ ํค๋นํ: Node-Express
๋ณดํต: Django
๊ตญ๊ฐ: Java-Spring
์ฐธ๊ณ ๋ก ChatGPT์ ๋ฑ์ฅ์ผ๋ก ์๋ฐ์คํ๋ง์ ์ํ๊ณ์ ์ด์์ด ์๊ฒผ๋ค.
ํ์ง๋ง Python, Django๋ ์๋ ์์ผ๋๊น...ใ
ใ
DRF
์ค๋๋ง์ ์งํํ๋ DRF์์
์ด๋ค.
์ค์ ์๊ฐ์ ํํธ์ฑ ์ํ์ด ์์๊ธฐ๋๋ฌธ์ ๊ฐ๋จํ ์ค์ต๋ง ์งํํ๋ค.
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Post
# @api_view(["GET"])
# def blog_list(request):
# blogs = Post.objects.all()
# serializer = []
# for blog in blogs:
# serializer.append(
# {
# "title": blog.title,
# "content": blog.content,
# "created_at": blog.created_at,
# "updated_at": blog.updated_at,
# }
# )
# return Response(serializer)
# @api_view(["POST"])
# def blog_list(request):
# blogs = Post.objects.all()
# serializer = []
# for blog in blogs:
# serializer.append(
# {
# "title": blog.title,
# "content": blog.content,
# "created_at": blog.created_at,
# "updated_at": blog.updated_at,
# }
# )
# return Response(serializer)
# @api_view(["GET", "POST"])
# def blog_list(request):
# if request.method == "GET":
# return Response("hello 1")
# elif request.method == "POST":
# return Response("hello 2")
# @api_view(["GET", "POST", "PUT", "DELETE"])
def blog_list(request):
if request.method == "GET":
return Response("hello 1")
elif request.method == "POST":
return Response("hello 2")
elif request.method == "PUT":
return Response("hello 3")
elif request.method == "DELETE":
return Response("hello 4")
serializer๋ฅผ ์ฌ์ฉํ์ง ์๊ณ for๋ฌธ์ผ๋ก ๋๋ ค์ค ์ฝ๋๋ค.
์๋๋ serializer๋ฅผ ์ฌ์ฉํ ์ฝ๋.
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Post
from rest_framework import serializers
from drf_spectacular.utils import extend_schema
# views.py ์์ ์ ํตํด api/schema/swagger-ui ๋ฌธ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ์์
# ์ด ์ฝ๋๋ ์๋ .serializers.py๋ก ์์ฑ์ด ๋์์ด์ผ ํ๋ ํ์ผ์
๋๋ค.
class PostSerializer(serializers.Serializer):
title = serializers.CharField()
content = serializers.CharField()
@extend_schema(
methods=["GET", "POST"],
request=PostSerializer,
responses={200: PostSerializer(many=True)},
)
@api_view(["GET", "POST"])
def blog_list(request):
serializer = PostSerializer(Post.objects.all(), many=True)
return Response(serializer.data)
๋ง์ฝ GET๋ง ๋ฐ๊ณ ์ถ๋ค๋ฉด POST๋ฅผ ์ง์ฐ๊ณ GET๋ง ์ ์ด์ฃผ๋ฉด ๋๋ค.
๊ฐ์ธํ๋ก์ ํธ๋ฅผ DRF๋ก ์งํํ๋ฉด ์๊ฐ์ด ๊ฝค ๊ฑธ๋ฆด๋ฏํ๋ค;;
TDD
'Test-Driven Development' ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ.
์๋น์ค๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ test case๋ฅผ ๋จผ์ ์์ฑํ๊ณ , ์ด๋ฅผ ํต๊ณผํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ค.
์๋น์ค์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ด์ ์ด ํฌ๋ค๊ณ ํ๋ค.
Python์ ๋ด์ฅํจ์์ธ unittest
๋ฅผ ์ด์ฉํ๋ค.
์๋์ ๊ฐ์ด ๋ค์ํ ๋ฉ์๋๋ค์ด ์๋๋ฐ, assertEqual(์ธ์1, ์ธ์2)
๋ง ์๊ณ ์์ด๋ ์ถฉ๋ถํ๋ค.
import unittest
class TestAdd(unittest.TestCase):
def test_add(self):
print(dir(self)) # ์ด๊ฑธ๋ก ์ด๋ค ๋ฉ์๋๊ฐ ์๋์ง ํ ๋ฒ ์ญ ๋์ผ๋ก ํ์ธํด๋ณด์ธ์.
self.assertEqual(1 + 2, 3) # ๊ฐ์์ง ํ๋ณ
self.assertTrue(10 == 10) # True์ธ์ง ํ๋ณ
self.assertFalse(1 == 10) # False์ธ์ง ํ๋ณ
self.assertGreater(10, 1) # ์์ ๊ฒ์ด ๋ค์ ๊ฒ๋ณด๋ค ํฐ์ง
self.assertLess(1, 10) # ์์ ๊ฒ์ด ๋ค์ ๊ฒ๋ณด๋ค ์์์ง
self.assertIn(1, [1, 2, 3, 4, 5]) # ํฌํจํ๊ณ ์๋์ง
self.assertIsInstance('a', str) # ์ธ์คํด์ค์ธ์ง
if __name__ == '__main__':
unittest.main()
์ฐธ๊ณ ๋ก TDD๋ก๋ง ๊ฐ๋ฐํด์ ์ทจ์
ํ์ ๋ถ๋ ๊ณ์๋ค๊ณ ํจ.
๋ฉด์ ๋ ์ข์ ํ๊ฐ๋ฅผ ๋ฐ๊ธฐ ์ข๋ค.