반응형

파이썬 데이터베이스 프로그래밍 완전 정복
: MySQL과 PyMySQL 연동하기

파이썬으로 데이터베이스를 다룰 수 있다면,
데이터 분석부터 웹 서비스까지 훨씬 유연해진다는 사실 알고 계셨나요?

 

 

안녕하세요, 데이터 프로그래밍에 관심 있는 여러분!

오늘은 파이썬으로 MySQL 데이터베이스에 접속하고 데이터를 다루는 방법에 대해 살펴보려 해요.

개발자로서 반드시 익혀야 할 파이썬 DB 연동 기초부터 시작해, 실전에서 바로 쓸 수 있는 예제까지 하나하나 짚어볼게요.

특히 초보자 분들도 따라 하기 쉽도록 PyMySQL 라이브러리를 중심으로 구성했답니다.

자, 그럼 파이썬과 MySQL의 만남, 지금부터 본격적으로 시작해볼까요? 😎

 

1. MySQL과 파이썬 연동 개요 🛠️

파이썬은 다양한 데이터 분석, 웹 프로그래밍, 자동화 작업에 활용되는 인기 있는 프로그래밍 언어입니다.

그런데 이런 작업의 대부분이 데이터베이스와의 연동을 필요로 한다는 사실, 알고 계셨나요?

그중에서도 MySQL은 오픈소스 관계형 데이터베이스(RDBMS)로 가장 많이 사용되는 시스템 중 하나예요.

웹 개발이나 데이터 분석, 자동화 프로젝트에서 MySQL은 필수 도구처럼 사용되곤 하죠.

특히 WordPress, PHP 기반 웹사이트, Django, Flask와의 연동에서도 핵심적인 역할을 해요.

왜 MySQL인가요?

  • 오픈소스이기 때문에 무료로 사용할 수 있음
  • 대규모 서비스에서도 안정적으로 운영 가능
  • SQL 표준에 기반한 친숙한 쿼리 구조
  • 다양한 플랫폼(OS)에서 활용 가능 (Windows, Linux, macOS 등)

파이썬과 MySQL이 만나면?

파이썬에서 MySQL을 사용하기 위해서는 중간에서 연결을 도와주는 라이브러리가 필요합니다.

쉽게 말해, 파이썬이 MySQL이라는 언어를 이해할 수 있도록 통역해주는 도구인 셈이죠.

라이브러리명 설명 설치 명령어
PyMySQL 순수 파이썬 기반의 MySQL 드라이버.
가볍고 사용하기 쉬움
pip install PyMySQL
mysql-connector-python Oracle이 제공하는 공식 MySQL 커넥터 pip install mysql-connector-python
mysqlclient C 기반 드라이버로 성능은 좋지만 설치 난이도 있음 pip install mysqlclient

초보자에게는 PyMySQL이 가장 무난한 선택이에요.

이 글에서는 PyMySQL을 중심으로 MySQL 접속 → 데이터 조회 → 입력/수정/삭제 → 클래스 구조화까지 차근차근 설명드릴게요!

 

 

2. 어떤 라이브러리를 써야 할까? - PyMySQL vs mysql-connector 등 📦

파이썬에서 MySQL과 연결하려면 전용 드라이버(또는 커넥터)를 설치해야 해요.

이 커넥터는 파이썬 코드가 MySQL 서버에 접속해서 데이터를 주고받도록 도와주는 다리 같은 역할을 해요.

그런데, 이 커넥터도 종류가 여러 가지라 뭘 써야 할지 처음에는 좀 헷갈릴 수 있어요. 😅

여기선 가장 많이 쓰이는 네 가지를 소개하고, 각각의 장단점을 정리해봤어요.

대표적인 MySQL 연동 라이브러리 비교

라이브러리 특징 설치 명령
PyMySQL 순수 파이썬 구현. 설치가 쉽고 가볍다.
학습용 및 일반 서비스에 적합.
pip install PyMySQL
mysql-connector-python MySQL 공식 지원 커넥터.
성능도 괜찮고 문서도 충실.
pip install mysql-connector-python
mysqlclient C 기반. 성능은 뛰어나지만 설치 과정이 복잡함
(특히 Windows 환경).
pip install mysqlclient
oursql 예전에는 많이 쓰였지만 현재는 유지보수 중단.
추천 ❌
pip install oursql

