포시코딩

[Flask] DB 모듈화 - app.py에서 class로 분리하기 (pymysql) 본문

Python/Flask

[Flask] DB 모듈화 - app.py에서 class로 분리하기 (pymysql)

포시 2022. 12. 7. 19:39
728x90

개요 및 문제발견

팀프로젝트에서 pymysql을 통해 mysql과 연동을 하기로 결정했다.

app.py 각 함수에서 db를 호출해 쓰고 데이터 처리 후 db.close() 해주는 방식으로 만들었는데

만들고보니 코드가 너무 더러웠다.

(before)
db = pymysql.connect(
host='127.0.0.1',
user='root',
db='dog94',
password='dog94',
charset='utf8')
curs = db.cursor(pymysql.cursors.DictCursor)

email_receive = request.form.get("email_give")

curs.execute('SELECT * FROM user WHERE email = %s', (email_receive))
check = curs.fetchall()
db.commit()
db.close()

(SELECT문 하나를 위해 이런 코드가 계속 반복되었다.)

 

좋은 방법이 없을까하다가 해당 db 관련된 부분을 클래스화 시켜 사용하면 어떨까라는 의견이 나왔고

바로 작업에 들어갔다.

 

해결방안 적용 및 결과

(db.py)
import pymysql

class DB:
  def __init__(self, dict):
    self.con = pymysql.connect(
      host='localhost',
      user='root',
      password='dog94',
      db='dog94',
      charset='utf8',  # 한글처리 (charset = 'utf8')
      autocommit=True,  # 결과 DB 반영 (Insert or update)
    )
    if dict=='dict':
      self.cur = self.con.cursor(pymysql.cursors.DictCursor)
    else:
      self.cur = self.con.cursor()

  def select_one(self, sql, args=None):
    self.cur.execute(sql, args)
    result = self.cur.fetchone()
    self.cur.close()
    self.con.close()
    return result
    
  def select_all(self, sql, args=None):
    self.cur.execute(sql, args)
    result = self.cur.fetchall()
    self.cur.close()
    self.con.close()
    return result

  def save_one(self, sql, args=None):
    result = self.cur.execute(sql, args)
    self.cur.close()
    self.con.close()
    return result

  def save_all(self, sql, args=None):
    result = self.cur.executemany(sql, args)
    self.cur.close()
    self.con.close()
    return result

app.py 옆에 db.py로 위와 같은 클래스를 만들었고, 

위에서 email 관련 코드에 적용한 결과는 다음과 같다.

(after)
email_receive = request.form.get("email_give")

sql = 'SELECT * FROM user WHERE email = %s'
conn = DB('dict')
check = conn.select_one(sql, email_receive)

한눈에 봐도 코드가 확 줄은걸 볼 수 있는데 

전체 코드상으로는 100줄 가량이 줄어들었다.

471줄 -> 381줄로 줄어들었다.

 

후기

그 이후로도 추가되는 기능들에서 db 모듈은 계속 사용되었고 

다른 팀원 모두 처음에는 어색해했지만 이내 편리함을 느꼈다고 말해주었다.

 

최종적으로 우리는 db 모듈화를 통해 처음에 얻고자 했던 코드의 간략화, 단순화를 포함해서

재사용성으로 인한 개발과 유지보수에 까지 긍정적인 결과를 얻을 수 있었다.

 

 

 

 

도움을 얻은 곳

https://velog.io/@kwonyoung/Python-pymysql로-MaridDB-연결-클래스-모듈화

 

[Python] pymysql로 MaridDB 연결 클래스 모듈화

위와 같이 DB 클래스를 하나 생성해두면 다른 파일에서 불러와 바로 사용 가능SELECT (UPDATE, INSERT, DELETE) ONE(UPDATE, INSERT, DELETE) ALLone과 all을 분리한 이유는 executmany를 넣을 때 1차원 리스트를

velog.io

728x90