1. MySQL Connector/Python 소개
MySQL Connector/Python은 Python 프로그램을 MySQL 데이터베이스에 연결하고 데이터베이스 작업을 수행하기 위한 공식 라이브러리입니다. 데이터베이스 연결, 쿼리 실행, 데이터 조회, 레코드 업데이트와 같은 핵심 작업을 쉽고 효율적으로 처리할 수 있게 해줍니다. MySQL Connector/Python의 주요 장점 중 하나는 MySQL과 직접 통합되고 Python Database API 사양인 DB‑API 2.0을 준수한다는 점입니다. 이를 통해 데이터베이스 작업에 일관된 인터페이스를 제공하여 Python 개발자가 다른 데이터베이스 시스템과 마찬가지로 MySQL을 사용할 수 있습니다.
MySQL Connector/Python을 사용해야 하는 이유
MySQL Connector/Python을 사용하면 SQL 인젝션을 방지하는 보안 데이터베이스 작업을 수행할 수 있습니다. 또한 Python의 객체 지향 프로그래밍 기능을 활용하여 데이터베이스 작업을 보다 효율적이고 유연하게 만들 수 있습니다. 게다가 준비된 문(prepared statements)과 이스케이프 처리와 같은 고급 기능을 지원하여 성능과 보안의 뛰어난 균형을 제공합니다.
2. MySQL Connector/Python 설정
MySQL Connector/Python을 사용하기 전에 환경을 설정해야 합니다. 아래에 설치 단계와 환경 구성 세부 사항을 안내합니다.
설치 방법
pip(Python 패키지 관리자)를 사용하여 MySQL Connector/Python을 쉽게 설치할 수 있습니다. 다음 명령을 실행하여 설치하세요:
pip install mysql-connector-python
이 명령은 MySQL Connector/Python의 최신 버전을 설치합니다.
개발 환경 설정
MySQL Connector/Python으로 효율적인 개발을 위해서는 통합 개발 환경(IDE) 사용을 권장합니다. PyCharm이나 VS Code와 같은 도구는 코드 자동 완성 및 디버깅과 같은 기능을 제공하여 작업 흐름을 간소화합니다. IDE에서 Python 인터프리터를 설치된 MySQL Connector/Python 라이브러리를 사용하도록 설정하세요.
3. MySQL에 연결하기
MySQL Connector/Python을 사용하여 MySQL 데이터베이스에 연결하는 단계에 대해 살펴보겠습니다. 먼저 연결의 기본 개념과 필요한 매개변수를 설정하는 방법을 이해해야 합니다.
연결 매개변수
MySQL 데이터베이스에 연결하려면 다음 정보가 필요합니다:
host: 데이터베이스 서버의 호스트명 또는 IP 주소user: 데이터베이스 사용자 이름password: 사용자 비밀번호database: 대상 데이터베이스 이름
이 정보를 사용하여 MySQL Connector/Python의 connect 함수를 호출하면 연결을 설정할 수 있습니다.
샘플 코드
MySQL 데이터베이스에 연결하는 기본 코드 예시입니다:
import mysql.connector
# Connect to the database
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
# Check if the connection was successful
if conn.is_connected():
print('Connected to the MySQL database.')
# Close the connection
conn.close()
이 코드는 지정된 호스트, 사용자 이름, 비밀번호 및 데이터베이스 이름을 사용하여 MySQL에 연결합니다. is_connected() 메서드로 연결을 확인할 수 있습니다. 사용이 끝난 경우 close() 로 연결을 반드시 닫아야 합니다.

