Flask + DB Connection Pool 설정(feat. MySQL)

Photo by Simone Viani on Unsplash

 요약

  1. DB Connection Pool을 관리하는 클래스를 작성한다. (class DbPool)
    - DB Connection Pool을 생성하는 메서드 
    - DB Connection을 리턴하는 메서드 
  2. Flask app 객체를 만들 때 DbPool 클래스 객체를 생성한다. 
    - 초기화 메서드를 호출해서 DB Connection Pool을 생성한다. 
  3. DB 커넥션이 필요하면 DbPool 클래스 객체의 메소드를 통해 커넥션을 가져온다. 

왜?

점프 투 플라스크와 인터넷을 참고해서 웹애플리케이션을 만들었다. 서버에 올리려고 보니, DB 접속할 때마다 커넥션을 맺는 부분이 찜찜했다. 매번 페이지를 호출할 때마다 커넥션을 맺는다는 건 너무 비효율적이잖아. 검색을 해보니 커넥션 풀을 만드는 방법은 많았다. 하지만 Flask에서 효과적으로 적용하는 방법은 찾을 수가 없었다. 파이썬에 기본기가 부족해서 당연한 걸 모르고 있을 수도 있겠다. 그렇게 헤매이다가 파이썬의 클래스라는 개념을 알게 되었다. 이걸 쓰면 되겠다 싶었다. 결국 클래스를 이용해서 Flask에서 DB 커넥션 풀을 생성하고 이용하는 코드를 작성하게 되었다. 


DB Connection Pool을 관리하는 클래스

DbPool 클래스를 작성했다. init() 메서드는 커넥션 풀을 초기화하 한다. 그리고 get_connection() 메서드는 커넥션 풀에 담긴 커넥션을 하나 제공한다. 

import mysql.connector.pooling


class DbPool:
    __connectionPool = -1

    def __init__(self):
        pass

    def init(self, **kwargs):
        self.__connectionPool = mysql.connector.pooling.MySQLConnectionPool(pool_name="my_pool",
                                                                            pool_size=5,
                                                                            **kwargs)

    def get_connection(self):
        return self.__connectionPool.get_connection()


Flask app 객체를 만들 때, DB Connection Pool 생성

Flask 객체를 생성할 때 DbPool 객체의 init() 메서드를 호출해서 커넥션 풀을 생성한다. 이제 다른 모듈에서 db_pool의 get_connection() 메소드를 호출하여 커넥션을 얻을 수 있다. 

from ……
from ...db_util import DbPool

db_pool = DbPool()


def create_app():
    app = Flask(__name__)
    app.config.from_envvar('APP_CONFIG_FILE')

    # 블루프린트
    from .views import main_........
    app.register_blueprint(main_......)

    db_pool.init(**app.config['DB_CONFIG'])

    ……..

    return app


모듈에서 DB Connection 사용

모듈에서는 db_pool.get_connection()을 호출하여 커넥션을 받아서 CRUD를 처리한다. 그리고 close() 메서드를 호출하여 커넥션을 반환한다.

from ………. import db_pool

@bp.route('/blahblah/')
def blah():
    …………
    conn = db_pool.get_connection()
    curs = conn.cursor()
    sql = 'select **** from ******'
    curs.execute(sql)
    for (blah) in curs:
        print("{}".format(blah))

    curs.close()
    conn.close()

    return ……


에필로그

주변에 파이썬 개발자가 있다면 이렇게 고민하지 않았을텐데 하는 생각이 들면서도, 덕분에 파이썬에 대한 지식이 업그레이드 된 걸 생각하면 다행이란 생각도 든다. (답답해서 숨고에 파이썬 과외를 등록해 볼까도 생각했었다.)

몇 가지 궁금한 점이 생겼다. 

  • Flask에서 DB Connection Pool을 쓰는 최선의 방법은 무엇일까?
  • 파이썬에서 인기있는 DB Connection Pool 라이브러리는 무엇일까? 그런 순위가 나온 사이트는 어디 없을까?
  • 파이썬에는 자바 진영의 Spring과 같은 역할을 하는 것이 있을까?


댓글 쓰기

0 댓글