에듀테크 프로젝트 대시보드
yield 의존성 — 리소스 정리
return 대신 yield 를 쓰면, 응답이 끝난 뒤 yield 이후 코드가 실행됩니다. DB 세션·파일·락 정리에 씁니다.
from sqlalchemy.orm import Session
from app.database import SessionLocal
def get_db():
db = SessionLocal()
try:
yield db # 여기서 라우트 실행
finally:
db.close() # 응답 후 항상 정리
DbDep = Annotated[Session, Depends(get_db)]
@app.get("/items")
def list_items(db: DbDep):
return db.query(Item).all()def get_db():
db = SessionLocal()
try:
yield db
db.commit() # 라우트가 정상 종료하면 커밋
except Exception:
db.rollback() # 예외 시 롤백
raise
finally:
db.close()yield 이후 코드에서 HTTPException 을 새로 던져도 클라이언트 응답은 이미 나갔을 수 있음from app.database import AsyncSessionLocal
async def get_db():
async with AsyncSessionLocal() as session:
yield session
AsyncDbDep = Annotated[AsyncSession, Depends(get_db)]app = FastAPI(dependencies=[Depends(verify_api_key), Depends(rate_limit)])
# 모든 경로에 적용. 라우터 단위는 include_router(..., dependencies=[...])from functools import lru_cache
@lru_cache
def get_settings() -> Settings:
return Settings() # .env 를 한 번만 읽음
SettingsDep = Annotated[Settings, Depends(get_settings)]