๐ ์ฝ 2๋ถ ์ฝ๋ ๋ฐ ์์๋ฉ๋๋ค
์ด์ ๊ธ ๋ณด๊ธฐ(FastAPI ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ)
โ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์, ๊ทธ๋ฆฌ๊ณ ๊ฒฝ๋ก ์ฐ์ฐ์
“API ์ค๊ณ์ ๋ณธ์ง์ ๋ผ์ฐํ ์ด๋ค!”
FastAPI๋ ๋ผ์ฐํ ์ ๋งค์ฐ ์ง๊ด์ ์ผ๋ก ์ค๊ณํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, Flask์ ๋น์ทํ ๋ฌธ๋ฒ์ ์ ๊ณตํ๋ฉด์๋ ํจ์ฌ ๊ฐ๋ ฅํ๊ณ ๋ช ํํ ํ์ ๊ธฐ๋ฐ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์, ๊ทธ๋ฆฌ๊ณ HTTP ๋ฉ์๋๋ณ ๊ฒฝ๋ก ์ฐ์ฐ์๋ฅผ ์์ธํ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
โ ๋ผ์ฐํ ์ด๋ ๋ฌด์์ธ๊ฐ?
๋ผ์ฐํ
(Routing)์ด๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ URL ๊ฒฝ๋ก์ ๋ฐ๋ผ ์๋ฒ๊ฐ ์ด๋ค ํจ์๋ฅผ ์คํํ ์ง ๊ฒฐ์ ํ๋ ๊ท์น์ ๋งํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ /items/1
๋ก GET ์์ฒญ์ ๋ณด๋ด๋ฉด, FastAPI๋ ์ด ๊ฒฝ๋ก๋ฅผ ํธ๋ค๋งํ ํจ์๋ฅผ ์ฐพ์ ์๋ตํฉ๋๋ค.
1. ๐ ๊ฒฝ๋ก ์ฐ์ฐ์: @app.get
, @app.post
๋ฑ
FastAPI์์๋ ๊ฐ HTTP ์์ฒญ ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)์ ๋์ํ๋ **๋ฐ์ฝ๋ ์ดํฐ(Decorator)**๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ธฐ๋ณธ ์์:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
@app.post("/submit")
def submit_data():
return {"status": "Data submitted"}
@app.get("/")
: ๋ฃจํธ ๊ฒฝ๋ก์ GET ์์ฒญ์ ์ฒ๋ฆฌ@app.post("/submit")
:/submit
๊ฒฝ๋ก์ POST ์์ฒญ์ ์ฒ๋ฆฌ
์ด ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ ์ฐ์ฐ์๊ฐ ์์ต๋๋ค:
@app.put()
โ ๊ธฐ์กด ์์์ ์ ์ฒด ์์ @app.patch()
โ ์ผ๋ถ ์์ @app.delete()
โ ์ญ์ ์์ฒญ
FastAPI๋ HTTP ๋ช ์ธ๋ฅผ ์ ํํ ๋ฐ๋ฅด๋ฏ๋ก, RESTful API ์ค๊ณ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค.
2. ๐ฃ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์ (Path Parameters)
๊ฒฝ๋ก ๋ด์ ๋ณ์์ฒ๋ผ ๊ฐ์ ๋ฐ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, /users/5
์ฒ๋ผ URL์ ํฌํจ๋ ์ซ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ ์์ต๋๋ค.
์ฌ์ฉ ์:
@app.get("/users/{user_id}")
def read_user(user_id: int):
return {"user_id": user_id}
{user_id}
๋ ๊ฒฝ๋ก์์ ๋ณ์์ด๋ฉฐ,user_id: int
๋ ํด๋น ๊ฐ์ด ์ ์์์ ๋ช ์ํฉ๋๋ค.
ํ์ ๊ฒ์ฌ๋ ์๋
/users/5
โ ์ ์ ์๋/users/abc
โ 422 ์ค๋ฅ ๋ฐ์ (์๋ ์ ํจ์ฑ ๊ฒ์ฌ)
Pydantic์ด๋ ๋ณ๋์ ๊ฒ์ฌ ์ฝ๋ ์์ด๋ ํ์ ์ ์๋์ผ๋ก ์ฒดํฌํด์ฃผ๋ FastAPI์ ํฐ ์ฅ์ ์ ๋๋ค.
3. ๐ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ (Query Parameters)
์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ URL ๋ค์ ?key=value
ํ์์ผ๋ก ์ถ๊ฐ๋๋ ๊ฐ์
๋๋ค. ์ฌ๋ฌ ๊ฐ๋ ๊ฐ๋ฅํ๊ณ , ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด /items/?name=keyboard&price=49.99
์ฒ๋ผ ์ฌ์ฉํ ์ ์์ฃ .
์ฌ์ฉ ์:
@app.get("/items/")
def read_item(name: str = "default", price: float = 0.0):
return {"name": name, "price": price}
/items/?name=mouse&price=19.99
โ{ "name": "mouse", "price": 19.99 }
/items/
โ{ "name": "default", "price": 0.0 }
ํ์ ํ๋ผ๋ฏธํฐ๋ก ๋ง๋ค๊ธฐ
๊ธฐ๋ณธ๊ฐ ์์ด ์ ์ํ๋ฉด ํด๋น ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ ํ์์ ๋๋ค.
@app.get("/search/")
def search(keyword: str):
return {"result": f"Searching for {keyword}"}
/search/?keyword=python
โ OK/search/
โ 422 ์ค๋ฅ (keyword ๋๋ฝ)
4. ๐ฏ ๊ฒฝ๋ก + ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์ ํผํฉ ์ฌ์ฉ
FastAPI์์๋ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํน์ ์ ์ ์ ํน์ ๊ฒ์๊ธ์ ์ฟผ๋ฆฌํ๋ค๊ณ ํด๋ณผ๊น์?
@app.get("/users/{user_id}/posts/")
def read_user_post(user_id: int, sort_by: str = "date"):
return {"user_id": user_id, "sort_by": sort_by}
/users/10/posts/?sort_by=title
โ{ "user_id": 10, "sort_by": "title" }
/users/10/posts/
โ{ "user_id": 10, "sort_by": "date" }
(๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ)
5. ๐ ๊ณ ๊ธ ๋ผ์ฐํ : ๊ฒฝ๋ก ์ฐ์ ์์์ ํ์ ๊ตฌ๋ถ
FastAPI๋ ๊ฒฝ๋ก ์ฐ์ ์์์ ํ์ ์ ๋งค์ฐ ์๊ฒฉํ๊ฒ ๊ตฌ๋ถํฉ๋๋ค. ๋ค์์ ์ข์ ์์์ ๋๋ค:
@app.get("/items/{item_id}")
def read_item_by_id(item_id: int):
return {"item_id": item_id}
@app.get("/items/special")
def read_special_item():
return {"item": "special item"}
/items/special
โread_special_item
์คํ/items/42
โread_item_by_id
์คํ
ํ์ง๋ง ์์๊ฐ ๋ฐ๋์๋ค๋ฉด /items/special
์ด ์ซ์๋ก ์ธ์๋ผ ์ค๋ฅ๊ฐ ๋ ์๋ ์์ต๋๋ค. ํน์ ๋ฌธ์์ด ๊ฒฝ๋ก๋ ์์ชฝ์ ๋จผ์ ์ ์ํด์ผ ํฉ๋๋ค.
6. ๐งผ ๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ์ ๊ฒ์ฆ ์ต์
FastAPI๋ Path
, Query
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ์ธ๋ถ ์กฐ๊ฑด์ ๊ฑธ ์๋ ์์ต๋๋ค.
from fastapi import Path
@app.get("/products/{product_id}")
def get_product(product_id: int = Path(..., gt=0, lt=1000)):
return {"product_id": product_id}
gt=0
: 0๋ณด๋ค ํฐ ๊ฐ๋ง ํ์ฉlt=1000
: 1000 ๋ฏธ๋ง ๊ฐ๋ง ํ์ฉ
์ ๋ ฅ๊ฐ์ด ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด ์๋์ผ๋ก 422 ์๋ฌ๋ฅผ ๋ฐํํฉ๋๋ค.
๐งพ ๋ง๋ฌด๋ฆฌ: FastAPI ๋ผ์ฐํ ์ ๊ฐ๋ ฅํ๋ฉด์๋ ์ง๊ด์ ์ด๋ค
FastAPI์ ๋ผ์ฐํ ์์คํ ์ ๋จ์ํ URL-ํจ์ ์ฐ๊ฒฐ์ ๋์ด์, ํ์ ์์ ์ฑ๊ณผ ์๋ ์ ํจ์ฑ ๊ฒ์ฌ, ๋ฌธ์ ์๋ ์์ฑ, ๋ช ํํ ์ฝ๋ ๊ฐ๋ ์ฑ๊น์ง ์ ๊ณตํฉ๋๋ค. ์ด ๊ธฐ๋ฅ๋ค์ ๋ค๋ฅธ ํ๋ ์์ํฌ์์ ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ์ฌ์ผ ๊ฐ๋ฅํ ์ผ๋ค์ด์ง๋ง, FastAPI์์๋ ๊ธฐ๋ณธ์ ๋๋ค.
๋ค์ ๊ธ์์๋ ์ค์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ํ๊ณ , ์๋ต ์คํค๋ง์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ๋ฉด์ ๋ ๊ฒฌ๊ณ ํ API๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๊ฐํ ์์ ์ ๋๋ค. FastAPI๊ฐ ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ฌ๋๋ฐ๋์ง, ๋ ๊น์ด ์ฒด๊ฐํ ์ ์์ ๊ฑฐ์์.
FastAPI ๊ณต์ ๋ฌธ์ : https://fastapi.tiangolo.com/ko/
