Router

라우팅이란 FastAPI가 요청받은 URL을 해석하여 그에 맞는 함수를 실행하여 그 결과를 리턴하는 행위를 말한다.

from fastapi import APIRouter

from database import SessionLocal
from models import Question

router = APIRouter(
    prefix="/api/question",
)

@router.get("/list")
def question_list():
    db = SessionLocal()
    _question_list = db.query(Question).order_by(Question.create_date.desc()).all()
    db.close()
    return _question_list

db.close() : 사용한 세션을 커넥션 풀에 반환, 세션 종료 아님

db 세션 생성 → 세션을 이용하여 질문 목록 조회 및 리턴

질문 목록 API를 실행한 결과

스크린샷 2024-05-08 오후 11.26.22.png

의존성 주입

Dependencies - FastAPI

데이터베이스 세션의 생성과 반환을 자동화하기

db 세션 객체를 생성한 후 db.close() 를 수행하지 않으면 커넥션 풀에 db 세션이 반환되지 않아 문제가 생긴다. ← 이 부분을 자동화하려면?

Dependency Injection

@contextlib.contextmanager
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

db 세션 객체를 리턴하는 제너레이터 get_db()

적용한 어노테이션 덕분에 with문과 함께 사용 가능함.

with 문을 벗어나는 순간 get_db 함수의 finally에 작성한 세션 객체 반환 함수가 자동으로 실행된다.

@router.get("/list")
def question_list():
    with get_db() as db:
        _question_list = db.query(Question).order_by(Question.create_date.desc()).all()
     
    return _question_list