[Python] FastAPI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ REST API ๊ฐœ๋ฐœ

๋ฐ˜์‘ํ˜•

Python ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ REST API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตญ๋‚ด ํ˜น์€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์‚ฌ๋ž‘์„ ๋ฐ›๊ณ  ์žˆ๋Š” Django, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋ฒผ์šด ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์จ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Flask ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ์š”.

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Jetbrains์˜ IDE ๋„๊ตฌ์ธ PyCharm๊ณผ FastAPI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด์„œ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

What is FastAPI?

Python์—์„œ๋Š” ์›น ์„œ๋ฒ„์™€ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด WSGI๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ WSGI๋Š” ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์‚ฌ๋žŒ์ด ๊ณ„์† ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋‹จ์ ์„ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

FastAPI๋Š” Starlette์ด๋ผ๋Š” ๋น„๋™๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ uvloop์ด๋ผ๋Š” Cython์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ libuv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ C ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค๋ฉด ๋”์šฑ ์ข‹์•˜๊ฒ ์ง€๋งŒ Cython์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— libuv๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„ฑ๋Šฅ์ ์ธ ์žฅ์ ์„ ์ „๋ถ€ ์ด์šฉํ•  ์ˆ˜๋Š” ์—†์–ด๋„ Python์—์„œ ๋งŒํผ์€ ๋น ๋ฅธ ํผํฌ๋จผ์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

FastAPI

FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production Documentation: https://fastapi.tiangolo.com Source Code: https://github.com/tiangolo/fastapi FastAPI is a modern, fast (high-performance), web framework for buil

fastapi.tiangolo.com

FastAPI์— ๋Œ€ํ•ด์„œ ๋” ์•Œ์•„๋ณด๊ณ  ์‹ถ์œผ์‹  ๋ถ„๋“ค์€ ์œ„ ๋งํฌ๋ฅผ ํ•œ ๋ฒˆ ๋ณด์‹œ๋Š” ๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

 

 

Recommended Developer

FastAPI๋Š” Flask๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ถ”์ฒœ๋“œ๋ฆฌ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค๋„ Flask์—์„œ ๊ฐœ๋ฐœ ๋ฌธ์„œ๋ฅผ ์ž๋™ํ™” ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ Flask Rest Plus๊ฐ€ ์žˆ์—ˆ๊ณ , ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ณ„๋„์˜ Swagger ๋“ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ API ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ์š”.

 

FastAPI๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Flask-likeํ•œ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • Decorator์™€ ํ•จ์ˆ˜ ์กฐํ•ฉ์˜ API ๊ฐœ๋ฐœ

    Flask์™€ ๋™์ผํ•˜๊ฒŒ Decorator๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ API๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ ๋ฌธ์„œ ์ž๋™ํ™”

    Flask์—์„œ ๊ฐœ๋ฐœ ๋ฌธ์„œ๋ฅผ ์ž๋™ํ™” ํ•˜๊ธฐ ์œ„ํ•ด Flask Rest Plus ๋””ํŽœ๋˜์‹œ๋ฅผ ๋ณ„๋„๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ FastAPI์—์„œ๋„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ž๋™ํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…์ŠคํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ์ œ๊ณต

    Flask์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Application ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ Flask์˜ ํŠน์ง•๋“ค์„ ๋‹ด์€ ์ƒํƒœ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Flask์—์„œ ๋น„๋™๊ธฐ ๊ตฌํ˜„์„ ๋ง์„ค์ด๊ณ  ๊ณ„์‹  ๋ถ„๋“ค์—๊ฒŒ๋Š” ์ตœ๊ณ ์˜ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 

 

 

 

 

Start in PyCharm

๊ทธ๋Ÿฌ๋ฉด PyCharm์„ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ API๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

[tool.poetry]
name = "starletteexample"
version = "0.1.0"
description = ""
authors = ["Neon K.I.D <contact@neonkid.xyz>"]

[tool.poetry.dependencies]
python = "^3.8.5"
uvicorn = "^0.13.2"
fastapi = "^0.63.0"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Poetry๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด์ค๋‹ˆ๋‹ค. ์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Poetry ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด์ฃผ์„ธ์š”.

 

 

[Python] PyCharm์—์„œ Poetry๋ฅผ ์ด์šฉํ•œ ๋””ํŽœ๋˜์‹œ ๊ด€๋ฆฌ

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์‹œ ๋””ํŽœ๋˜์‹œ์˜ ๊ด€๋ฆฌ๋Š” ์ด์ œ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌํƒœ๊นŒ์ง€ Python ์–ธ์–ด๋ฅผ ์ด์šฉํ•ด ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ํ•˜์˜€์„ ๋•Œ๋Š” requirement๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™˜๊ฒฝ๋ณ„๋กœ ๋””ํŽœ๋˜์‹œ ๊ด€๋ฆฌ๋ฅผ ํ–ˆ์—ˆ

