💉

FastAPI Depends() — 함수 시그니처로 DI하는 방법

DB 세션, 인증, 페이지네이션을 함수 인자로 주입하는 패턴

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

@app.get('/users')
def list_users(db: Session = Depends(get_db)):
    return db.query(User).all()

Depends(get_db)가 하는 일: 엔드포인트가 호출되면 get_db()를 먼저 실행하고, yield된 dblist_users의 인자로 넣어준다. 응답 후에 finally 블록이 실행되어 db.close() 보장.

왜 이렇게 설계했나

  1. 테스트 용이성get_db를 mock으로 교체하면 DB 없이 테스트 가능
  2. 재사용 — 여러 엔드포인트에서 같은 Depends를 쓰면 중복 코드 제거
  3. 중첩 — Depends 안에서 다른 Depends를 호출 가능. 의존성 트리 자동 해결

내부 동작

FastAPI는 엔드포인트 함수의 시그니처를 inspect.signature()로 분석한다. Depends 타입의 기본값을 찾으면 해당 함수를 호출 스택에 추가한다. generator인 경우 contextlib.contextmanager처럼 처리해서 yield 전후를 분리한다.

인증도 같은 패턴이다:

def get_current_user(token: str = Depends(oauth2_scheme)):
    user = decode_token(token)
    if not user:
        raise HTTPException(401)
    return user

@app.get('/me')
def me(user: User = Depends(get_current_user)):
    return user

핵심 포인트

1

Depends(func)를 엔드포인트 인자의 기본값으로 설정

2

FastAPI가 inspect.signature()로 시그니처 분석 → Depends 자동 호출

3

generator(yield) 사용 시 yield 전 = 셋업, yield 후 = 클린업 보장

4

중첩 가능 — get_current_user → decode_token → oauth2_scheme

사용 사례

DB 세션 관리 — 요청마다 세션 생성/닫기 자동화 인증 — 토큰 검증을 Depends로 분리