`psycopg2` 라이브러리의 핵심 개념

Sue·2025년 9월 5일
0
post-thumbnail

psycopg2 라이브러리의 핵심 개념

Python에서 PostgreSQL 데이터베이스를 다룰 때 널리 쓰이는 라이브러리가 바로 psycopg2입니다.

데이터베이스와의 상호작용 과정을 이해하기 쉽게 레스토랑에서 주문하고 식사하는 과정에 비유해 보겠습니다.


비유로 먼저 이해하기

  • connect() / conn (연결): 레스토랑에 들어가서 내 테이블에 앉는 것
  • cursor() / cur (커서): 웨이터를 부르는 것. 모든 주문은 웨이터를 통해 전달된다.
  • execute() (실행): 웨이터에게 “파스타 하나 주세요”라고 주문하는 것
  • fetchall() (결과 가져오기): 웨이터가 음식을 가져오는 것
  • commit() (확정): 음식을 다 먹고 계산하는 것
  • rollback() (취소): 잘못 주문해서 “주문 취소할게요”라고 하는 것
  • close() (종료): 식사를 마치고 레스토랑에서 나오는 것

핵심 개념과 코드 예제

1. psycopg2.connect()conn (연결 객체)

  • 역할: 데이터베이스와 연결을 생성한다. DB 주소, 사용자 계정, 비밀번호 등을 입력하여 접속하며, 연결 정보를 담은 conn 객체가 반환된다.
  • 비유: 레스토랑에 들어가서 내 테이블에 앉는 것.
import psycopg2

# 데이터베이스 연결
conn = psycopg2.connect(
    host="localhost",
    database="testdb",
    user="postgres",
    password="password"
)

2. conn.cursor()cur (커서 객체)

  • 역할: SQL 명령을 실행하고 결과를 받아오는 중간 역할. 모든 DB 상호작용은 커서를 통해 이루어진다.
  • 비유: 웨이터를 부르는 것.
cur = conn.cursor()

3. cur.execute(query, params) (쿼리 실행)

  • 역할: SQL 쿼리를 실행한다. 파라미터 바인딩을 지원하여 SQL Injection 공격을 방어할 수 있다.
  • 비유: 웨이터에게 “이 메뉴 주세요”라고 주문하는 것.
# 테이블 생성
cur.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        name TEXT,
        age INT
    )
""")

# 데이터 삽입 (파라미터 바인딩)
cur.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Alice", 25))

4. fetchall() / fetchone() / fetchmany()

  • 역할: SELECT 쿼리 결과를 가져온다.
  • 비유: 웨이터가 음식을 한 접시, 일부, 전부 가져오는 것.
cur.execute("SELECT * FROM users")
rows = cur.fetchall()
for row in rows:
    print(row)

5. conn.commit() (트랜잭션 확정)

  • 역할: 변경 사항을 최종적으로 DB에 반영한다. commit()을 호출하지 않으면 DB에는 반영되지 않는다.
  • 비유: 식사를 마치고 계산하는 것.
conn.commit()

6. conn.rollback() (트랜잭션 취소)

  • 역할: commit() 전에 실행된 변경 사항을 모두 취소한다. 주로 에러 발생 시 사용된다.
  • 비유: 주문을 취소하는 것.
try:
    cur.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Bob", "not_a_number"))
    conn.commit()
except Exception as e:
    print("에러 발생:", e)
    conn.rollback()

7. cur.close()conn.close() (자원 해제)

  • 역할: 커서와 연결을 닫아 자원을 반환한다. 닫지 않으면 연결이 계속 유지되어 서버에 부담이 될 수 있다.
  • 비유: 웨이터를 돌려보내고, 레스토랑에서 나오는 것.
cur.close()
conn.close()

전체 예제 코드

import psycopg2

try:
    # 연결
    conn = psycopg2.connect(
        host="localhost",
        database="testdb",
        user="postgres",
        password="password"
    )
    cur = conn.cursor()

    # 테이블 생성
    cur.execute("""
        CREATE TABLE IF NOT EXISTS users (
            id SERIAL PRIMARY KEY,
            name TEXT,
            age INT
        )
    """)

    # 데이터 삽입
    cur.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Alice", 25))

    # 조회
    cur.execute("SELECT * FROM users")
    rows = cur.fetchall()
    for row in rows:
        print(row)

    # 확정
    conn.commit()

except Exception as e:
    print("에러 발생:", e)
    conn.rollback()

finally:
    # 자원 해제
    if cur:
        cur.close()
    if conn:
        conn.close()

정리

  • connect() → 데이터베이스 연결 (테이블에 앉기)
  • cursor() → 커서 생성 (웨이터 부르기)
  • execute() → SQL 실행 (주문하기)
  • fetch*() → 결과 가져오기 (음식 받기)
  • commit() → 변경 사항 확정 (계산하기)
  • rollback() → 변경 사항 취소 (주문 취소)
  • close() → 자원 해제 (퇴장하기)

psycopg2는 PostgreSQL과 상호작용하기 위한 표준적인 도구이며, 올바르게 commit, rollback, close를 사용하는 것이 안정적인 데이터베이스 프로그래밍의 핵심입니다.


profile
AI/ML Engineer

0개의 댓글