๐ ์ฝ 2๋ถ ์ฝ๋ ๋ฐ ์์๋ฉ๋๋ค
์ด์ ๊ธ ๋ณด๊ธฐ(FastAPI ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ )
โ Hello, FastAPI! ๊ทธ๋ค์ ๋จ๊ณ, FastAPI ์ฑ ๋ง๋ค๊ธฐ
“๊ธฐ์ด๋ถํฐ ํํํ๊ฒ!”
์ด์ ํ๊ฒฝ ์ค์ ๋ ๋๋ฌ์ผ๋, FastAPI์ ํต์ฌ ๊ธฐ๋ฅ๋ค์ ์ง์ ์ฝ๋๋ก ์์ฑํด๋ณด๋ฉฐ ํ๋ํ๋ ์ตํ๋ณผ ์ฐจ๋ก์ ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ผ์ฐํ , ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์, ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์, POST ์์ฒญ ์ฒ๋ฆฌ๊น์ง FastAPI์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ฒฝํํด๋ณด๊ฒ ์ต๋๋ค.
โ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ
์ฐ์ ๊น๋ํ ๊ตฌ์กฐ๋ฅผ ์ํด ๊ธฐ๋ณธ ํด๋ ๊ตฌ์ฑ์ ์ก์์ค๊ฒ์.
fastapi-tutorial/
โ
โโโ main.py
โโโ models.py
โโโ schemas.py
โโโ requirements.txt
์ด ๊ตฌ์กฐ๋ ์์ผ๋ก ๊ท๋ชจ๊ฐ ์ปค์ ธ๋ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ๊ตฌ์กฐ์ ๋๋ค.
์ง๊ธ์ ๊ฐ๋จํ๊ฒ, ๋ชจ๋ ์ฝ๋๋ฅผmain.py
์ ์์ฑํ๋ฉด์ ๊ธฐ๋ฅ๋ณ๋ก ๊ตฌ๋ถ๋ง ์ดํดํด๋ณผ๊ฒ์.
๐ฆ 1. ๋ผ์ฐํ (Routing) ์ดํดํ๊ธฐ
FastAPI๋ URL ๊ฒฝ๋ก์ Python ํจ์(์๋ํฌ์ธํธ)๋ฅผ ์ฐ๊ฒฐํด์ API๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ๋ผ์ฐํ ์ด๋ผ๊ณ ํด์.
main.py
ํ์ผ์ ์ด๊ณ ๋ค์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์ธ์:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Welcome to FastAPI!"}
@app.get("/hello")
def say_hello():
return {"message": "Hello, World!"}
์คํ ๋ฐฉ๋ฒ
ํฐ๋ฏธ๋์์ ์๋ ๋ช ๋ น์ด ์ ๋ ฅ:
uvicorn main:app --reload
๋ธ๋ผ์ฐ์ ๋ก ์ ์:
http://127.0.0.1:8000/
โ Welcome ๋ฉ์์งhttp://127.0.0.1:8000/hello
โ Hello ๋ฉ์์ง
๐ฆ 2. ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ (Path Parameters)
ํน์ ํ ๋ฐ์ดํฐ๋ฅผ URL ๊ฒฝ๋ก๋ก๋ถํฐ ๋ฐ์์ฌ ์ ์์ต๋๋ค.
์: /users/3
โ ์ฌ์ฉ์ ID๊ฐ 3์ธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์ถ์ ๋
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id}
user_id
๋ ํจ์ ์ธ์์ด์, URL์ ๋ณ์์ ๋๋ค.int
ํ์ ํํธ ๋๋ถ์ ์ซ์๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ ์ค๋ฅ ๋ฐํ๋ฉ๋๋ค.
์ ์ ์:
http://127.0.0.1:8000/users/42
โ {"user_id": 42}
๐ 3. ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ (Query Parameters)
์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ ?key=value
ํ์์ผ๋ก ์ ๋ฌ๋๋ ์ถ๊ฐ ์ ๋ณด์
๋๋ค.
@app.get("/items/")
def read_item(q: str = "default"):
return {"query": q}
์ ์ ์:
/items/?q=fastapi
โ{"query": "fastapi"}
/items/
โ{"query": "default"}
q: str = "default"
๋ ์ ํ์ ๋งค๊ฐ๋ณ์์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง๋๋ค.
๋ณต์ ๋งค๊ฐ๋ณ์๋ ๊ฐ๋ฅ:
@app.get("/search/")
def search(keyword: str, page: int = 1):
return {"keyword": keyword, "page": page}
์:
/search/?keyword=python&page=2
โ {"keyword": "python", "page": 2}
๐ฌ 4. POST ์์ฒญ๊ณผ Request Body ์ฒ๋ฆฌ
๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ๋ณด๋ด๊ธฐ ์ํด ์ฌ์ฉํ๋ POST ์์ฒญ๋ FastAPI์์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
1. ๋ฐ์ดํฐ ๋ชจ๋ธ ์ ์ (Pydantic ์ฌ์ฉ)
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
description: str | None = None
2. POST ์์ฒญ ํธ๋ค๋ฌ ์์ฑ
@app.post("/items/")
def create_item(item: Item):
return {"received_item": item}
์ด์ Swagger ๋ฌธ์(โ /docs
)์์ ์ง์ POST ์์ฒญ์ ์๋ฎฌ๋ ์ด์
ํด๋ณผ ์ ์์ต๋๋ค.
์์ ์์ฒญ ๋ณธ๋ฌธ(JSON):
{
"name": "Laptop",
"price": 1299.99,
"description": "High-performance laptop"
}
์๋ต:
{
"received_item": {
"name": "Laptop",
"price": 1299.99,
"description": "High-performance laptop"
}
}
๐งช 5. ํ์ ํ ์คํธ ํฌ์ธํธ ์์ฝ
๊ธฐ๋ฅ | ๊ฒฝ๋ก | ์ค๋ช |
---|---|---|
๊ธฐ๋ณธ ๋ผ์ฐํ | / | Welcome ๋ฉ์์ง ๋ฐํ |
๋จ์ GET | /hello | Hello ๋ฉ์์ง |
๊ฒฝ๋ก ๋ณ์ | /users/1 | ์ฌ์ฉ์ ID ๋ฐํ |
์ฟผ๋ฆฌ ๋ณ์ | /items/?q=fastapi | ๋ฌธ์์ด ์ ๋ ฅ ๋ฐ์ ๋ฐํ |
POST ์์ฒญ | /items/ | JSON ๋ณธ๋ฌธ ๋ฐ์ ์ฒ๋ฆฌ |
๐ ํ: FastAPI ๋๋ฒ๊น ๊ณผ ๋ฆฌ๋ก๋
--reload
์ต์ ์ ํญ์ ์ฌ์ฉํ์ธ์. ํ์ผ ์ ์ฅ ์ ์๋ฒ๊ฐ ์๋์ผ๋ก ๋ฐ์๋ฉ๋๋ค.- ์๋ฌ ๋ฉ์์ง๊ฐ ์ง๊ด์ ์ผ๋ก ์ถ๋ ฅ๋๋ฏ๋ก ๋๋ฒ๊น ์ด ๋งค์ฐ ์ฝ์ต๋๋ค.
- Swagger UI์์ ์ง์ API ์์ฒญ์ ๋ณด๋ด๋ณด๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์. GUI ๊ธฐ๋ฐ์ด๋ผ ์ด๋ณด์์๊ฒ ๋งค์ฐ ์น์ ํฉ๋๋ค.
๐งพ ๋ง๋ฌด๋ฆฌ: FastAPI๋ ์ง์ ์ฅ๋ฒฝ์ด ๋ฎ์ง๋ง ๊ฐ๋ ฅํ๋ค
์ด์ ์ฌ๋ฌ๋ถ์ FastAPI์์ ๊ฐ์ฅ ํต์ฌ์ด ๋๋ ๊ธฐ๋ฅ๋ค์ธ ๋ผ์ฐํ , ๊ฒฝ๋ก/์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์, POST ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๊ฒฝํํด๋ณด์์ต๋๋ค. Flask๋ณด๋ค ํจ์ฌ ์ ๋๋ ๊ตฌ์กฐ๋ก, ๋ ๋น ๋ฅด๊ณ ๋ช ํํ API๋ฅผ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด ์ค๊ฐ๋์ฃ ?
๋ค์ ํธ์์๋ ์๋ต ๋ชจ๋ธ, ์ํ ์ฝ๋ ์ฒ๋ฆฌ, ์์ธ ํธ๋ค๋ง ๋ฑ์ ๋ํด ๋ฐฐ์๋ณด๋ฉฐ ํ์ธต ๋ ํํํ API๋ฅผ ๋ง๋ค์ด๋ด ์๋ค!
FastAPI ๊ณต์ ๋ฌธ์ : https://fastapi.tiangolo.com/ko/