4. 기본 데이터베이스 작업
MySQL Connector/Python으로 데이터베이스에 연결한 후에는 기본 데이터베이스 작업을 수행해야 합니다. 여기에서는 테이블 생성, 데이터 삽입, 데이터 조회, 레코드 업데이트 및 데이터 삭제에 대해 다룹니다.
4.1 테이블 생성
먼저 데이터베이스에 새 테이블을 생성하는 방법을 살펴보겠습니다. 다음 예시는 users 테이블을 생성하는 방법을 보여줍니다:
# Get a cursor
cursor = conn.cursor()
# SQL query to create a table
create_table_query = '''
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
)
'''
# Execute the query to create the table
cursor.execute(create_table_query)
이 코드는 users 테이블이 아직 존재하지 않을 경우 생성합니다. id 필드는 자동 증가(primary key)로 설정됩니다.
4.2 데이터 삽입
다음으로, 테이블에 데이터를 삽입해 보겠습니다:
# SQL query to insert data
insert_data_query = '''
INSERT INTO users (username, email) VALUES (%s, %s)
'''
# Data to insert
user_data = ("Tanaka", "tanaka@example.com")
# Execute the query
cursor.execute(insert_data_query, user_data)
# Commit changes
conn.commit()
이 코드는 users 테이블에 새 사용자를 삽입합니다. %s 자리표시는 지정된 데이터로 교체됩니다.
4.3 데이터 조회
테이블에서 데이터를 가져오는 방법은 다음과 같습니다:
# SQL query to select data
select_query = "SELECT * FROM users WHERE username = %s"
# Execute the query
cursor.execute(select_query, ("Tanaka",))
# Fetch result
result = cursor.fetchone()
print(result)
이 코드는 users 테이블에서 사용자 이름이 Tanaka인 사용자의 데이터를 조회합니다.
4.4 데이터 업데이트
기존 레코드를 업데이트하는 방법은 다음과 같습니다:
# SQL query to update data
update_query = "UPDATE users SET email = %s WHERE username = %s"
# Execute the update
cursor.execute(update_query, ("tanaka.new@example.com", "Tanaka"))
# Commit changes
conn.commit()
이 코드는 Tanaka의 이메일 주소를 업데이트합니다.
4.5 데이터 삭제
마지막으로, 레코드를 삭제하는 방법은 다음과 같습니다:
# SQL query to delete data
delete_query = "DELETE FROM users WHERE username = %s"
# Execute the delete
cursor.execute(delete_query, ("Tanaka",))
# Commit changes
conn.commit()
이 코드는 users 테이블에서 사용자 이름이 Tanaka인 레코드를 삭제합니다.
5. 자리표시자와 준비된 문(statement) 사용
MySQL Connector/Python은 SQL 쿼리를 실행할 때 자리표시자와 준비된 문을 사용하여 보안과 성능을 모두 향상시킬 수 있습니다. 이러한 기술은 SQL 인젝션을 방지하고 쿼리 실행을 최적화하는 데 도움이 됩니다.
5.1 자리표시자 사용
자리표시자를 사용하면 SQL 쿼리에서 값을 동적으로 지정할 수 있습니다. 이는 SQL 인젝션을 방지하는 효과적인 방법이기도 합니다. 예시:
# SQL query with a placeholder
select_query = "SELECT * FROM users WHERE username = %s"
# Execute the query with a placeholder
cursor.execute(select_query, ("Tanaka",))
# Fetch result
result = cursor.fetchone()
print(result)
여기서 %s는 자리표시자로, execute 메서드의 두 번째 인수로 전달된 값으로 안전하게 교체됩니다. 이는 자동 이스케이프를 수행하고 SQL 인젝션을 방지합니다.
5.2 준비된 문 사용
준비된 문은 동일한 쿼리를 여러 번 실행할 때 성능을 향상시킵니다. 쿼리는 한 번만 파싱되고, 이후 실행에서는 파싱 단계가 생략됩니다. 예시:
# Create a cursor with prepared statement support
cursor = conn.cursor(prepared=True)
# Prepared statement query
stmt = "SELECT * FROM users WHERE username = ?"
# Execute the query
cursor.execute(stmt, ("Tanaka",))
# Fetch result
result = cursor.fetchone()
print(result)
커서를 생성할 때 prepared=True를 지정하면 준비된 문을 사용할 수 있습니다. 이 경우 자리표시자는 %s 대신 ?를 사용합니다.
준비된 문의 장점
- 보안 : 자리표시자와 마찬가지로 SQL 인젝션을 방지합니다.
- 성능 : 쿼리 파싱이 한 번만 수행되어 반복 실행 시 효율성이 향상됩니다.

