반응형

파이썬 데이터베이스 프로그래밍 완전 입문
: SQLite로 배우는 DB 연동 기초

📦 설치도 필요 없는 초간단 DB!
파이썬 초보자도 쉽게 시작할 수 있는
SQLite 데이터베이스 프로그래밍을 지금 배워보세요.

 

 

안녕하세요, 개발자 여러분!

혹시 "파이썬으로 데이터 저장하고 불러오는 거 어렵지 않나요?"라고 고민하셨던 적 있나요?

그런 분들에게 딱 맞는 주제를 준비했어요.

이번 글에서는 SQLite라는 가볍고 강력한 데이터베이스를 파이썬에서 쉽게 다루는 방법을 알려드릴게요.

별도 설치도 필요 없고, 복잡한 설정도 없이 바로 실습이 가능한 SQLite는 초보자에게 정말 딱이에요.

이 글에서는 단순한 문법 나열이 아니라, 실제 예제를 중심으로 데이터를 삽입하고 조회하고 수정하고 삭제하는 CRUD의 전 과정을 SQLite로 따라가면서 익힐 수 있도록 구성했어요.

마지막엔 여러분이 직접 간단한 프로젝트도 구성할 수 있도록 실습 예제까지 제공합니다.

그럼 바로 시작해볼까요? 🚀

 

1. SQLite란 무엇인가요? 특징과 장점

💡 SQLite는 가장 널리 사용되는 내장형 관계형 데이터베이스 시스템(RDBMS) 중 하나예요.

이름에서 알 수 있듯이 ‘가볍고(Small, Lite)’ 빠른 처리 속도와 간편한 사용성을 자랑합니다.

🧠 SQLite의 핵심 개념은?

  • 파일 기반으로 작동하는 DBMS로, 별도의 서버 설치가 필요 없습니다.
  • sqlite3 모듈만으로 파이썬에서 바로 사용 가능합니다.
  • 안드로이드, 크롬 브라우저, iOS 앱 등 다양한 플랫폼에서 널리 사용됩니다.

✨ SQLite의 장점은 무엇일까요?

특징 설명
설치 필요 없음 파이썬 표준 라이브러리에 포함된 sqlite3 모듈로 바로 사용 가능
경량 & 고속 수 MB의 크기만으로도 빠른 성능 제공
파일 기반 저장 하나의 .db 파일만으로 데이터베이스 전체를 구성
트랜잭션 지원 BEGIN, COMMIT, ROLLBACK 등의 SQL 지원
유지보수 용이 파일 하나만 백업해도 모든 데이터 이관 가능

즉, SQLite는 설치 걱정 없이 파일 하나로 모든 기능을 사용할 수 있고, 초보자도 금방 배워서 적용할 수 있는 가장 이상적인 학습용 데이터베이스라고 할 수 있습니다.

 

📌 이런 SQLite의 특성 덕분에, 우리는 서버 설정이나 복잡한 환경 구성 없이 오직 파이썬 코드만으로 데이터베이스 프로그래밍을 시작할 수 있어요.

 

 

2. 파이썬에서 SQLite 사용 준비하기

자, 이제 본격적으로 SQLite를 파이썬에서 사용하는 방법을 알아볼 차례예요.

설치 없이 바로 사용할 수 있는 sqlite3 모듈 덕분에 정말 간단합니다.

우선 우리가 어떤 흐름으로 사용할지부터 짚고 갈게요.

🧭 SQLite 기본 사용 흐름

  1. 1. sqlite3 모듈 임포트
  2. 2. 데이터베이스 연결 (파일 또는 메모리)
  3. 3. 커서(Cursor) 객체 생성
  4. 4. SQL 명령 실행 (테이블 생성, 데이터 삽입 등)
  5. 5. commit() 또는 fetch() 처리
  6. 6. 연결 종료 conn.close()

💻 예제로 보는 SQLite 기본 연결

import sqlite3

