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
  1. PySide6.QtWidgets 모듈이 제공하는 클래스들을 조합해서 GUI를 구성한다.
  2. 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 패턴을 활용하면
    예외 상황에서도 프로그램이 갑자기 종료되지 않고
    사용자에게 이해하기 쉬운 메시지를 제공하면서 안정적으로 동작할 수 있다.

  • 이 단계에서 만든 연결 테스트 코드는 이후 단계인
    데이터베이스 생성, 테이블 생성, 데이터 입력, 조회, 검색, 로그인 기능의 기반이 된다.

 

단계별 완성 파일