인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

문승주님의 프로필 이미지

작성한 질문수

실전! FastAPI 활용(비동기)

데이터베이스 비동기 전환

비동기 await 관련

해결된 질문

작성

·

61

0

기존에는 fastapi를 간략하게 이해하고, async def를 쓰면 비동기처리를 수행한다고 해서, 사용하였지만, 비동기처리가 안 되길래, 무슨 문제인지 몰랐는데, await를 추가해줘야 한다는 것을 알게 되었습니다.

 

그러면 강의에서는 네트워크 IO를 발생시키는 작업에 대해서는 await를 사용하신다고 하고, ORM 객체 명령어는 동기처리를 해도 된다고 하셨는데, commit이랑 DB에서 사용되는 CRUD가 주로 네트워크 IO를 발생시키는 작업이라고 이해해도 되는걸까요?

답변 2

0

신동현님의 프로필 이미지
신동현
지식공유자

안녕하세요, 답변부터 드리자면 맞습니다.


ORM을 사용한 CRUD 과정은 내부적으로는 데이터베이스와 데이터를 주고 받는 부분과 파이썬 메모리 상에서 데이터를 객체와 매핑하는 부분으로 이루어집니다.

[ 개발자 코드 <-> ORM(라이브러리) <-> 데이터베이스 ]


따라서 commit(변경 사항을 영구적으로 저장하는 과정), 데이터 읽기 등 데이터베이스와 실제로 데이터를 주고 받을 때만 네트워크 I/O가 발생하고 이 경우에 대해서만 비동기 프로그래밍을 적용할 수 있습니다.


"commit이랑 DB에서 사용되는 CRUD가 주로 네트워크 IO를 발생시키는 작업" 보다는 "ORM 사용시 네트워크 I/O는 데이터베이스와 실제로 데이터를 주고 받을 때만 발생한다" 라고 이해하는 것이 조금 더 맞는 표현입니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 문승주님.

비동기 프로그래밍의 핵심은 I/O 바운드 작업, 즉 네트워크와의 통신이나 파일 시스템과의 상호작용과 같은 작업에서 효율성을 극대화하는 것입니다. 그렇기 때문에 async def를 사용하면서도, 이러한 I/O 바운드 작업을 비동기로 실행할 수 있도록 await 키워드를 사용해야 합니다.

구체적으로 말씀드리자면:

  1. 네트워크 I/O: REST API 요청, 데이터베이스 쿼리 실행 등은 네트워크 I/O를 발생시키며, 이러한 작업은 await을 사용해 비동기로 처리할 수 있습니다.

  2. 데이터베이스 작업: 일반적으로 데이터베이스와의 상호작용(특히 쿼리 실행과 같은 CRUD 작업)은 네트워크를 통한 것이므로, 비동기적으로 처리할 수 있습니다. 반면에, 일부 ORM은 동기적 모델만을 제공하므로, 동기 함수로 사용해야 할 수도 있습니다. 예를 들어, SQLAlchemy는 전통적으로 동기 API로 작동하므로, 이를 비동기적으로 사용하려면 추가적으로 비동기 드라이버와의 결합이 필요합니다.

존재하는 유사한 질문의 예시는 다음과 같습니다:

위의 게시물은 Django와 FastAPI 간의 차이점을 다루며, 비동기 API 사용 시의 장단점에 대한 이해를 돕습니다. 이러한 점들을 바탕으로 실무 환경에서 비동기 기능을 올바르게 이해하고 적용할 수 있을 것입니다.

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