# 1. 데이터베이스 연결 (없으면 새로 생성됨)
conn = sqlite3.connect("example.db")

# 2. 커서 생성
cur = conn.cursor()

# 3. SQL 실행 예시: 테이블 생성
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER
)
""")

# 4. 연결 종료
conn.close()

 

위 코드를 보면 알겠지만, 정말 간단하죠? 😎

특히 테이블 생성 시에는 IF NOT EXISTS 옵션을 주면 이미 존재하는 테이블을 중복 생성하지 않도록 방지할 수 있어요.

💡 메모리 DB도 가능하다?

잠깐 테스트하거나 임시 저장용으로 사용할 때는, 파일이 아닌 메모리 DB를 사용할 수도 있어요. sqlite3.connect(":memory:")처럼 연결하면 디스크에 저장하지 않고 RAM에서만 작동해요.

다만, 프로그램이 종료되면 데이터도 함께 사라지니 주의하세요!

여기까지 오셨다면, SQLite를 사용할 준비는 모두 끝났어요.

 

이제 다음 섹션부터는 본격적으로 데이터를 넣고, 조회하고, 수정하고, 삭제하는 CRUD를 다뤄보겠습니다! 🚀

 

 

3. 테이블 생성과 데이터 삽입 실습

이제 본격적으로 실습을 통해 SQLite의 사용법을 배워볼게요.

먼저, 우리가 사용할 테이블을 만들고 여기에 데이터를 삽입해보겠습니다.

테스트용으로 아주 간단한 회원(users) 테이블을 만들어볼게요.

🛠️ users 테이블 만들기

import sqlite3

# 데이터베이스 연결
conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 테이블 생성
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL,
    age INTEGER
)
""")

conn.commit()
conn.close()

이 테이블은 총 4개의 필드를 갖습니다:

  • id: 자동 증가하는 고유 번호 (PRIMARY KEY)
  • name: 사용자 이름 (필수)
  • email: 중복을 허용하지 않는 이메일
  • age: 나이 (정수)

✍️ 데이터 삽입하기

import sqlite3

conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 데이터 삽입
cur.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
            ("홍길동", "hong@example.com", 30))

# 여러 개 삽입
users = [
    ("김철수", "kim@example.com", 25),
    ("이영희", "lee@example.com", 28)
]
cur.executemany("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", users)

conn.commit()
conn.close()

 

🚨 여기서 중요한 점은 VALUES (?, ?, ?) 부분이에요.

      이 방식은 SQL Injection 같은 보안 문제를 방지할 수 있어요.

     항상 사용자 입력에는 파라미터 바인딩을 사용하는 습관을 들이세요!

 

👀 확인해보기 Tip!

DB 파일이 실제로 생겼는지 확인하고 싶다면, 프로젝트 폴더에 example.db 파일이 생성되어 있는지 살펴보세요.

SQLite를 지원하는 DB 브라우저(DB Browser for SQLite)로 열어보면 테이블과 데이터도 바로 확인할 수 있어요!

 

 

4. 데이터 조회, 수정, 삭제 (CRUD)

테이블에 데이터를 넣었으니, 이제 조회하고 수정하고 삭제하는 과정도 해봐야겠죠?

이걸 통틀어 CRUD (Create, Read, Update, Delete)라고 부릅니다.

실무에서도 가장 자주 쓰이는 데이터 처리 방식이에요.

자, 하나씩 직접 실습해볼게요! 🧪

🔍 1) 데이터 조회 (Read)

import sqlite3

conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 전체 데이터 조회
cur.execute("SELECT * FROM users")
rows = cur.fetchall()

for row in rows:
    print(row)

conn.close()

 

fetchall()을 쓰면 모든 데이터를 한 번에 가져올 수 있어요.

fetchone()은 한 줄만, fetchmany(n)은 n개만 가져올 때 사용해요.

✏️ 2) 데이터 수정 (Update)

conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 특정 사용자 나이 변경
cur.execute("UPDATE users SET age = ? WHERE name = ?", (35, "홍길동"))

conn.commit()
conn.close()

 

업데이트할 땐 조건절(WHERE)을 꼭 넣어주세요!

안 그러면 모든 행이 다 수정될 수도 있어요 😱

🗑️ 3) 데이터 삭제 (Delete)

conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 이메일 기준 삭제
cur.execute("DELETE FROM users WHERE email = ?", ("hong@example.com",))

conn.commit()
conn.close()

 

데이터 삭제도 꼭 조건을 명확히 걸어야 해요.

잘못하면 전체 테이블이 삭제될 수 있으니 항상 WHERE 절은 신중하게!

📌 실습 팁!

  • 실수 방지를 위해 SELECT로 먼저 확인하고, 그다음 UPDATEDELETE를 실행하세요.
  • 삽입, 수정, 삭제 후에는 반드시 conn.commit()을 호출해야 반영됩니다!

이제 여러분은 SQLite로 기본적인 CRUD 작업을 모두 해보셨습니다.

다음은 우리가 배운 내용들을 활용해서 작은 실전 예제를 만들어보는 시간이에요! 💡

 

 

5. SQLite 활용 예제: 간단한 회원 관리 프로그램

이제는 단순히 CRUD만 따로따로 실행하는 게 아니라, 하나의 흐름으로 통합된 프로그램을 만들어볼 시간이에요.

아주 간단하지만 SQLite의 전체 사용 흐름을 한눈에 익힐 수 있는 회원 관리 프로그램 예제를 만들어 보겠습니다.

🧩 프로그램 구성

기능 설명
회원 등록 이름, 이메일, 나이를 입력받아 저장
회원 목록 조회 저장된 전체 회원 정보를 출력
회원 정보 수정 이메일 기준으로 나이 정보 수정
회원 삭제 이메일 기준으로 회원 삭제

💻 전체 코드 예제

import sqlite3

def create_table():
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT UNIQUE NOT NULL,
        age INTEGER
    )
    """)
    conn.commit()
    conn.close()

def insert_user(name, email, age):
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", (name, email, age))
    conn.commit()
    conn.close()

def update_age(email, new_age):
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("UPDATE users SET age = ? WHERE email = ?", (new_age, email))
    conn.commit()
    conn.close()

def delete_user(email):
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("DELETE FROM users WHERE email = ?", (email,))
    conn.commit()
    conn.close()

def list_users():
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("SELECT id, name, email, age FROM users")
    for row in cur.fetchall():
        print(row)
    conn.close()

# 실행 흐름
create_table()
insert_user("홍길동", "hong@example.com", 30)
insert_user("이영희", "lee@example.com", 24)
update_age("hong@example.com", 33)
list_users()
delete_user("lee@example.com")
list_users()

✨ 실습 포인트 정리

  • 코드를 기능별 함수로 나누면 관리가 훨씬 쉬워집니다!
  • conn.commit()을 잊지 않도록 항상 삽입/수정/삭제 후엔 실행하세요.

 

이처럼 여러분이 실제 필요한 기능을 기준으로 코드 구조를 나누면 유지보수도 훨씬 편하고,

나중에 GUI 또는 웹 인터페이스와 연동하기도 쉬워져요!

 

 

6. SQLite를 사용할 때 자주 발생하는 오류와 해결법

SQLite는 사용이 간편한 만큼, 초보자들이 자주 마주치는 실수나 오류들도 있어요.

하지만 대부분은 패턴이 있고, 몇 가지 기본만 잘 기억하면 금방 해결할 수 있답니다.

여기 대표적인 오류 사례와 해결 팁을 정리해드릴게요.

🐛 대표적인 오류와 해결 팁

오류 메시지 원인 해결 방법
sqlite3.OperationalError: no such table 테이블이 생성되지 않았거나 이름이 잘못됨 CREATE TABLE 문 실행 확인, 철자 오타 점검
sqlite3.IntegrityError: UNIQUE constraint failed UNIQUE 제약 조건에 위배되는 중복 데이터 입력 중복 여부 확인 후 입력하거나 try-except로 예외 처리
sqlite3.ProgrammingError: Incorrect number of bindings SQL 문장의 ? 개수와 전달값 수 불일치 바인딩 값 튜플 개수 점검 ((?, ?, ?)에 맞게 전달)
sqlite3.ProgrammingError: Cannot operate on a closed database 닫힌 연결(conn.close 이후)에 작업 시도 conn 객체가 살아 있는지 확인하고 다시 연결

🧯 예외 처리는 필수입니다!

현업에서도 오류는 늘 발생하곤 해요.

그래서 try-except 구문으로 예외를 미리 처리해주는 습관이 정말 중요합니다.

try:
    cur.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
                ("김민수", "min@example.com", 29))
    conn.commit()
except sqlite3.IntegrityError:
    print("이미 존재하는 이메일입니다.")

 

그니까요, 막연하게 오류 나면 당황하지 말고,

차근차근 메시지를 읽고 해결책을 찾아보는 습관이 필요합니다.

그게 진짜 실력으로 이어지거든요!

 

 

🔚 마무리

이번 글에서는 SQLite의 기초부터 실습 예제까지 아주 친절하고 자세히 살펴봤어요.

설치가 필요 없는 가벼운 DB임에도 불구하고, SQLite는 실제 프로젝트에서도 널리 활용되고 있어요.

파이썬 초보자도 어렵지 않게 다룰 수 있고, 데이터 저장이 필요한 다양한 상황에 바로 적용해볼 수 있다는 게 큰 장점이죠.

 

다음 단계로는 이 데이터베이스를 Flask나 Streamlit 같은 웹 프레임워크와 연결해보는 것도 추천드려요.

그러면 나만의 웹 애플리케이션도 금방 만들 수 있어요! 😉

그럼 다음 시간엔 더 유익한 실습으로 다시 만나요!

반응형
반응형

파이썬 데이터베이스 프로그래밍 완전 정복
: 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 다룰 수 있습니다!”

반응형
반응형

파이썬 가상환경(venv, virtualenv)으로 프로젝트 환경을 깔끔하게 관리하는 법

프로젝트마다 패키지 버전이 달라서 자꾸 충돌난다면?
파이썬 가상환경으로 환경관리를 시작해보세요! 🧪

 

 

안녕하세요, 파이썬 개발자 여러분 😊

혹시 이런 경험 있으신가요?

프로젝트 하나에서는 numpy 1.18 버전을 쓰는데,

다른 프로젝트에선 1.24 버전이 필요해서 패키지를 지우고 다시 설치하고…

결국 프로젝트 둘 다 깨져버리는 악몽 같은 상황 말이죠.

 

그럴 땐 파이썬 가상환경을 활용하면 문제 해결 끝입니다!

오늘은 파이썬의 대표적인 가상환경 도구인 venvvirtualenv의 차이부터 설치, 사용 방법, 그리고 프로젝트별 환경 설정 팁까지 초보자도 따라 할 수 있도록 아주 친절하게 알려드릴게요.

이번 글 하나만 읽으면, 앞으로 프로젝트 환경 걱정은 끝! 🎉

 

1. 왜 가상환경이 필요한가요? 🤔

처음 파이썬을 배울 때는 pip install 패키지명으로 필요한 라이브러리만 설치해서 쓰면 끝이라 생각했어요.

그런데 프로젝트가 많아지고,

시간이 지나면서 이 패키지는 왜 오류가 나는 거지? 싶은 상황이 점점 많아지더라고요.

알고 보니 다른 프로젝트에서 같은 패키지를 다른 버전으로 쓰고 있었던 거죠. 😱

💥 실수하기 쉬운 대표 사례

  • Flask로 만든 프로젝트와 Django 프로젝트가 서로 다른 버전의 Jinja2를 요구할 때
  • pandas 최신 버전으로 설치했는데, 다른 프로젝트에선 오래된 버전이라 오류 발생
  • pip uninstall 하다가 다른 프로젝트까지 깨져버린 경험

🔒 그래서 가상환경이 필요합니다

가상환경(Virtual Environment)이란 말 그대로 프로젝트마다 독립적인 파이썬 환경을 만들어주는 기능이에요.

즉, 하나의 컴퓨터 안에서 여러 개의 파이썬 세계를 만들 수 있다는 거죠.

구분 글로벌 환경 가상환경
패키지 공유 모든 프로젝트가 동일한 패키지 사용 프로젝트별로 독립적인 패키지 관리
버전 충돌 충돌 발생 가능성 높음 충돌 거의 없음
배포 시 재현 환경 일치 어려움 requirements.txt로 완벽한 재현 가능

결국 가상환경은 안정성, 확장성, 협업의 기반이 되는 도구예요.

특히 여러 프로젝트를 동시에 진행하거나, 팀원과 환경을 공유해야 할 때는 필수입니다.

이제 왜 가상환경이 중요한지 알겠죠?

 

그럼 다음으로 넘어가서, venv와 virtualenv의 차이점을 알아볼게요.

 

 

2. venv와 virtualenv 차이점 🆚

파이썬에서 가상환경을 만드는 방법에는 대표적으로 venvvirtualenv 두 가지가 있어요.

둘 다 비슷한 역할을 하지만, 약간의 차이가 있죠.

어떤 도구를 써야 할지 고민될 때가 많습니다.

📌 공통점 먼저 정리해볼까요?

  • 프로젝트마다 독립적인 파이썬 환경을 제공해요.
  • 패키지 설치 경로가 프로젝트 내부로 분리되어 충돌 방지에 효과적이에요.
  • requirements.txt로 패키지 목록을 저장하고 공유할 수 있어요.

⚖️ 그럼 차이점은 뭘까요?

항목 venv virtualenv
기본 제공 여부 Python 3.3 이상에 내장됨 pip install virtualenv로 별도 설치 필요
Python 버전 선택 설치된 기본 Python만 사용 원하는 Python 버전 지정 가능
윈도우 호환성 Windows에서 일부 제한 있음 더 유연하게 작동
속도와 기능 기본적인 기능에 충실 속도 빠르고 다양한 기능 포함

간단히 말하면,

초보자에겐 venv가, 버전 관리나 속도, 커스터마이징이 필요한 경우엔 virtualenv가 더 적합해요.

✅ 그럼 어느 걸 쓰는 게 좋을까요?

  • 간단하고 빠르게 환경 구성하고 싶다면 → venv
  • 여러 Python 버전을 동시에 관리하고 싶다면 → virtualenv

이제 각 도구의 장단점과 선택 기준이 명확해졌죠?

 

다음 파트에서는 venv를 실제로 어떻게 사용하는지 단계별로 보여드릴게요!

 

 

3. venv 사용법 완전 정복 💡

이제 본격적으로 venv를 사용하는 방법을 알아볼 차례입니다.

venv는 파이썬 3.3부터 기본 내장되어 있어 별도 설치가 필요 없고요,

커맨드 몇 줄만 입력하면 쉽게 환경을 만들고, 관리하고, 삭제할 수 있어요. 👌

🛠️ 기본 사용법

  1. 가상환경 생성:
    python -m venv venv
  2. 현재 폴더에 venv라는 폴더가 생기고, 가상환경이 이 안에 생성됩니다.
  3. 가상환경 활성화:
    • Windows: venv\Scripts\activate
    • Mac/Linux: source venv/bin/activate
    터미널 앞에 ((venv)) 표시가 뜨면 성공!
  4. 패키지 설치:
    pip install flask
    이때 설치된 패키지는 venv 내부에만 적용됩니다.
  5. 패키지 목록 저장:
    pip freeze > requirements.txt
    이 파일로 나중에 동일 환경을 쉽게 재구성할 수 있어요.
  6. 가상환경 비활성화:
    deactivate

🧪 실전 예제: Flask 프로젝트 만들기

  1. 프로젝트 폴더 생성: mkdir flask_projectcd flask_project
  2. 가상환경 생성: python -m venv venv
  3. 가상환경 활성화 후 Flask 설치: pip install flask
  4. 앱 실행 파일 생성: app.py
  5. requirements.txt 저장: pip freeze > requirements.txt

 

이런 방식으로 프로젝트별로 독립적인 환경을 구성하면 패키지 충돌 없이 쾌적한 개발이 가능합니다.

그리고 팀원에게 requirements.txt만 넘기면 동일한 환경 구성이 가능하니 협업에도 정말 좋아요! 🤝

 

다음은 조금 더 유연한 기능을 가진 virtualenv 활용법으로 넘어가 볼게요!

 

 

4. virtualenv로 프로젝트 격리하기 🚧

venv가 기본 내장이라면, virtualenv는 좀 더 전문적인 개발자들이 자주 사용하는 고급형 도구라고 볼 수 있어요.

virtualenvPython 버전 지정, 빠른 환경 생성, venv보다 넓은 호환성이라는 장점이 있어서 여러 환경을 넘나드는 개발자라면 필수 도구랍니다.

📥 설치 방법

pip install virtualenv

 

설치가 끝나면, 이제 언제든 자유롭게 가상환경을 생성할 수 있어요.

⚙️ virtualenv 기본 사용법

  1. 가상환경 생성:
    virtualenv venv
  2. Python 버전 지정:
    virtualenv -p /usr/bin/python3.10 venv
  3. 원하는 Python 버전을 명시적으로 지정 가능해요.
  4. 가상환경 활성화:
    • Windows: venv\Scripts\activate
    • Mac/Linux: source venv/bin/activate

📋 venv vs virtualenv 요약 비교

기능 venv virtualenv
내장 여부 Python 3.3+ 내장 설치 필요
Python 버전 지정 불가능 가능
속도 및 유연성 기본 기능 더 빠르고 유연

📌 추천 사용 시나리오

  • 여러 프로젝트에서 다양한 Python 버전을 사용할 경우
  • 개발환경 자동화 스크립트를 구성할 경우

 

이처럼 virtualenv는 venv보다 더 강력하고 유연해요.

자주 Python 버전을 오가거나 여러 환경을 테스트할 필요가 있다면 virtualenv가 딱입니다!

 

이제 다음 단계에서는 가상환경을 체계적으로 관리하는 팁을 알려드릴게요.

실용적인 예제도 준비했으니 기대해주세요! 😉

 

 

5. 프로젝트별 가상환경 관리 꿀팁 🧠

가상환경을 만들 줄 아는 것만으로는 부족합니다.

venvvirtualenv든, 프로젝트가 많아질수록 가상환경 관리도 노하우가 필요하거든요.

이제부터는 정말 많이 쓰는 관리 꿀팁들을 공유드릴게요. 🤓

📁 가상환경은 프로젝트 폴더 내부에!

venv 디렉토리를 프로젝트 폴더 내부에 두는 게 좋습니다.

이렇게 하면 프로젝트별로 독립성 유지도 되고, Git 등의 버전관리도 깔끔하게 할 수 있어요.

.gitignore 설정 잊지 마세요 ✋

# .gitignore 예시
venv/
__pycache__/
*.pyc

 

가상환경 자체는 Git에 올릴 필요가 없어요.

대신 requirements.txt만 올리면 됩니다.

그렇게 해야 협업할 때 다른 개발자들이 환경을 똑같이 복원할 수 있거든요.

📦 환경 백업과 복원 – pip freeze & install

  • 현재 환경 저장: pip freeze > requirements.txt
  • 다른 환경에서 복원: pip install -r requirements.txt

이 두 명령어만 기억하면 언제 어디서든 동일한 개발환경 재현이 가능합니다.

이건 진짜 습관처럼 익혀두세요. 꼭이요! 🙌

🧼 안 쓰는 가상환경은 정리!

  1. 사용이 끝난 가상환경은 폴더째로 삭제하면 됩니다.
  2. 단, 삭제 전 requirements.txt는 꼭 저장하세요!

관리되지 않는 가상환경은 나중에 헷갈림을 부르고, 디스크만 차지해요.

정리 정돈 습관, 이럴 때 진짜 필요하답니다. 😉

 

자, 이제 마지막으로 requirements.txt를 활용해서 팀원들과 환경을 어떻게 공유하는지까지 알아보죠!

 

 

6. requirements.txt로 팀원과 환경 공유하기 🤝

프로젝트는 혼자 하지 않죠. 팀으로 협업할 때 가장 중요한 건 "동일한 개발 환경 유지"예요.

이게 안 맞으면 “왜 난 되는데 넌 안되지?”라는 말이 오고 가고...

결국 디버깅 지옥 😇 그걸 막기 위한 비밀 병기!

바로 requirements.txt입니다.

📌 requirements.txt란?

pip freeze 명령어로 현재 설치된 패키지와 버전 정보를 목록으로 출력할 수 있어요.

이걸 파일로 저장한 게 바로 requirements.txt예요.

한 마디로 “내 개발 환경 설명서”죠.

pip freeze > requirements.txt

🧑‍💻 팀원이 requirements.txt를 받았다면?

가상환경을 새로 만들고, 아래 명령어 한 줄이면 끝입니다!

pip install -r requirements.txt

 

이 명령어는 requirements.txt에 적힌 모든 패키지를 자동으로 설치해 줍니다.

환경 복제, 배포 자동화, Docker에도 필수예요.

🔁 작업 흐름 요약

단계 명령어 설명
1. 환경 저장 pip freeze > requirements.txt 현재 가상환경 패키지 버전 목록 저장
2. 파일 공유 requirements.txt 복사 Git 등으로 팀원에게 전달
3. 환경 복원 pip install -r requirements.txt 동일한 환경으로 패키지 설치

 

🎁 TIP: 자동화까지 생각한다면?

Makefile이나 bash script로 가상환경 생성부터 설치까지 자동화하면 초기 세팅 시간도 아끼고, 팀원도 더 편해집니다.

# install.sh 예시
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt

 

이렇게 requirements.txt는 팀워크의 핵심 도구예요.

협업을 한다면, 꼭 익혀야 할 필수 기술이랍니다.

 

 

🎯 마무리: 파이썬 가상환경으로 개발 스트레스 줄이기!

지금까지 파이썬 가상환경(venv, virtualenv)을 이용한 프로젝트 관리법을 단계별로 알아봤어요.

환경이 꼬여서 에러가 터지고, 버전이 충돌하고, 협업할 때 "이상하게 내 컴퓨터만 안 돼요..."라는 말이 자꾸 나오는 상황!

이제는 없을 겁니다.

왜냐면 가상환경을 능숙하게 관리할 수 있게 되었으니까요. 😎

이 글 하나만 제대로 익혀두면, 앞으로는 어떤 프로젝트를 하든 깔끔하게 환경을 세팅하고, 재현하고, 공유할 수 있어요.

이게 바로 진짜 실력자의 개발 루틴이랍니다.

혹시 지금 시작하는 단계라면, 일단 venv로 시작해보세요.

그리고 점점 virtualenvpoetry 같은 고급 도구로 확장해나가면 됩니다.

가장 중요한 건 나만의 프로젝트 환경을 스스로 컨트롤하는 경험이니까요! 💡

반응형

+ Recent posts