👶 초보자에게 추천: PyMySQL

처음 MySQL 연동을 해본다면 PyMySQL을 추천드려요.

설치도 간단하고, 파이썬 문법과도 자연스럽게 어울립니다.

라이브러리 구조도 깔끔해서 SELECT, INSERT, UPDATE, DELETE 같은 기초적인 쿼리부터 시작하기에 딱 좋거든요.

🚀 고성능이 필요하다면?

프로덕션(운영 서버) 환경에서는 mysqlclient를 사용하는 경우도 많습니다.

다만 설치가 까다로울 수 있어서 어느 정도 리눅스와 컴파일 환경에 익숙한 분들에게 적합해요.

 

다음 단계에서는 본격적으로 MySQL에 접속하는 코드를 작성해볼게요!

어떻게 connect() 함수를 쓰고, 데이터베이스에 로그인하는지 직접 실습하면서 배워보죠. 🎯

 

 

3. MySQL 데이터베이스 연결 방법 (connect 함수 활용법) 🔌

자, 이제 본격적으로 MySQL 데이터베이스에 접속해볼 시간이에요!

우리가 사용할 PyMySQL 라이브러리는 간단한 방식으로 DB에 연결할 수 있도록 connect()라는 함수를 제공합니다.

기본 연결 구조

다음은 PyMySQL을 이용해 로컬 MySQL 서버에 접속하는 가장 기본적인 예제입니다.

import pymysql

# MySQL 접속
conn = pymysql.connect(
    host='localhost',       # 또는 '127.0.0.1'
    user='your_username',   # MySQL 사용자 계정
    password='your_password', # 비밀번호
    db='your_database',     # 접속할 DB명
    charset='utf8'          # 인코딩 설정
)

📌 각 인자 설명

  • host: MySQL 서버가 설치된 위치. 로컬이라면 'localhost' 또는 '127.0.0.1'
  • user: 접속할 MySQL 계정
  • password: 사용자 비밀번호
  • db: 사용할 데이터베이스 이름
  • charset: 문자 인코딩 설정 (일반적으로 'utf8' 권장)

✅ 접속 성공 여부 확인

try:
    conn = pymysql.connect( ... )  # 생략된 연결정보
    print("DB 연결 성공!")
except Exception as e:
    print("DB 연결 실패:", e)

MySQL 접속은 성공하면 곧바로 쿼리를 실행할 수 있는 커서(cursor)를 생성해 사용할 수 있어요.

 

이제 다음 단계에서는 이 커서를 이용해 SELECT 쿼리를 실행하고 데이터를 조회해보는 방법을 배워볼게요. 슬슬 재미있어지기 시작하죠? 😄

 

 

4. Cursor를 이용한 SELECT 쿼리 실행과 결과 출력 방법 🔍

DB 연결에 성공했다면, 이제는 MySQL의 데이터를 조회(SELECT)해서 화면에 출력해보는 단계로 넘어가볼게요.

여기서 핵심 역할을 하는 게 바로 cursor() 객체입니다.

cursor란?

간단히 말해 cursor는 데이터베이스와 연결된 파이썬 측 커맨드 센터에요.

우리가 SELECT 쿼리를 날리면, cursor가 DB에게 요청하고 그 결과를 받아오는 역할을 해요.

# 커서 생성 및 SELECT 실행
cursor = conn.cursor()  # 기본은 튜플로 결과 반환
sql = "SELECT * FROM dept;"
cursor.execute(sql)

# 결과 가져오기
rows = cursor.fetchall()
for row in rows:
    print(row)  # 튜플 형태로 출력됨

📌 반환 메서드 비교

메서드 설명
fetchall() 결과 전체를 리스트로 가져옴
fetchone() 한 번에 하나의 행만 가져옴 (다음 호출 시 다음 행)
fetchmany(n) 지정한 n개의 행만 가져옴

