상황
- 챗봇 코드를 비동기로 바꾸고 있는데 MySQL DB와 연결하는 pymysql 드라이버가 동기식이다.
- 따라서 pymysql을 대체할 MySQL 동기식 드라이버를 찾아야 한다.
- 그래도 성능이 좋은 걸 택하고 싶다.
설명
DB 드라이버(DB 어댑터)는 다음과 같은 역할을 한다.
- python에 connect(): Application과 Database를 연결
- connection에 대한 pool 관리
DB 풀에서 사용 가능한 데이터베이스 연결 하나를 빌려온다. 연결을 빌려온 후 작업을 마치고 반드시 연결을 풀에 반환한다. 연결을 빌려왔다면 그 연결을 통해 실제로 SQL 쿼리를 실행하고 이를 cursor()를 통해 수행한다. 즉 DB 연결 위에서 SQL 쿼리를 실행하고 그 결과를 받아오는 역할을 한다.
async/await를 사용하여 동시성을 지원하는 파이썬의 asyncio 라이브러리와 호환되어야 한다.
- mysql.connector.aio package: MySQL 공식 제공
- aiomysql: pymysql 개발자가 만든 pymysql 기반의 비동기 라이브러리
- pymysql처럼 순수 파이썬
- 내부적으로 PyMySQL의 복사본이지만 기저의 IO 호출을 비동기로 바꾼 형태
- 최신 2023.06
- asyncmy: 비동기 MySQL/MariaDB 드라이버
- pymysql과 aiomysql을 대부분 재사용했지만 핵심 프로토콜을 cython으로 구현
- 다른 드라이버와 비교했을 때 뛰어난 성능을 보임
- 최신 2024.12
cython은 파이썬 코드의 성능을 향상시키기 위해 개발된 프로그래밍 언어이자 라이브러리이다. 파이썬 코드를 C로 변환하고 컴파일하여 실행 속도를 크게 향상시킬 수 있다.
(cf. https://taejoone.jeju.onl/posts/2022-09-02-aiomysql-db-async-executor/, https://wikidocs.net/227944)
나는 조회(select)만 할 거기 때문에 select 부분만 참고했다. mysqlclient가 눈에 띄는 성능을 가진 것 같아 찾아봤더니 mysqlclient는 동기 블로킹 방식으로 작동하는 드라이버라고 한다. 동기식임에도 성능이 좋은 이유는 C로 구현되어 있기 때문이었다.
잘 모르겠지만 mysqlclient를 asyncio와 함께 사용했을 때 비동기 처리가 가능한가보다.
https://blog.naver.com/parkjy76/222135119765
mysqlclient 를 asyncio와 사용하기
참고: https://docs.python.org/3.7/library/asyncio-eventloop.html#executing-code-in-thread-or-process...
blog.naver.com
asyncmy는 asyncio 기반으로 MySQL 프로토콜을 구현했다고 한다. aiomysql이나 pymysql처럼 다른 저수준 드라이버에 의존하지 않고 자체적으로 비동기 I/O를 처리할 수 있다. 나중에 ORM을 사용해야 할 필요성이 생기거나, 더 복잡한 데이터베이스 모델링이 필요하면 SQLAlchemy + asyncmy를 함께 사용할 수 있는데, gemini 피셜 이 조합이 파이썬 비동기 데이터베이스 연동의 최상위 권장 스택이라고 한다.
https://pypi.org/project/asyncmy/
Client Challenge
JavaScript is disabled in your browser. Please enable JavaScript to proceed. A required part of this site couldn’t load. This may be due to a browser extension, network issues, or browser settings. Please check your connection, disable any ad blockers, o
pypi.org
cf. SQL Alchemy: Python SQL 툴킷, ORM 라이브러리 (SQL 성능과 유연성 지원), 동기 비동기 모두 지원
결정
- 프로젝트에서는 select 성능이 그래도 가장 좋은 asyncmy을 사용해야겠다.
- 가상환경으로 실행 중이라 yml 파일에서는 pip 아래 asyncmy를 두었다.
성능 비교를 해야 체감할 수 있을 텐데 일단 남겨두자...
'패스트캠퍼스 백엔드 부트캠프 3기 > Project' 카테고리의 다른 글
[Project] onErrorResume 타임 아웃 예외 처리 (0) | 2025.06.22 |
---|---|
[Project] 챗봇 파이썬 응답 흐름, 예외처리 정리 (0) | 2025.06.12 |
[Project] CORS 개념 및 에러 처리 (0) | 2025.06.05 |
[Project] Github 일정 관리 방식, Jira-Github 연동 정리 (0) | 2025.05.13 |
[Project] 서로 다른 서버 연결 시 RestTemplate, WebClient, RestClient (0) | 2025.04.12 |