🐍 Python + PyMySQL 리팩토링 분석
이번 포스팅에서는 PyMySQL 기반 CRUD 코드의 리팩토링 과정을 분석하고, 어떤 방식으로 효율성이 향상되었는지 설명합니다.
✅ 기존 구조와 문제점
기존에는 각 작업(SELECT, INSERT, UPDATE, DELETE)을 수행할 때마다 cursor를 반복 생성하며 동일한 구조의 코드가 중복되었습니다:
with connection.cursor() as cursor:
cursor.execute(query, values)
connection.commit()
🔁 문제점:
- 코드 중복이 많아 가독성이 떨어지고, 유지보수가 어려움
- 각각의 연산마다 예외 처리 및 커밋 처리 구조를 반복해야 함
🔁 리팩토링 후 구조
✨ 핵심 함수: execute_query() 정의
def execute_query(connection, query, args=None):
with connection.cursor() as cursor:
cursor.execute(query, args or ())
if query.strip().upper().startswith('SELECT'):
return cursor.fetchall()
else:
connection.commit()
기능 설명
SELECT 구문 | 결과를 fetchall()로 반환 |
INSERT/UPDATE/DELETE 구문 | 자동으로 commit() 처리 |
✅ 장점:
- 코드 재사용 가능성 증가
- 불필요한 중복 제거로 가독성 향상
- SELECT와 그 외 연산을 분리 처리하여 명확한 흐름 유지
⚙️ main() 함수 구조 변경
def main():
connection = pymysql.connect(...)
try:
result = execute_query(connection, "SELECT * FROM customers")
execute_query(connection, "INSERT INTO ...", values)
execute_query(connection, "UPDATE ...", values)
execute_query(connection, "DELETE ...", values)
finally:
connection.close()
🔍 리팩토링의 결과
개선 전 개선 후
각 연산마다 cursor, commit 반복 | 공통 함수 하나로 통일 처리 |
중복된 구조로 인해 유지보수 어려움 | 변경 시 하나의 함수만 수정하면 됨 |
코드량 많고 가독성 낮음 | 깔끔하고 명확한 실행 흐름 유지 |
📌 리팩토링으로 얻는 실질적 효율성
항목 개선 효과
✅ 유지보수 | 함수 하나만 수정해도 전체 흐름에 적용됨 |
✅ 가독성 | 불필요한 중복 제거로 구조가 단순함 |
✅ 확장성 | 향후 다른 테이블 쿼리도 쉽게 확장 가능 |
✅ 예외 처리 | try-finally 구조로 안정성 유지 |
💻 리팩토링 후 전체 코드 예시
import pymysql
def execute_query(connection, query, args=None):
with connection.cursor() as cursor:
cursor.execute(query, args or ())
if query.strip().upper().startswith('SELECT'):
return cursor.fetchall()
else:
connection.commit()
def main():
connection = pymysql.connect(host='localhost',
user='root',
password='7722',
db='classicmodels',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
# SELECT 연산
result = execute_query(connection, "SELECT * FROM customers")
print("SELECT 연산 결과:")
for row in result:
print(row)
# INSERT 연산
execute_query(connection, """
INSERT INTO customers (customerNumber, customerName, contactLastName, contactFirstName, phone, addressLine1, city, country, creditLimit)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
""", (100234, "Sang In Company", "Lee", "Sang In", "010-1234-5678", "123 Street", "Seoul", "South Korea", 50000.00))
print("INSERT 연산 수행됨.")
# UPDATE 연산
execute_query(connection, """
UPDATE customers SET customerName=%s, contactLastName=%s WHERE customerNumber=%s
""", ('update_sangin', 'update_lee', 1000))
print("UPDATE 연산 수행됨.")
# DELETE 연산
execute_query(connection, "DELETE FROM customers WHERE customerNumber = %s", (9999,))
print("DELETE 연산 수행됨.")
finally:
connection.close()
if __name__ == "__main__":
main()
🔚 마무리
- 하나의 공통 쿼리 실행 함수를 만들어 코드 중복을 제거
- 코드 가독성과 유지보수성을 크게 향상시킨 리팩토링
- 실무에서도 가장 기본적이지만 중요한 개선 방식
📢 다음 글에서는 fetchone(), 파라미터 바인딩, 예외 종류별 처리까지 확장해보겠습니다!
'기술블로그' 카테고리의 다른 글
📌 MySQL 테이블에서 중복된 데이터를 효과적으로 삭제하는 방법 (0) | 2025.03.25 |
---|---|
📌 MySQL 데이터베이스 정리 (with 크롤링 in Selenium, PymySQL) (0) | 2025.03.25 |
📌 크롤링 시 IndexError 예외처리 방법 (초기값은 있었지만 없을경우) (0) | 2025.03.25 |
🐍 Python + PyMySQL로 MySQL 고객 정보 다루기(1/2) (0) | 2025.03.21 |
Database - SQL에서 JOIN을 언제, 왜, 어떻게 사용할까? (0) | 2025.03.21 |