# 데이터베이스 ORM 대체
# ORM (Object-Relational Mapping) : ORM은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 변환을 자동화하는 기술입니다.
# 쉽게 말해, 데이터베이스 테이블을 Python 객체로 직접 다룰 수 있게 해줍니다.
# ORM 없이 직접 SQL 사용 vs. ORM 사용 하는 경우 비교
# ORM은 데이터베이스 작업을 더 직관적이고 안전하게 만드는 강력한 도구입니다. 특히:
# 개발 생산성 향상
# 코드 유지보수 용이
# 데이터베이스 추상화
# 타입 안전성
# 하지만 성능이 중요한 시스템에서는 직접 SQL 사용과 조합하는 것이 좋습니다.
from dataclasses import dataclass, asdict
import sqlite3
@dataclass
class Product:
product_id: int
name: str
price: float
stock_quantity: int
category: str
created_at: str = None
def to_dict(self):
return asdict(self)
def save_to_db(self, conn):
cursor = conn.cursor()
cursor.execute(
# "INSERT INTO products VALUES (?, ?, ?, ?, ?)",
"""INSERT INTO products
(product_id, name, price, stock_quantity, category)
VALUES (?, ?, ?, ?, ?)
""", # 더 좋은 습관 (260620)
(self.product_id, self.name, self.price, self.stock_quantity, self.category)
# sqlite3의 execute()에서는 SQL문의 ? 플레이스홀더와 튜플의 값이 순서대로 1:1 대응된다. (260620)
# 용어 : 플레이스 홀더 ? (물음표) - 튜플의 순서가 바뀌는 경우, 잘못 저장되거나 타입 오류 발생 가능성 있음
)
conn.commit()
# 사용 예시
product = Product(1, "노트북", 1500000.0, 50, "Electronics")
# 1. to_dict() 메서드 사용 예시
print("to_dict() 결과:")
product_dict = product.to_dict()
print(product_dict)
# 2. save_to_db() 메서드 사용 예시
# SQLite 데이터베이스 연결
conn = sqlite3.connect(':memory:') # 메모리 상에 임시 데이터베이스 생성
cursor = conn.cursor()
# 파일 생성 없음 - 디스크에 파일이 남지 않음
# 즉시 사용 가능 - 테스트나 예제 실행 시 빠름
# 데이터 안전성 - 테스트 종료 후 자동 정리
# 독립 실행 - 다른 프로세스와 데이터 충돌 없음
# 테스트 전용 - 실제 데이터베이스와 분리됨
# 따라서 :memory:는 테스트, 개발, 예제 코드 등을 위한 임시 데이터베이스 생성 방법이다.
# products 테이블 생성
cursor.execute('''
CREATE TABLE IF NOT EXISTS products (
product_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
price REAL NOT NULL,
stock_quantity INTEGER NOT NULL,
category TEXT NOT NULL
)
''')
# 데이터 저장
product.save_to_db(conn)
# 저장된 데이터 확인
cursor.execute("SELECT * FROM products")
saved_product = cursor.fetchone()
print("\nsave_to_db() 후 데이터 확인:")
print(saved_product)
# 출력: (1, '노트북', 1500000.0, 50, 'Electronics')
# 연결 종료
conn.close()