FastAPI๋Š” ๋†’์€ ์‚ฌ์šฉ์„ฑ๊ณผ ๋น ๋ฅธ ์†๋„๋ฅผ ์ž๋ž‘ํ•˜๋Š” Python ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

FastAPI์˜ ํŠน์ง•

๋น ๋ฅธ ์„ฑ๋Šฅ

FastAPI์˜ ๊ธฐ์›์„ ์ฐพ์•„ ์˜ฌ๋ผ๊ฐ€ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

graph LR
    A[Cython, libuv] --> B[uvloop]
    B --> C["Uvicorn (ASGI)"]
    C --> D[Starlette]
    D --> E[FastAPI]

์—ฌ๊ธฐ์„œ Cython์€ C๋กœ ์ปดํŒŒ์ผ๋˜์–ด ๋งค์šฐ ๋น ๋ฅธ ์†๋„๋ฅผ ์ž๋ž‘ํ•˜๊ณ , libuv๋„ C๋กœ ์ž‘์„ฑ๋œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ I/O ์—”์ง„์œผ๋กœ FastAPI๋ฟ ์•„๋‹ˆ๋ผ Node.js ๋“ฑ์—์„œ๋„ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณต๊ฐœ ๋‹น์‹œ์—๋Š” FastAPI์˜ ๋ชจ์ฒด์ธ Starlette, Uvicorn ์ •๋„๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋ฒค์น˜๋งˆํฌ ์„ฑ๋Šฅ์ด ์ œ์ผ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  Node.js๋‚˜ Go์— ์„ฑ๋Šฅ์ด ๋ฏธ์น˜์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค.1 ๊ทธ๋ž˜๋„ ๊ฒ€์ฆ๋œ Python ์›น ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘์—์„œ๋Š” ์ œ์ผ ๋น ๋ฆ…๋‹ˆ๋‹ค.

์šฐ์ˆ˜ํ•œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ๋งค์šฐ ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์‰ฝ๊ณ , ํŽธํ•˜๊ณ , Python ์›น ์ž…๋ฌธ์šฉ์œผ๋กœ ์ข‹์Šต๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์—๋„ ์ „ํ˜€ ๋ฌด๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ์ข‹์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋งŽ์€ ์™€์ค‘์—๋„ PoC๋‚˜ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค๊ธฐ ์ข‹์•„ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ ๋ฐ ๋ฐฐํฌ

์„ค์น˜ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

๋ฐ˜๋“œ์‹œ standard ์˜ต์…˜์œผ๋กœ ์„ค์น˜ํ•ด์•ผ uvloop์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  FastAPI์˜ ์„ฑ๋Šฅ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.2
์˜ต์…˜์„ ๋นผ๊ณ  ์„ค์น˜ํ•˜๋ฉด ์ˆœ์ˆ˜ Python ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

pip install 'uvicorn[standard]'

์•„๋ž˜ ๋ช…๋ น์–ด๋กœ FastAPI์™€ ํ•จ๊ป˜ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

pip install "fastapi[all]"

๋ฐฐํฌ ๋ฐฉ์‹

  1. ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์˜ ๋ฐฐํฌ๋ผ๋ฉด, NGINX + Uvicorn worker๊ฐ€ ๋ฌด๋‚œํ•œ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

    • NGINX
      • Uvicorn๋„ ๋…๋ฆฝ์ ์ธ ์›น ์„œ๋ฒ„์˜ ์—ญํ• ์„ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ํ™•์‹คํ•œ ์—ญํ•  ๋ถ„๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • NGINX๋„ C๋กœ ๊ตฌํ˜„๋˜์–ด ์„ฑ๋Šฅ์ด ์ข‹๊ณ , Reverse Proxy ๋“ฑ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์ด ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.
      • ์ •์  ๋ฆฌ์†Œ์Šค, ๋ผ์šฐํŒ… ๋“ฑ์€ NGINX์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋™์ ์ธ ์š”์ฒญ์„ Uvicorn์ด ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • Uvicorn worker
      • ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋„ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.3
      • ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
        • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋„ ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Python์˜ GIL4 ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง๊นŒ์ง€๋Š” Python์—์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
          • GIL๋กœ ์ธํ•ด ํŠน์ • ์‹œ์ ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ CPU ์ž์›์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU ์ž‘์—…์—๋Š” ํšจ๊ณผ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์˜คํžˆ๋ ค ์Šค๋ ˆ๋“œ ์ƒ์„ฑ๊ณผ GIL ์ œ์–ด ๋น„์šฉ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
          • ๋‹จ, I/O ์ž‘์—…์—๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.
      • ์ด์ „์—๋Š” Gunicorn์„ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ํ˜„์žฌ๋Š” ๊ณต์‹ ๊ฐ€์ด๋“œ์—์„œ๋„ ๊ทธ๋ƒฅ --workers ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํด๋ผ์šฐ๋“œ ๋˜๋Š” Kubernetes ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ, Uvicorn ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๋กœ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋‹จ, ์„ฑ๋Šฅ์ด๋‚˜ ์•ฑ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Proxy ๋’ค์—์„œ ์‚ฌ์šฉํ•  ๋•Œ

FastAPI๊ฐ€ NGINX Ingress Controller, Traefik ๋“ฑ์˜ ํ”„๋ก์‹œ ๋’ค์—์„œ ์ž‘๋™ํ•  ๋•Œ๋Š” ์•ฑ์—์„œ root path๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.5
์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฐ ์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

from fastapi import FastAPI, Request
 
app = FastAPI(root_path="/api/v1")

๊ทธ ์™ธ

  • FastAPI์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ์€ ์•„๋‹ˆ์ง€๋งŒ, ๊ฐœ๋ฐœ์šฉ WSGI ์„œ๋ฒ„๋Š” ์šด์˜ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.6
    ๋Œ€ํ‘œ์ ์œผ๋กœ Flask์˜ Werkzeug๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    FastAPI๋Š” ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋„ Uvicorn์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์šด์˜ ํ™˜๊ฒฝ๊ณผ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ์ฐจ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

FastAPI GitHub์˜ ๊ฒŒ์‹œ๊ธ€์„ ์ฐธ๊ณ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์‚ฌ๋ก€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Footnotes

  1. FastAPI vs Go โ†ฉ

  2. Uvicorn ๊ณต์‹ ๋ฌธ์„œ โ†ฉ

  3. FastAPI ๊ณต์‹ ๋ฌธ์„œ: Server Workers โ†ฉ

  4. What Is the Python Global Interpreter Lock (GIL)? โ€“ Real Python โ†ฉ

  5. FastAPI ๊ณต์‹ ๋ฌธ์„œ: Behind a Proxy โ†ฉ

  6. Flask ๊ณต์‹ ๋ฌธ์„œ: Deploying to Production โ†ฉ