FastAPI - Tutorial

Kjjeddยท2026๋…„ 1์›” 13์ผ

FastAPI

๋ชฉ๋ก ๋ณด๊ธฐ
4/16
post-thumbnail

๐Ÿš€ FastAPI Tutorial

๐Ÿค” FastAPI๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

FastAPI๋Š” Python์œผ๋กœ API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ˜„๋Œ€์ ์ธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.

์ด๋ฆ„์— ๋“ค์–ด์žˆ๋Š” Fast๋Š” ๋‹จ์ˆœํžˆ โ€œ์„ฑ๋Šฅ์ด ๋น ๋ฅด๋‹คโ€๊ฐ€ ์•„๋‹ˆ๋ผ,

  • ๊ฐœ๋ฐœ ์†๋„(Fast to develop)๊ฐ€ ๋น ๋ฅด๊ณ 
  • ์‹คํ–‰ ์„ฑ๋Šฅ(Fast to run)๋„ ๋น ๋ฅด๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ง„๋‹ค

๐Ÿ‘‰ ์ฆ‰, FastAPI๋Š” โ€œ๋งŒ๋“ค๊ธฐ๋„ ๋น ๋ฅด๊ณ , ์‹คํ–‰๋„ ๋น ๋ฅธโ€ ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค


๐Ÿฝ๏ธ API๋ฅผ ๋ ˆ์Šคํ† ๋ž‘์œผ๋กœ ๋น„์œ ํ•˜๋ฉด

API๊ฐ€ ๋ญ”์ง€ ๊ฐ์ด ์•ˆ ์žกํžˆ๋ฉด ๋ ˆ์Šคํ† ๋ž‘์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

  • ์†๋‹˜(ํด๋ผ์ด์–ธํŠธ) : ๋ธŒ๋ผ์šฐ์ €/์•ฑ/๋‹ค๋ฅธ ์„œ๋ฒ„
  • ์›จ์ดํ„ฐ(API) : ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ „๋‹ฌํ•˜๋Š” ์—ญํ• 
  • ์ฃผ๋ฐฉ(์„œ๋ฒ„/๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง) : ์‹ค์ œ๋กœ ์š”๋ฆฌ(์ฒ˜๋ฆฌ)ํ•˜๋Š” ๊ณณ
  • ์Œ์‹(์‘๋‹ต) : JSON ๋ฐ์ดํ„ฐ, ๊ฒฐ๊ณผ๊ฐ’

์†๋‹˜์ด โ€œ๊น€์น˜์ฐŒ๊ฐœ ์ฃผ์„ธ์š”โ€๋ผ๊ณ  ์ฃผ๋ฌธํ•˜๋ฉด, ์›จ์ดํ„ฐ๊ฐ€ ์ฃผ๋ฐฉ์— ์ „๋‹ฌํ•˜๊ณ , ์ฃผ๋ฐฉ์ด ์š”๋ฆฌํ•ด์„œ, ์›จ์ดํ„ฐ๊ฐ€ ๋‹ค์‹œ ๊ฐ€์ ธ๋‹ค์ค€๋‹ค.
์ด์ฒ˜๋Ÿผ API๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ „๋‹ฌํ•˜๋Š” ์ค‘๊ฐ„ ์—ญํ• ์„ ํ•œ๋‹ค.

๐Ÿ‘‰ ์ด โ€œ์ฃผ๋ฌธ โ†” ์ „๋‹ฌ โ†” ์ฒ˜๋ฆฌ โ†” ์ „๋‹ฌโ€ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋กœ API์˜ ํ•ต์‹ฌ ํ๋ฆ„์ด๋‹ค


๐Ÿงช ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—: ์„ค์น˜๊ฐ€ ๋จผ์ €!

FastAPI๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ผ๋‹จ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์„ค์น˜ ์ „์— ๊ฑฐ์˜ ํ•ญ์ƒ ๊ฐ™์ด ๋‚˜์˜ค๋Š” ๋‹จ์–ด๊ฐ€ ์žˆ๋‹ค.

๐Ÿ‘‰ ๊ฐ€์ƒํ™˜๊ฒฝ(virtual environment).


โš ๏ธ ๊ฐ€์ƒํ™˜๊ฒฝ์ด๋ž€?

