2. DB 연결

1. 목표
더보기
- MySQL Connector/Python 라이브러리 설치 방법을 이해하고 직접 설치해 본다.
- host, user, password, database로 구성되는 MySQL 연결 문자열 개념을 이해한다.
- PySide6로 간단한GUI 설정 창을 만들고 MySQL 접속 정보를 입력받는다.
- mysql.connector를 사용해 MySQL 서버 및 선택한 데이터베이스에 연결해 본다.
- try except 예외처리 사용해서 예외를 안전하게 처리하는 패턴을 익힌다.
- QLabel과 QMessageBox로 연결 성공, 실패, 오류를 한글로 안내하는 방법을 복습힌다.
2. 전체 로직
더보기
import sys
from PySide6.QtWidgets import (
QApplication,
QWidget,
QLabel,
QLineEdit,
QPushButton,
QVBoxLayout,
QFormLayout,
QMessageBox,
)
import mysql.connector as mc
class MySqlDemoWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("MySQL 연결 설정")
self.resize(420, 240)
self.host_edit = QLineEdit()
self.user_edit = QLineEdit()
self.password_edit = QLineEdit()
self.password_edit.setEchoMode(QLineEdit.Password)
self.db_edit = QLineEdit()
self.host_edit.setText("localhost")
self.user_edit.setText("root")
form_layout = QFormLayout()
form_layout.addRow("호스트", self.host_edit)
form_layout.addRow("사용자", self.user_edit)
form_layout.addRow("비밀번호", self.password_edit)
form_layout.addRow("데이터베이스 이름", self.db_edit)
self.btn_connect = QPushButton("연결 테스트")
self.result_label = QLabel("연결 결과가 여기에 표시됩니다.")
main_layout = QVBoxLayout(self)
main_layout.addLayout(form_layout)
main_layout.addWidget(self.btn_connect)
main_layout.addWidget(self.result_label)
self.btn_connect.clicked.connect(self.connect_to_database)
def connect_to_database(self):
host = self.host_edit.text().strip()
user = self.user_edit.text().strip()
password = self.password_edit.text()
db_name = self.db_edit.text().strip()
if not host or not user:
QMessageBox.warning(self, "입력 오류", "호스트와 사용자 이름은 반드시 입력해야 합니다.")
return
try:
if db_name:
conn = mc.connect(
host=host,
user=user,
password=password,
database=db_name,
)
else:
conn = mc.connect(
host=host,
user=user,
password=password,
)
if conn.is_connected():
if db_name:
msg = f"MySQL 서버에 연결되었습니다.\n사용 중인 데이터베이스: {db_name}"
else:
msg = "MySQL 서버에 연결되었습니다.\n데이터베이스 이름은 지정되지 않았습니다."
self.result_label.setText(msg)
QMessageBox.information(self, "연결 성공", msg)
else:
self.result_label.setText("MySQL 서버에 연결하지 못했습니다.")
QMessageBox.warning(self, "연결 실패", "MySQL 서버에 연결하지 못했습니다.")
except mc.Error as e:
self.result_label.setText("연결 중 오류가 발생했습니다.")
QMessageBox.critical(
self,
"연결 오류",
f"MySQL 연결에 실패했습니다.\n오류 내용: {e}",
)
finally:
try:
if conn.is_connected():
conn.close()
except Exception:
pass
# main.py
import sys
from PySide6.QtWidgets import QApplication
from mainwindow import MySqlDemoWindow
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MySqlDemoWindow()
w.show()
sys.exit(app.exec())
3. 필요한 import + 주석 설명
더보기
import sys # 파이썬 인터프리터 인자(sys.argv)와 프로그램 종료 코드(sys.exit)를 사용하기 위해 가져온다.
from PySide6.QtWidgets import (
QApplication, # Qt 애플리케이션 객체, 이벤트 루프와 전체 GUI 실행을 담당한다.
QWidget, # 기본 윈도우 역할을 하는 위젯이다.
QLabel, # 텍스트를 화면에 표시하는 위젯이다.
QLineEdit, # 한 줄 텍스트 입력을 위한 위젯이다.
QPushButton, # 버튼을 표시하고 클릭 이벤트를 받을 수 있는 위젯이다.
QVBoxLayout, # 위젯들을 세로 방향으로 배치하는 레이아웃 클래스이다.
QFormLayout, # 라벨과 입력 위젯을 한 줄에 쌍으로 배치하는 폼 레이아웃이다.
QMessageBox, # 정보, 경고, 오류 등의 메시지를 팝업 창으로 보여주는 대화상자이다.
)
# MySQL 서버에 접속하기 위한 MySQL Connector/Python 라이브러리
# pip install mysql-connector-python 으로 설치한 후 사용
import mysql.connector as mc
- PySide6.QtWidgets 모듈이 제공하는 클래스들을 조합해서 GUI를 구성한다.
- mysql.connector 라이브러리는 pip로 설치해야 사용 가능하다.
# 설치 명령 예시
pip install mysql-connector-python
4. GUI 구현부 소스코드와 주석
더보기
class DbConnectWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# 윈도우 제목과 크기를 설정한다.
self.setWindowTitle("MySQL 연결 및 데이터베이스 생성")
self.resize(420, 280)
# MySQL 접속 정보 입력 필드들을 만든다.
self.host_edit = QLineEdit() # 호스트 주소 입력, 예: localhost, 127.0.0.1
self.user_edit = QLineEdit() # 사용자 이름 입력, 예: root
self.password_edit = QLineEdit() # 비밀번호 입력
self.password_edit.setEchoMode(QLineEdit.Password) # 비밀번호를 화면에 숨김 모드로 표시한다.
self.db_edit = QLineEdit() # 데이터베이스 이름 입력
# 학습 편의를 위해 host와 user에 기본값을 넣는다.
self.host_edit.setText("localhost")
self.user_edit.setText("root")
# 라벨과 입력 칸을 한 줄씩 짝으로 배치하는 폼 레이아웃을 만든다.
form_layout = QFormLayout()
form_layout.addRow("호스트", self.host_edit)
form_layout.addRow("사용자", self.user_edit)
form_layout.addRow("비밀번호", self.password_edit)
form_layout.addRow("데이터베이스 이름", self.db_edit)
# 연결 테스트를 수행할 버튼을 만든다.
self.btn_connect = QPushButton("연결 테스트")
# 연결 또는 생성 결과를 간단히 출력할 라벨이다.
self.result_label = QLabel("결과 메시지가 여기에 표시됩니다.")
# 전체를 세로로 배치하는 메인 레이아웃을 만든다.
main_layout = QVBoxLayout(self)
main_layout.addLayout(form_layout) # 위쪽: 입력 폼
main_layout.addWidget(self.btn_connect) # 중간: 연결 테스트 버튼
main_layout.addWidget(self.btn_create_db) # 중간: 데이터베이스 생성 버튼
main_layout.addWidget(self.result_label) # 아래: 결과 표시 라벨
# 시그널과 슬롯 연결은 아래 5번에서 설명한다.
self.btn_connect.clicked.connect(self.connect_to_database)
self.btn_create_db.clicked.connect(self.create_database)
5. 시그널과 슬롯 연결 부분
더보기
# 생성한 버튼과 동작 함수를 시그널과 슬롯으로 연결한다.
self.btn_connect.clicked.connect(self.connect_to_database)
self.btn_connect.clicked
- 버튼이 클릭되었을 때 발생하는 시그널
connect(self.connect_to_database)
- clicked 시그널이 발생하면 connect_to_database 메서드를 호출
- connect_to_database 메서드가 슬롯 역할을 수행
구현 의도
- 사용자 클릭 → MySQL 연결 시도 → 결과 표시
- 버튼을 누를 때 MySQL 연결 시도.
6. <DB 연결> 주요 구조
더보기
6.1 <DB 연결> 핵심 요약
# 1. 연결
conn = mc.connect(설정값...)
# 2. 확인
if conn.is_connected():
성공_처리()
# 3. 종료
conn.close()
6.2 DB 연결 흐름
import mysql.connector as mc
def database_connection_flow():
# 1. DB 서버 접속에 필요한 정보 준비, GUI 에서 가져올 예정
host = "localhost"
user = "root"
password = "password"
database = "test_db"
# 2. MySQL 서버에 연결 시도 (네트워크 연결 + 사용자 인증 + DB 선택)
conn = mc.connect(
host=host,
user=user,
password=password,
database=database
)
# 3. 서버와의 연결이 정상적으로 유지되는지 확인
if conn.is_connected():
print("DB 연결 성공")
# 4. 이 지점 이후부터 SQL 실행 가능
pass
# 5. 모든 DB 작업이 끝난 후 연결 종료
conn.close()
# DB 연결 흐름 실행
database_connection_flow()
6.3 예외 처리
try:
conn = mc.connect(...)
except mc.Error as e:
print(e)
finally:
if conn.is_connected():
conn.close()
- DB 연결은 실패 가능성이 매우 높은 작업이다.
네트워크, 인증, 권한, 서버 상태 등 외부 요인에 의존한다.
따라서 반드시 예외 처리를 통해 프로그램이 강제 종료되지 않도록 한다. - try
- 오류가 발생할 가능성이 있는 코드를 작성하는 영역
- 정상 흐름의 "본 작업"이 위치함
- except
- try 블록에서 오류(Exception)가 발생했을 때만 실행되는 영역
- 프로그램이 강제 종료되지 않도록 보호함
- finally
- 오류 발생 여부와 관계없이 항상 실행되는 영역
- 자원 해제(close) 같은 정리 작업을 담당함
7. DB 연결 기능 구현 상세 소스코드
더보기
def connect_to_database(self):
# 1단계: 사용자가 입력한 텍스트를 읽어 온다.
host = self.host_edit.text().strip() # 호스트 주소에서 앞뒤 공백을 제거하고 가져온다.
user = self.user_edit.text().strip() # 사용자 이름
password = self.password_edit.text() # 비밀번호는 공백도 의미가 있을 수 있어 strip을 하지 않는다.
db_name = self.db_edit.text().strip() # 데이터베이스 이름
# 2단계: 최소한의 입력 검증을 수행한다.
# 호스트와 사용자 이름은 MySQL 연결에 필수이므로 비어 있으면 경고를 띄우고 함수 실행을 중단한다.
if not host or not user:
QMessageBox.warning(self, "입력 오류", "호스트와 사용자 이름은 반드시 입력해야 합니다.")
return
try:
# 3단계: 연결 문자열 구성 및 MySQL 서버에 연결 시도
# 연결 문자열은 host, user, password, database 정보를 조합해서 만든다.
if db_name:
# 데이터베이스 이름이 입력된 경우, 해당 데이터베이스까지 포함해서 연결한다.
conn = mc.connect(
host=host,
user=user,
password=password,
database=db_name,
)
else:
# 데이터베이스 이름이 비어 있으면, 서버까지만 연결을 시도한다.
conn = mc.connect(
host=host,
user=user,
password=password,
)
# 4단계: 연결 성공 여부 확인
if conn.is_connected():
# 연결이 성공한 경우, 데이터베이스 이름이 있는지에 따라 메시지를 다르게 구성한다.
if db_name:
msg = f"MySQL 서버에 연결되었습니다.\n사용 중인 데이터베이스: {db_name}"
else:
msg = "MySQL 서버에 연결되었습니다.\n데이터베이스 이름은 지정되지 않았습니다."
# 결과를 라벨에 표시하고 정보 메시지 박스로도 알려 준다.
self.result_label.setText(msg)
QMessageBox.information(self, "연결 성공", msg)
else:
# is_connected가 거짓이면 연결에 실패한 것으로 보고 경고 메시지를 보여 준다.
self.result_label.setText("MySQL 서버에 연결하지 못했습니다.")
QMessageBox.warning(self, "연결 실패", "MySQL 서버에 연결하지 못했습니다.")
except mc.Error as e:
# 5단계: 예외 처리
# MySQL 서버가 꺼져 있거나, 비밀번호가 틀렸거나, 권한이 없을 때 mc.Error 예외가 발생할 수 있다.
self.result_label.setText("연결 중 오류가 발생했습니다.")
QMessageBox.critical(
self,
"연결 오류",
f"MySQL 연결에 실패했습니다.\n오류 내용: {e}",
)
finally:
# 6단계: 자원 정리
# conn 변수가 정의되어 있고 실제로 연결이 살아 있다면 안전하게 닫아 준다.
try:
if conn.is_connected():
conn.close()
except Exception:
# conn이 정의되지 않았거나 이미 닫혀있는 경우 예외가 발생할 수 있어 한 번 더 예외를 무시한다.
pass
연결 문자열 개념
- host, user, password, database 네 가지를 조합해서 MySQL 서버와 대화할 수 있는 연결 정보를 만든다.
try except finally 구조
- try: 실제 연결 시도
- except: 연결 실패 또는 오류 처리
- finally: 연결 객체가 있다면 닫아서 자원을 정리
8. 실행 테스트
더보기
화면에서 값 입력 후
- 호스트: localhost
- 사용자: root
- 비밀번호: 실제 MySQL root 비밀번호
- 데이터베이스 이름: 테스트용으로 이미 만들어 둔 DB 이름 또는 비워 두고 서버 연결만 테스트
연결 테스트 버튼을 클릭하면
- 입력값을 기준으로 MySQL 연결을 시도한다.
- 성공 시
- 라벨에는 연결 성공 메시지가,
- 팝업에는 정보 메시지가 한글로 표시된다.
- 비밀번호 오류, 존재하지 않는 데이터베이스, 서버 종료 등의 상황에서는
- 예외가 발생하고, 한글 오류 메시지가 팝업과 라벨에 표시된다.
9.학습 주요 포인트
더보기
- MySQL Connector/Python은 MySQL 데이터베이스를 파이썬 코드에서 제어하기 위한 필수 도구이다.
- MySQL 연결 문자열은 host, user, password, database 네 개의 정보를 조합해서 만든다.
- QLineEdit, QPushButton, QLabel, QFormLayout, QVBoxLayout만으로도
실습용 데이터베이스 설정 화면을 간단하게 만들고, - 버튼의 clicked 시그널을 메서드에 connect하여
UI 이벤트와 데이터베이스 연결 로직을 자연스럽게 연결할 수 있다. - try ~ except ~ finally 패턴을 활용하면
예외 상황에서도 프로그램이 갑자기 종료되지 않고
사용자에게 이해하기 쉬운 메시지를 제공하면서 안정적으로 동작할 수 있다. - 이 단계에서 만든 연결 테스트 코드는 이후 단계인
데이터베이스 생성, 테이블 생성, 데이터 입력, 조회, 검색, 로그인 기능의 기반이 된다.
단계별 완성 파일