Search
🔵

a2.6.1_1_1. title: 비동기 미지원은 async 함수를 작성할 수 없거나, await 명령어를 사용할 수 없음을 의미한다. FastAPI같은 python 비동기 서버 애플리케이션을 위한 특별한 라이브러리와 DB 세팅들이 있다.

생성
prev summary
🚀 prev note
♻️ prev note
next summary
🚀 next note
관련 임시노트
9 more properties

async db driver

sqlalchemy 등을 사용해서 DB에 연결할 때, mysql 클라이언트로 pymysql 대신 aiomysql, sqlite 클라이언트로 aiosqlite를 사용해야 await 명령어를 이용할 수 있다. 이는 기본 클라이언트가 비동기 작업을 지원하지 않으므로 코드 내에서 await 키워드로 비동기 실행을 할 수 없다는 의미이다. 비동기 데이터베이스 작업을 수행하려면 반드시 'aio' 접두사가 붙은 비동기 지원 드라이버를 사용해야 하며, 이와 함께 sqlalchemy.ext.asyncio의 create_async_engine을 활용해야 완전한 비동기 데이터베이스 워크플로우를 구현할 수 있다. sqlalchemy URL은 DB와 파이썬 드라이버를 모두 포함하여 만들기 때문에, 동기식 드라이버를 사용하는 mysql+pymysql://user:password@host:port/dbname 대신 mysql+aiomysql://user:password@host:port/dbname 을 사용한다.

async pytest

표준 pytest는 기본적으로 동기 함수만 테스트할 수 있어서 비동기 코드를 테스트하려면 pytest-asyncio 플러그인을 설치해야 한다. 이 플러그인은 테스트 함수에 @pytest.mark.asyncio 데코레이터를 사용할 수 있게 해주며, 이를 통해 pytest가 async/await 구문이 포함된 테스트 함수를 올바르게 실행하고 비동기 코드의 결과를 기다릴 수 있게 된다. 따라서 SQLAlchemy의 비동기 세션이나 FastAPI의 비동기 엔드포인트 같은 비동기 코드를 테스트할 때는 반드시 pytest-asyncio를 함께 사용해야 정확한 테스트 결과를 얻을 수 있다.

async client

FastAPI의 TestClient는 내부적으로 httpx를 사용하여 실제 서버를 시작하지 않고도 애플리케이션을 테스트할 수 있게 해준다. httpx는 pip를 이용한 fastapi 설치 시 fastapi[full]로 설치하지 않았다면 별도의 설치가 필요하다.
from fastapi.testclient import TestClient from my_app import app # FastAPI 애플리케이션 client = TestClient(app) response = client.get("/users") # 서버 없이 API 엔드포인트 호출 assert response.status_code == 200
Python
복사
httpx가 비동기를 지원한다는 것은 알겠는데, 어떻게 TestClient는 서버 없이 엔드포인트를 호출할 수 있을까? 이것이 가능한 이유는 httpx가 ASGI(Asynchronous Server Gateway Interface) 애플리케이션을 직접 호출할 수 있는 ASGITransport라는 특별한 전송 계층을 제공하기 때문이다.
TestClient를 사용하면 FastAPI 애플리케이션을 ASGI 애플리케이션으로 취급한다. 네트워크 소켓을 열거나 HTTP 서버를 실행하지 않고 ASGI 애플리케이션(FastAPI의 라우터와 미들웨어 체인 등)을 직접 호출할 수 있다.
WSGI(python2.2)는 웹 서버가 Python 애플리케이션과 통신하는 방법, 요청을 전달하고 응답을 받는 방식(과거에는 Request, Response 객체 모델이 프레임워크마다 달랐음), 호출 규약 등을 정의하는 표준이다. ASGI(python3.5)는 기존 비동기 작업을 처리할 수 있도록 재설계된 표준을 의미한다(ref1). 미들웨어는 요청이 라우트 핸들러에 도달하기 전이나 응답이 클라이언트에게 반환되기 전에 실행되는 함수로, 인증이나 로깅 같은 것들을 처리한다.
동기 클라이언트만 사용한다면 FastAPI 애플리케이션을 별도 서버로 실행하고 요청을 보내야 하므로 테스트 속도가 느려지고 코드가 복잡해질 수 있다.
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
1.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
1.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.
1.
None
ref : 생각에 참고한 자료입니다.