๊ฐ€์ƒํ™˜๊ฒฝ์€ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋…๋ฆฝ๋œ Python ํŒจํ‚ค์ง€ ๊ณต๊ฐ„์„ ๋งŒ๋“ ๋‹ค.

  • ํ”„๋กœ์ ํŠธ A๋Š” FastAPI 0.xx๊ฐ€ ํ•„์š”ํ•˜๊ณ 
  • ํ”„๋กœ์ ํŠธ B๋Š” FastAPI 1.xx๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค

๊ฐ€์ƒํ™˜๊ฒฝ์ด ์—†์œผ๋ฉด ์ „์—ญ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋“ค์ด ์„œ๋กœ ์ถฉ๋Œํ•ด์„œ ์–ด๋А ๋‚  ๊ฐ‘์ž๊ธฐ โ€œ์–ด์ œ ๋˜๋˜ ๊ฒŒ ์˜ค๋Š˜ ์•ˆ๋จโ€ ํ˜„์ƒ์ด ํ„ฐ์ง„๋‹ค.

๐Ÿ‘‰ ๊ทธ๋ž˜์„œ FastAPI ์‹œ์ž‘ ์ „, ๊ฐ€์ƒํ™˜๊ฒฝ์€ ์‚ฌ์‹ค์ƒ ํ•„์ˆ˜๋‹ค


๐Ÿ“ฆ FastAPI ์„ค์น˜ ๋ช…๋ น์–ด

FastAPI๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž…๋ฌธ์ž๋ผ๋ฉด ์•„๋ž˜๊ฐ€ ๊ฐ€์žฅ ๋ฌด๋‚œํ•˜๋‹ค.

pip install "fastapi[standard]"

์—ฌ๊ธฐ์„œ [standard]๋Š” โ€œFastAPI๋งŒ ์„ค์น˜โ€๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ฐœ๋ฐœ์— ์ž์ฃผ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•จ๊ป˜ ์„ค์น˜ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

์„ค์น˜ ๋ช…๋ น์–ด ํฌํ•จ ๋‚ด์šฉ ์ถ”์ฒœ ์ƒํ™ฉ
pip install "fastapi[standard]" FastAPI + ๊ฐœ๋ฐœ์šฉ ๊ธฐ๋ณธ ๋„๊ตฌ๋“ค ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ€์žฅ ์ถ”์ฒœ
pip install fastapi FastAPI๋งŒ ์„ค์น˜ ์ตœ์†Œ ์„ค์น˜๋งŒ ํ•„์š”ํ•  ๋•Œ
pip install "fastapi[standard-no-fastapi-cloud-cli]" ๊ฐœ๋ฐœ ๋„๊ตฌ ํฌํ•จ (์ผ๋ถ€ CLI ์ œ์™ธ) ํŠน์ • ๊ธฐ๋Šฅ์ด ํ•„์š” ์—†์„ ๋•Œ

๐Ÿ–ฅ๏ธ ํŠœํ† ๋ฆฌ์–ผ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ• ๊นŒ?

FastAPI ํŠœํ† ๋ฆฌ์–ผ์˜ ์ฝ”๋“œ ๋ธ”๋ก์€ ๋Œ€๋ถ€๋ถ„ ๋ณต์‚ฌํ•ด์„œ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค.

๋จผ์ € โ€œFastAPI๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ๋ฆ„โ€์„ ๋จผ์ € ์žก์ž.


โœ… 1๋‹จ๊ณ„: main.py ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋จผ์ € ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋‹ค.

  • ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ 
  • ๊ทธ ์•ˆ์— main.py ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค

๐Ÿ‘‰ ์ง€๊ธˆ ๋‹จ๊ณ„์—์„œ๋Š” โ€œ์ฝ”๋“œ๋ฅผ ์™„๋ฒฝํžˆ ์ดํ•ดโ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค
FastAPI ์‹คํ–‰ ํ๋ฆ„์„ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๋Š” ๊ฒŒ ๋” ์ค‘์š”ํ•˜๋‹ค


โœ… 2๋‹จ๊ณ„: ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ (fastapi dev)

FastAPI๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋„์šธ ๋•Œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ๋งŽ์ด ์“ด๋‹ค.

fastapi dev main.py

์—ฌ๊ธฐ์„œ dev๋Š” development(๊ฐœ๋ฐœ)์˜ ์•ฝ์ž๋‹ค. ์ฆ‰ โ€œ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ฒ ๋‹คโ€๋ผ๋Š” ๋œป์ด๋‹ค.


