🐍 Python + PyMySQL로 MySQL 리팩토링(2/2)

2025. 3. 21. 18:52·기술블로그

🐍 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
'기술블로그' 카테고리의 다른 글
  • 📌 MySQL 데이터베이스 정리 (with 크롤링 in Selenium, PymySQL)
  • 📌 크롤링 시 IndexError 예외처리 방법 (초기값은 있었지만 없을경우)
  • 🐍 Python + PyMySQL로 MySQL 고객 정보 다루기(1/2)
  • Database - SQL에서 JOIN을 언제, 왜, 어떻게 사용할까?
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (777) N
      • Python (32)
      • 프로젝트 (101) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    titaniumcase
    newpoliticalparty
    youngprofessionals
    smartphonedurability
    americanlaw
    college reunions
    americaparty
    btscomeback
    hotcoffeecase
    RM
    bts
    btsreunion
    livebroadcast
    travel ban
    homebartrend
    urbantrends
    life reflection
    btsdischarge
    trumpmuskclash
    remittance
    chinanightlife
    gpterror
    global politics
    chatgpterror
    self-growth
    basalcellcarcinoma
    btsjungkook
    lawsuitculture
    뷔
    classaction
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
🐍 Python + PyMySQL로 MySQL 리팩토링(2/2)
상단으로

티스토리툴바