์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

fastapi๋กœ ๋ผ์šฐํ„ฐ ์ž‘์„ฑ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ

์ฃผ์˜ ๐Ÿฑ 2024. 4. 18. 17:30
728x90
๋ฐ˜์‘ํ˜•

 

์˜ˆ์ œ์—์„œ ๋ณธ ๋ฐฉ์‹(alemdic ์‚ฌ์šฉ)

https://github.com/tiangolo/full-stack-fastapi-template/tree/master/backend/app

 

router = APIRouter(
    prefix="/",
)

@router.get("/list")# /list ๊ฒฝ๋กœ๋กœ GET ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด question_list ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
def question_list():
    db = SessionLocal()
    _question_list = db.query(Question).order_by(Question.create_date.desc()).all()
    db.close()
    return _question_list

 ๋‹จ์  : 

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

 

 

 

 

์Šคํ‚ค๋งˆ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•ด๋†“๊ณ  ํ•˜๋Š” ๋ฐฉ์‹(Pydantic ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๋ฐ ์‘๋‹ต ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜

@router.post("/japanese/")
def create_japanese_item(item: schemas.JapaneseItemCreate, db: Session = Depends(get_db)):
    db_item = models.JapaneseItem(content=item.content)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

 

์„ธ์…˜์ด๋ž€?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ํ•œ ์—ฐ์†์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์˜ ๊ธฐ๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ(์˜ˆ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„)๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์— ์ฒ˜์Œ ์—ฐ๊ฒฐํ•  ๋•Œ ์‹œ์ž‘๋˜๊ณ , ์—ฐ๊ฒฐ์ด ๋ช…์‹œ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ํƒ€์ž„์•„์›ƒ์œผ๋กœ ์ธํ•ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ๋™์•ˆ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(DBMS)๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด, ๊ทธ๋ฆฌ๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, SQLAlchemy ๊ฐ™์€ ORM(Object-Relational Mapping) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ด์ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ, SessionLocal์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜์„ ์ƒ์„ฑ, ๊ด€๋ฆฌํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ธ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ์„ ์บก์Šํ™”ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ค‘์š”ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ, ์„ธ์…˜ ์ข…๋ฃŒ ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

 

๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ, 1๋ช…์ด ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ƒ๋‹จ์˜ ๋ฐฉ์‹์ด ๋น ๋ฅธ๋“ฏ

๋ฐ˜์‘ํ˜•