딕셔너리 형태로 결과 받기 (DictCursor)

기본 cursor는 결과를 튜플(tuple)로 줘요. 그런데 키-값으로 다루고 싶을 땐 DictCursor를 사용하면 딕셔너리로 결과를 받을 수 있어요.

cursor = conn.cursor(pymysql.cursors.DictCursor)
sql = "SELECT * FROM dept;"
cursor.execute(sql)

rows = cursor.fetchall()
for row in rows:
    print(row['deptno'], row['dname'], row['loc'])  # 딕셔너리 접근 가능

💡 데이터 분석할 땐 DictCursor가 진리!

딕셔너리 형태로 받아두면 pandas와 같은 라이브러리로 전환할 때도 편하답니다.

SQL 쿼리 → 딕셔너리 → DataFrame 변환까지 수월하게 이어질 수 있어요.

 

다음 단계에서는 데이터를 단순히 조회만 하지 않고 INSERT, UPDATE, DELETE하는 방식도 배워볼게요.

DB를 직접 다룰 수 있게 되면, 정말 "파이썬으로 뭐든 다 된다"는 말이 실감날 거예요!

 

 

5. INSERT, UPDATE, DELETE 처리와 commit 필수 개념 📝

데이터베이스는 단순히 조회만 하는 도구가 아니죠.

실제 개발에서는 데이터를 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 기능이 훨씬 더 많이 쓰여요.

이런 명령은 execute()로 실행한 뒤 반드시 commit()까지 해야 DB에 반영된다는 점! 꼭 기억하세요.

(안 그러면 쿼리는 실행돼도 DB에는 아무 일도 안 생긴 것처럼 보여요 😅)

INSERT 예제

sql = "INSERT INTO dept VALUES (%s, %s, %s)"
data = (50, '데이터팀', '서울')
cursor = conn.cursor()
cursor.execute(sql, data)
conn.commit()

UPDATE 예제

sql = "UPDATE dept SET dname=%s, loc=%s WHERE deptno=%s"
data = ('AI연구소', '판교', 50)
cursor.execute(sql, data)
conn.commit()

DELETE 예제

sql = "DELETE FROM dept WHERE deptno=%s"
data = (50,)
cursor.execute(sql, data)
conn.commit()

🚨 commit() 안 하면 무효!

데이터를 조작한 후 commit()을 호출해야 실제로 DB에 저장됩니다.

안 하면 임시 저장 상태로 끝나버려요.

다행히도 PyMySQL에서는 autocommit=True 옵션을 설정하면 매번 commit하지 않아도 자동 저장되니, 편하긴 하죠.

# autocommit 옵션 사용 예시
conn = pymysql.connect(
    host='localhost',
    user='user',
    password='pass',
    db='project',
    charset='utf8',
    autocommit=True  # 자동 커밋
)

 

그럼 이제 마지막으로 클래스 기반의 구조화된 DB 처리 방식,

DAO (Data Access Object) 패턴을 활용한 예제로 실전 마무리를 지어볼게요!

이런 구조는 웹 개발에서도 널리 사용되고 있어요. 꼭 익혀두세요! 👨‍💻

 

 

6. 실전 예제: 클래스 기반 DB 접속과 DAO 패턴 🧩

이제는 한 단계 더 나아가 객체지향 방식으로 데이터베이스를 관리해볼 차례입니다.

우리가 자주 접하는 웹 애플리케이션이나 백엔드 시스템에서는 보통 DAO 패턴을 활용해 DB를 다루는데요,

이 구조는 DB 접속, 쿼리 실행, 결과 처리를 하나의 클래스로 깔끔하게 분리할 수 있어서 유지보수도 편하고, 확장성도 좋아요.

📁 db_connection.py

import pymysql

class DBConnection:
    @classmethod
    def get_db(cls):
        return pymysql.connect(
            host='localhost',
            user='bit',
            password='bit',
            db='project',
            charset='utf8',
            autocommit=True
        )

📁 dept_dao.py

from db_connection import DBConnection

