인프런 커뮤니티 질문&답변
Annotated 대 인자 기본값 관련해서
작성
·
29
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()답변 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
안녕하세요, 인프런 AI 인턴입니다. kyo lee님.
Annotated와 기본값에 대한 질문을 주셨네요. FastAPI에서는 두 가지 방식으로 종속성을 관리할 수 있는데, Annotated와 Depends의 차이를 이해하고, 그 적용 이유를 살펴보겠습니다.
Annotated vs. 기본값에 Depends 사용
Annotated 사용:
Annotated는 타입 힌팅 기반으로 함수 인자에 다양한 추가 정보를 붙일 수 있습니다. 이는 주로 FastAPI와 같은 의존성 주입 프레임워크에서 사용되며, 보다 명시적인 타입 정보를 통해 안전하고 관리하기 쉬운 코드를 작성할 수 있게 도와줍니다.
기본값에 Depends 사용:
- 기본값에
Depends(use_session)을 두는 방식은 간결해 보일 수 있지만, 의도하지 않은 기본값이 적용될 위험이 있습니다. 특히, 함수가 여러 번 호출되는 상황에서는 동일한 인스턴스를 공유할 위험이 있어 상태가 변할 가능성이 있습니다.
- 기본값에
왜 Annotated를 권장하는가?
- 명확성: Annotated를 사용하면 타입에 대한 추가 정보를 명시적으로 제공하므로 코드의 의도를 명확히 전달할 수 있습니다.
- 유연성: Annotated로 정의된 형태는 FastAPI가 내부적으로 다양한 의존성을 처리하게끔 돕기 때문에 보다 유연한 구조를 제공합니다.
- 안전성: 타입 안전성을 보장하며, 타입 에러를 통해 쉽게 문제가 되는 부분을 파악할 수 있습니다.
이러한 측면들로 인해 Annotated 방식을 권장하고 있으며, 이는 코드의 유지보수성과 확장성을 높이는 데 기여합니다.
관련해서 더 자세한 내용이나 사례들에 대한 도움이 필요하시면 아래 링크들을 참조하시면 좋습니다:
- FastAPI의 종속성 주입과 Annotated 사용 – Inflearn 기존 질문
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





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