๐Ÿ” fastapi dev main.py๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ?

๊ฒ‰๋ณด๊ธฐ์—” โ€œ์„œ๋ฒ„๊ฐ€ ์ผœ์กŒ๋‹คโ€์ง€๋งŒ, ์‹ค์ œ ๋‚ด๋ถ€์—์„  ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค.

  • Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์‹คํ–‰๋œ๋‹ค
  • main.py ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค(๋กœ๋“œ)
  • FastAPI ์•ฑ ๊ฐ์ฒด(app)๋ฅผ ๋งŒ๋“ ๋‹ค
  • Uvicorn(ASGI ์„œ๋ฒ„)์ด ์‹คํ–‰๋œ๋‹ค
  • ์„œ๋ฒ„๊ฐ€ ํŠน์ • ์ฃผ์†Œ์—์„œ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค

๐Ÿ‘‰ ํ•ต์‹ฌ:
FastAPI๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ณ 
์‹ค์ œ๋กœ ์š”์ฒญ์„ ๋ฐ›๋Š” ์—ญํ• ์€ ASGI ์„œ๋ฒ„(Uvicorn)๊ฐ€ ํ•œ๋‹ค


๐ŸŒ ์„œ๋ฒ„ ์ฃผ์†Œ๋Š” ์–ด๋””์— ๋œฐ๊นŒ?

๋Œ€๋ถ€๋ถ„ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฐ ์ฃผ์†Œ๊ฐ€ ๋‚˜์˜จ๋‹ค.

  • ์„œ๋ฒ„ ์ฃผ์†Œ : http://127.0.0.1:8000
  • ๋ฌธ์„œ ์ฃผ์†Œ(Swagger UI) : http://127.0.0.1:8000/docs

FastAPI์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” API ๋ฌธ์„œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ค€๋‹ค๋Š” ์ ์ด๋‹ค.

๐Ÿ‘‰ ์„œ๋ฒ„๋งŒ ์ผœ๋ฉด, ๋ฌธ์„œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ๊ธด๋‹ค.


๐Ÿ“Œ ์ฝ˜์†” ์ถœ๋ ฅ(๋กœ๊ทธ)์„ ์ฝ๋Š” ๋ฒ•

๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๋ฉด ์ฝ˜์†”์— ์—ฌ๋Ÿฌ ๋ฌธ์žฅ์ด ๋œฌ๋‹ค. ๋ณดํ†ต ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ๋ณด๊ฒŒ ๋œ๋‹ค:

  • Server started at : ์„œ๋ฒ„๊ฐ€ ์—ด๋ ค์žˆ๋Š” ์ฃผ์†Œ
  • Documentation at : API ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ (์ž๋™ ์ƒ์„ฑ)
  • Will watch for changes : ์ฝ”๋“œ ๋ฐ”๋€Œ๋ฉด ์ž๋™ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘
  • Press CTRL+C to quit : ์ข…๋ฃŒ๋Š” Ctrl+C

๐Ÿง  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ์ฝ”๋“œ ์ž‘์„ฑ

๊ธฐ๋Šฅ ์„ค๋ช… ํšจ๊ณผ
ํƒ€์ž… ์ฒดํฌ ๋ณ€์ˆ˜/์ž…๋ ฅ/์ถœ๋ ฅ ํƒ€์ž…์„ ๋ฐ”ํƒ•์œผ๋กœ ์˜ค๋ฅ˜ ๊ฐ์ง€ ์‹คํ–‰ ์ „์— ์‹ค์ˆ˜๋ฅผ ์žก์•„์คŒ
์ž๋™์™„์„ฑ FastAPI๊ฐ€ ํƒ€์ž… ํžŒํŠธ๋ฅผ ์ ๊ทน ํ™œ์šฉ ์ž‘์„ฑ ์†๋„ ์ฆ๊ฐ€ + ์˜คํƒ€ ๊ฐ์†Œ
์ ์€ ์ฝ”๋“œ๋Ÿ‰ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋” ์งง๊ฒŒ ํ‘œํ˜„ ๊ฐ€๋…์„ฑ/์œ ์ง€๋ณด์ˆ˜ โ†‘

๐Ÿงท ํƒ€์ž… ํžŒํŠธ(Type Hint)๊ฐ€ ์™œ ์ž๊พธ ๋‚˜์˜ค๋‚˜์š”?