class DeptDao:
    def get_depts(self):
        conn = DBConnection.get_db()
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM dept")
        rows = cursor.fetchall()
        conn.close()

        result = []
        for row in rows:
            result.append({'deptno': row[0], 'dname': row[1], 'loc': row[2]})
        return result

    def insert_dept(self, deptno, dname, loc):
        conn = DBConnection.get_db()
        cursor = conn.cursor()
        sql = "INSERT INTO dept VALUES (%s, %s, %s)"
        cursor.execute(sql, (deptno, dname, loc))
        conn.close()
        return f"INSERT 완료: {deptno}"

    def update_dept(self, deptno, dname, loc):
        conn = DBConnection.get_db()
        cursor = conn.cursor()
        sql = "UPDATE dept SET dname=%s, loc=%s WHERE deptno=%s"
        cursor.execute(sql, (dname, loc, deptno))
        conn.close()

    def delete_dept(self, deptno):
        conn = DBConnection.get_db()
        cursor = conn.cursor()
        sql = "DELETE FROM dept WHERE deptno=%s"
        cursor.execute(sql, (deptno,))
        conn.close()

📁 실행 파일 (main.py)

from dept_dao import DeptDao

def display_menu():
    print("1. 전체 조회\n2. 부서 등록\n3. 부서 수정\n4. 부서 삭제\n5. 종료")
    return input("메뉴 번호 선택 >>> ")

def main():
    dao = DeptDao()

    while True:
        choice = display_menu()
        if choice == '1':
            print(dao.get_depts())
        elif choice == '2':
            deptno = int(input("부서번호: "))
            dname = input("부서명: ")
            loc = input("지역: ")
            print(dao.insert_dept(deptno, dname, loc))
        elif choice == '3':
            deptno = int(input("수정할 부서번호: "))
            dname = input("새 부서명: ")
            loc = input("새 지역: ")
            dao.update_dept(deptno, dname, loc)
        elif choice == '4':
            deptno = int(input("삭제할 부서번호: "))
            dao.delete_dept(deptno)
        elif choice == '5':
            print("종료합니다.")
            break
        else:
            print("잘못된 선택입니다.")

if __name__ == "__main__":
    main()

✅ DAO 패턴을 사용하면 좋은 점

  • 코드 재사용성과 유지보수성이 뛰어남
  • DB 처리 로직이 메인 로직과 분리돼 구조가 깔끔함
  • 테스트 및 확장이 쉬움 (Mock 처리도 가능)

이제 여러분도 파이썬으로 MySQL을 자유롭게 다룰 수 있게 되셨을 거예요!

DB 입출력을 객체지향적으로 정리하는 것까지 익히면, 어떤 프로젝트에서도 뚝딱 구현 가능한 실력이 됩니다.

 

이제 마지막으로 간단한 마무리와 함께 태그를 정리해드릴게요.

 

 

마무리 🎯

여기까지 따라오신 분들, 정말 수고 많으셨어요! 👏

이번 글에서는 파이썬과 MySQL을 연결해서 데이터를 조회하고 수정하는 모든 기본 흐름을 실습 위주로 정리해봤습니다.

처음에는 용어도 많고 구조도 복잡해 보일 수 있지만, 직접 코드를 쳐보고 실행해보면 생각보다 간단하다는 걸 알 수 있어요.

특히 DAO 패턴은 단순한 연습용 코드보다 훨씬 실무에서 많이 쓰이는 방식이기 때문에 꼭 익혀두시길 추천드려요.

이 구조를 알고 있으면 Flask, Django, FastAPI 같은 웹 프레임워크에서도 자연스럽게 활용할 수 있거든요.

앞으로는 이 내용을 바탕으로 웹 애플리케이션과의 연동이나 API 서버 구축으로 나아갈 수도 있습니다.

그 여정의 첫걸음을 오늘 성공적으로 마무리하신 여러분께, 진심으로 박수 보내드립니다! 👏👏

이제 여러분도 자신 있게 말할 수 있어요. “파이썬으로 MySQL 다룰 수 있습니다!”

반응형

+ Recent posts