6. 연결을 통한 SQL 이스케이프 및 실행
동적으로 SQL 쿼리를 생성하거나 특수 문자를 포함한 데이터를 처리할 때는 이스케이프가 필요합니다. MySQL Connector/Python은 안전하게 이스케이프를 처리할 수 있는 내장 함수를 제공합니다.
6.1 문자열 이스케이프
연결 객체의 converter.escape 함수를 사용하여 문자열을 이스케이프할 수 있습니다. 예시:
# Example of escaping
escaped_string = conn.converter.escape("O'Reilly")
print(escaped_string) # Output: O'Reilly
이를 통해 특수 문자를 포함한 문자열도 안전하게 SQL 쿼리에 포함될 수 있습니다.
6.2 연결에서 SQL 직접 실행하기
SQL 쿼리는 일반적으로 커서를 통해 실행되지만, 연결 객체의 cmd_query 메서드를 사용해 직접 실행할 수도 있습니다. 다만 이 메서드는 플레이스홀더를 지원하지 않으므로 수동으로 이스케이프 처리를 해야 합니다.
# Direct SQL execution
stmt = "SELECT * FROM users WHERE username = '%s'"
conn.cmd_query(stmt % conn.converter.escape("Tanaka"))
플레이스홀더가 지원되지 않기 때문에 적절한 이스케이프와 인용이 필수입니다. 대부분의 경우 플레이스홀더를 사용하는 커서를 이용하는 것이 더 안전한 옵션입니다.
7. 오류 처리 및 모범 사례
데이터베이스 작업 중 오류가 발생할 수 있으므로 적절한 오류 처리가 중요합니다. 또한 안전하고 효율적인 데이터베이스 상호작용을 위해 모범 사례를 따르는 것이 필요합니다.
7.1 오류 처리 구현
try-except 블록을 사용해 오류를 포착하고 처리합니다. 예시:
import mysql.connector
from mysql.connector import Error
try:
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
for row in results:
print(row)
except Error as e:
print(f"An error occurred: {e}")
finally:
if conn.is_connected():
cursor.close()
conn.close()
print("MySQL connection closed.")
이 예시에서는 데이터베이스 작업을 try 블록으로 감싸고, 오류는 except 블록에서 처리하며, 자원은 finally 블록에서 안전하게 해제합니다.
7.2 데이터베이스 작업 모범 사례
- 연결 관리 : 더 이상 필요하지 않을 때는 항상 연결을 닫아 자원을 해제합니다.
- 플레이스홀더 사용 : 쿼리 값에 플레이스홀더를 사용해 SQL 인젝션을 방지합니다.
- 예외 처리 :
try-except블록을 사용해 잠재적인 오류를 우아하게 처리합니다. - 트랜잭션 : 트랜잭션을 활용해 데이터 무결성을 유지하고, 여러 작업을 한 번에 커밋하거나 롤백할 수 있도록 합니다.
8. 결론
MySQL Connector/Python은 Python에서 MySQL 데이터베이스에 연결하고 작업할 수 있게 해 주는 강력한 도구입니다. 이 글에서는 설정, 기본 데이터베이스 작업, 보안을 강화하기 위한 플레이스홀더와 프리페어드 스테이트먼트 사용, 이스케이프 처리, 오류 처리 등을 다루었습니다. 이러한 기술을 마스터하면 보다 효율적이고 안전한 데이터베이스 애플리케이션을 구축할 수 있습니다.
앞으로 MySQL Connector/Python을 활용한 보다 고급 사용 사례와 실용적인 예제를 탐색해 보세요. 공식 문서와 관련 자료를 참고하여 이해를 깊이 있게 확장하고, 기능을 최대한 활용하시기 바랍니다.