Python์€ ์›๋ž˜ ํƒ€์ž…์„ ์•ˆ ์จ๋„ ๋˜๋Š” ์–ธ์–ด์ง€๋งŒ, FastAPI๋Š” ํƒ€์ž… ํžŒํŠธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์™œ๋ƒ๋ฉด ํƒ€์ž… ํžŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ

  • ์š”์ฒญ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
  • ์ž๋™ ๋ฌธ์„œ ์ƒ์„ฑ
  • ์ž๋™์™„์„ฑ ํ’ˆ์งˆ ํ–ฅ์ƒ

์ด๋Ÿฐ ๊ฒƒ๋“ค์ด โ€œ์ž๋™์œผ๋กœโ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


์˜ˆ์‹œ: ํƒ€์ž… ํžŒํŠธ ์—†์Œ vs ์žˆ์Œ

# ํƒ€์ž… ํžŒํŠธ ์—†์Œ
def greet(name):
    return "์•ˆ๋…•ํ•˜์„ธ์š”, " + name
# ํƒ€์ž… ํžŒํŠธ ์‚ฌ์šฉ
def greet(name: str) -> str:
    return "์•ˆ๋…•ํ•˜์„ธ์š”, " + name

๐Ÿ‘‰ ํƒ€์ž… ํžŒํŠธ๋Š” โ€œ๊ท€์ฐฎ์€ ๋ฌธ๋ฒ•โ€์ด ์•„๋‹ˆ๋ผ
FastAPI์˜ ์ž๋™ํ™” ๊ธฐ๋Šฅ์„ ๋Œ์–ด๋‚ด๋Š” ํ•ต์‹ฌ ์žฌ๋ฃŒ๋‹ค


๐Ÿ”น FastAPI ์ฝ”๋“œ

# main.py

# 1. FastAPI ํด๋ž˜์Šค๋ฅผ ๋ถ€๋ฅด๊ธฐ
from fastapi import FastAPI

# 2. FastAPI ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
#    ์ด app ๊ฐ์ฒด๊ฐ€ API ์„œ๋ฒ„์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค
app = FastAPI()

# 3. ๊ฒฝ๋กœ(path)์™€ ์ž‘์—…(operation)์„ ์ •์˜
#    @app.get("/")๋Š” "๋ฃจํŠธ ๊ฒฝ๋กœ์— GET ์š”์ฒญ์ด ์˜ค๋ฉด"์ด๋ผ๋Š” ์˜๋ฏธ
@app.get("/")
async def root():
    # 4. ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ผ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
    #    ๋”•์…”๋„ˆ๋ฆฌ๋Š” ์ž๋™์œผ๋กœ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค
    return {"message": "Hello World"}

๐Ÿ”น ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ

ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

# fastapi dev: ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์„œ๋ฒ„ ์‹คํ–‰
# main.py: ์‹คํ–‰ํ•  ํŒŒ์ผ ์ด๋ฆ„
# ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์„œ๋ฒ„๊ฐ€ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘๋จ.
fastapi dev main.py

์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ๋  ๊ฒฝ์šฐ:

์—ฌ๊ธฐ์„œ 127.0.0.1์€ localhost๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ 8000์€ ํฌํŠธ๋ฒˆํ˜ธ์ด๋‹ค

๊ฒฐ๊ณผ ํ™•์ธ

๋ธŒ๋ผ์šฐ์ €์—์„œ http://127.0.0.1:8000์— ์ ‘์†ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ JSON ์‘๋‹ต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
{"message": "Hello World"}

โœ… ํ•ต์‹ฌ ์š”์•ฝ

  • FastAPI๋Š” ๊ฐœ๋ฐœ ์†๋„๋„ ๋น ๋ฅด๊ณ  ์„ฑ๋Šฅ๋„ ๋น ๋ฅธ Python ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค
  • fastapi dev main.py๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Uvicorn ์„œ๋ฒ„๊ฐ€ ๋œจ๊ณ  ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค
  • /docs์—์„œ ์ž๋™ ๋ฌธ์„œ(Swagger UI)๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค
  • FastAPI์˜ ์žฅ์ ์€ ํƒ€์ž… ํžŒํŠธ ๊ธฐ๋ฐ˜ ์ž๋™ํ™”์—์„œ ๋‚˜์˜จ๋‹ค

profile
Gongbuhaja

0๊ฐœ์˜ ๋Œ“๊ธ€