패스트캠퍼스 백엔드 부트캠프 3기/Project

[Project] 데이터베이스 연결 드라이버 선택

hail2y 2025. 6. 23. 11:21

상황

  • 챗봇 코드를 비동기로 바꾸고 있는데 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)

https://github.com/long2ice/asyncmy

나는 조회(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를 두었다.

 

성능 비교를 해야 체감할 수 있을 텐데 일단 남겨두자...