blog.neonkid.xyz

๊ธฐ๋ณธ์ ์œผ๋กœ FastAPI๋Š” Python 3.6 ์ด์ƒ์ด ํ•„์š”ํ•˜๋ฉฐ ์„œ๋ฒ„ ์‹คํ–‰์„ ์œ„ํ•ด uvicorn ์›น ์„œ๋ฒ„์™€ FastAPI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ค์น˜ํ•ด์ค๋‹ˆ๋‹ค.

import uvicorn
from fastapi import FastAPI
from fastapi.requests import Request
from starlette.responses import JSONResponse

app = FastAPI()


@app.route('/')
async def homepage(req: Request):
    return JSONResponse({
        'hello': 'world'
    })


if __name__ == '__main__':
    uvicorn.run(app, port=8000)

app.py ํŒŒ์ผ์— ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๊ณ , ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

Test

์œ„์—์„œ ๋งŒ๋“  API๋ฅผ ๊ฐ„๋‹จํžˆ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ๋‚˜์˜จ ๋ฉ”์‹œ์ง€๋Œ€๋กœ http://127.0.0.1:8000 ์ฃผ์†Œ์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

 

Chrome ์ฐฝ์ด ๋‚˜์˜ค๋ฉด์„œ ์ฝ”๋“œ์—์„œ ์ฃผ์–ด์ง„๋Œ€๋กœ hello world๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์œ„์—์„œ ์„ค๋ช…๋“œ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ๋ณธ์ ์œผ๋กœ FastAPI๋Š” ๋ฌธ์„œ ์ž๋™ํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ ์ข…๋ฅ˜๋Š” 2๊ฐ€์ง€์˜ ์›น ์ข…๋ฅ˜์™€ OpenAPI JSON ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋ฉฐ ์›น ์ข…๋ฅ˜๋Š” Swagger UI์™€ Redoc์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ docs URI๋กœ ์ ‘์†ํ•˜๋ฉด Swagger UI๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

 

redoc์˜ ๊ฒฝ์šฐ๋Š” redoc URI๋กœ ์ ‘์†ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋ณด๋‹ค์‹œํ”ผ ๋งŒ๋“  API๊ฐ€ ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ์—์„œ ์•„๋ฌด๋Ÿฐ ๋‚ด์šฉ์ด ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจํ›„ ๋‹ค๋ฅธ ๊ธ€์—์„œ FastAPI๋ฅผ ๊ฐ€์ง€๊ณ  ์–ด๋–ป๊ฒŒ ๋ฌธ์„œ๋ฅผ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

๋งˆ์น˜๋ฉฐ..

FastAPI์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. Python์€ ๋‹ค์†Œ ํผํฌ๋จผ์Šค๊ฐ€ ๋‚ฎ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์„ ๋†’๊ฒŒ ์š”๊ตฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด์„œ๋Š” ๋งŽ์€ ๊ณ ๋ฏผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ์€ Python ๊ณ„์—ด์—์„œ ์›น ๊ฐœ๋ฐœ์‹œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šด ์š”์†Œ์˜€์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ข‹์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‚˜์˜ด์œผ๋กœ ์ธํ•ด์„œ ํ•œ๊ฒฐ ๊ณ ๋ฏผ์„ ๋œ์–ด์ค€ ๊ฒƒ ๊ฐ™๋„ค์š”.

 

FastAPI๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ๋Œ€๋กœ Flask์™€ ๊ฑฐ์˜ ๋น„์Šทํ•œ ์Šคํƒ€์ผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Flask๋ฅผ ํ•œ ๋ฒˆ ์ฏค ์‚ฌ์šฉํ•ด๋ณด์‹  ๋ถ„์ด๋ผ๋ฉด ์‰ฝ๊ฒŒ ๋ฐฐ์›Œ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ ์ฏค ๊ณ ๋ฏผํ•˜๊ณ  ๊ณ„์…จ๊ฑฐ๋‚˜ Java์˜ Spring์ฒ˜๋Ÿผ ์„œ๋น„์Šค ๋ ˆ์ด์–ด ๊ตฌํ˜„ ํ˜•ํƒœ๋กœ ์›น์„ ๊ตฌํ˜„ํ•ด๋ณด์‹œ๋Š” ๋ถ„๋“ค์—๊ฒŒ ์ถ”์ฒœ ๋“œ๋ ค๋ด…๋‹ˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments