Search
🔵

FastAPI의 의존성 주입기 Depends를 제네레이터와 조합하기

🚀 prev note
♻️ prev note
♻️ next note
16 more properties
Python의 generator는 값을 하나씩 필요할 때마다(lazy) 생성하는 특별한 함수다. 일반 함수는 return으로 값을 반환하고 종료되지만, generator는 yield로 값을 반환한 후 함수의 상태를 유지하며 다음 호출 시 중단된 지점부터 계속 실행된다.
이 generator의 특성은 FastAPI의 의존성 주입 시스템과 결합할 때 특히 유용하다. FastAPI에서 Depends는 라우트 함수가 실행되기 전에 필요한 의존성을 주입하는 메커니즘인데, yield와 함께 사용하면 라우트 함수 실행 전후로 코드를 실행하는 코드를 쉽게 분리할 수 있다.
DB 연결 관리 측면에서 이 패턴은 다음과 같이 활용할 수 있다:
from fastapi import Depends from sqlalchemy.orm import Session def get_db(): db = SessionLocal() # 라우트 함수 실행 전 실행됨 try: yield db # 여기서 db를 라우트 함수에 전달 finally: db.close() # 라우트 함수 실행 완료 후 항상 실행됨 @app.get("/users/") def read_users(db: Session = Depends(get_db)): # 의존성으로 주입된 db 세션 사용 return db.query(User).all()
Python
복사
간단한 제네레이터 함수
from fastapi import Depends from sqlalchemy.orm import Session from contextlib import contextmanager @contextmanager def get_session(): db = SessionLocal() try: yield db finally: db.close() def get_db(): with get_session() as db: yield db @app.get("/users/") def read_users(db: Session = Depends(get_db)): return db.query(User).all()
Python
복사
컨텍스트 관리자로 한번 더 감싸는 방법
여기서 get_db 함수(아래 코드의 get_session 함수)는 generator다. 라우트 함수 read_users가 호출되면 DB 세션을 생성하고 yield로 전달한 후, 라우트 함수 실행이 완료되면 finally 블록에서 DB 연결을 안전하게 닫는다. 라우트 함수 read_users가 DB 연결을 시작하고 닫는 것과 같은 관심사로부터 분리된다.
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
1.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
1.
2.
앞의 글은 제네레이터를 만드는 방법들 중, 제네레이터 함수를 만드는 방법에 대해서 설명하고 있다.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.
1.
None
ref : 생각에 참고한 자료입니다.
1.
None