inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[매일 완독 챌린지] 저자와 함께하는 <FastAPI로 기획에서 출시까지>

6장 : pytest 픽스쳐로 의존성 주입하기 (p190~p200)

Annotated 대 인자 기본값 관련해서

해결된 질문

53

kyo lee

작성한 질문수 14

0

default_deps에서 기본 값으로 Depends 함수가 반환하는 객체가 할당되는 것까지는 이해했는데, 해당 동작이 왜 의도하지 않은 동작인 건지가 이해되지 않습니다. 오히려 아래 쪽이 기본값이 적용되니 더 편리해 보이기만해서 Annotated를 권장하는 이유가 와닿지 않더라구여. 이에 대해서 조금 더 구체적으로 알고 싶습니다.

DbSeDep = Annotated[AsyncSession, Depends(use_session)]

async def annotated_deps(session: DbSeDep):
    pass

annotated_deps()

async def default_deps(session: AsyncSession = Depends(use_session)):
    pass

default_deps()

python aws tdd FastAPI 북-챌린지

답변 2

1

한날

예시 코드는 FastAPI가 호출하는 게 아니라 해당 코루틴(함수)을 직접 호출하는 상황인데, default_deps() 의 session 매개변수는 기본값 인자로 Depends 객체가 할당된 상태입니다. 우리가 기대하는 것은 use_session() 으로부터 넘겨밖은 AsyncSession 이지만, 실제로는 Depends 객체이죠.

따라서 default_deps() 안에서 다음과 같은 코드가 있다면 AttributeError 가 발생할 것입니다. 인자인 session은 AsyncSession 이 아니라 Depends 객체이기 때문이지요.

async def default_deps(session: AsyncSession = Depends(use_session)):
    stmt = select(User)
    result = await session.execute(stmt)

또한 맥락상 위 코루틴들은 AsyncSession 을 필수 인자로 받아야 합니다. 누락하면 TypeError 가 나야하지요. 이 코루틴을 FastAPI 종단점 함수로 실행하지 않고, 코루틴 자체를 직접 호출해 사용한다면 default_deps()session 인자를 필수로 받아야한다는 의도로 동작하지 않는 셈입니다.

 

0

kyo lee

코루틴을 직접 호출하는 과정에서의 문제였군요. 감사합니다!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. kyo lee님.

Annotated와 기본값에 대한 질문을 주셨네요. FastAPI에서는 두 가지 방식으로 종속성을 관리할 수 있는데, AnnotatedDepends의 차이를 이해하고, 그 적용 이유를 살펴보겠습니다.

Annotated vs. 기본값에 Depends 사용

  1. Annotated 사용:

    • Annotated는 타입 힌팅 기반으로 함수 인자에 다양한 추가 정보를 붙일 수 있습니다. 이는 주로 FastAPI와 같은 의존성 주입 프레임워크에서 사용되며, 보다 명시적인 타입 정보를 통해 안전하고 관리하기 쉬운 코드를 작성할 수 있게 도와줍니다.
  2. 기본값에 Depends 사용:

    • 기본값에 Depends(use_session)을 두는 방식은 간결해 보일 수 있지만, 의도하지 않은 기본값이 적용될 위험이 있습니다. 특히, 함수가 여러 번 호출되는 상황에서는 동일한 인스턴스를 공유할 위험이 있어 상태가 변할 가능성이 있습니다.

왜 Annotated를 권장하는가?

  • 명확성: Annotated를 사용하면 타입에 대한 추가 정보를 명시적으로 제공하므로 코드의 의도를 명확히 전달할 수 있습니다.
  • 유연성: Annotated로 정의된 형태는 FastAPI가 내부적으로 다양한 의존성을 처리하게끔 돕기 때문에 보다 유연한 구조를 제공합니다.
  • 안전성: 타입 안전성을 보장하며, 타입 에러를 통해 쉽게 문제가 되는 부분을 파악할 수 있습니다.

이러한 측면들로 인해 Annotated 방식을 권장하고 있으며, 이는 코드의 유지보수성과 확장성을 높이는 데 기여합니다.

관련해서 더 자세한 내용이나 사례들에 대한 도움이 필요하시면 아래 링크들을 참조하시면 좋습니다:
- FastAPI의 종속성 주입과 Annotated 사용 – Inflearn 기존 질문

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

4주 1회차 과제

0

48

2

4주 5회차 과제

0

48

1

4주 5회차 과제 제출

0

57

2

4주 4회차 과제 제출

0

67

2

351쪽 질문

0

57

2

4주 3회차 과제

0

54

2

refresh() 메서드와 픽스처에 대해 질문이 있습니다.

0

64

2

4주 2회차 과제 질문

0

61

3

4주 1회차 과제

0

56

2

4주 1회차 과제

0

47

2

4주 3회차 과제

0

60

2

4주 1회차 과제

0

57

2

4주 3회차 과제

0

42

1

4주 5회차 과제

0

43

2

4주 1회차 과제

0

34

2

4주 1회차 과제

0

29

2

4주 4회차 과제 제출

0

42

2

4주 1회차 과제 제출합니다.

0

47

1

4주 2회차 과제

0

52

1

patch 요청시 payload가 넘어가지 않습니다.

0

63

3

4주 1회차 과제

3

122

2

페이지 144 코드 문의

0

70

3

책과 github 코드가 다릅니다 p130

0

54

2

120페이지 코드 질문드립니다.

0

54

2