라우팅이란 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를 실행한 결과
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