프로그래밍/Python

Python ORM 완벽 가이드: SQLAlchemy를 활용한 데이터베이스 처리

shimdh 2025. 2. 27. 10:15
728x90

현대 소프트웨어 개발에서 데이터베이스 처리는 필수적인 요소입니다. 애플리케이션이 데이터를 저장하고 검색하며 조작하는 과정에서 SQL(Structured Query Language) 를 직접 사용하는 것은 가능하지만, 코드의 복잡성이 증가하고 유지보수가 어려워질 수 있습니다.

이러한 문제를 해결하기 위해 등장한 기술이 ORM(Object-Relational Mapping, 객체-관계 매핑) 입니다. ORM을 사용하면 SQL 쿼리를 직접 작성하지 않고도 객체(Object) 를 통해 데이터베이스와 상호작용할 수 있습니다. Python에서는 대표적인 ORM 라이브러리로 SQLAlchemy가 널리 사용됩니다.

이번 글에서는 ORM의 개념, SQLAlchemy 소개, 기본 사용법, CRUD 연산, 관계 설정 및 고급 활용법까지 폭넓게 다뤄보겠습니다.


1. ORM(Object-Relational Mapping)이란?

🔹 ORM의 개념

ORM(Object-Relational Mapping)은 객체(Object)와 데이터베이스 테이블(Table)을 자동으로 매핑하는 기술입니다. 이를 통해 객체 지향 프로그래밍 방식으로 데이터베이스를 조작할 수 있으며, SQL 문법을 직접 다루지 않고도 데이터 저장 및 조회가 가능합니다.

즉, 데이터베이스의 테이블과 파이썬 클래스를 연결하여 개발자가 SQL 대신 객체를 사용해 데이터를 다룰 수 있도록 하는 것이 ORM의 핵심 원리입니다.

🔹 ORM을 사용할 때의 장점

  • SQL 코드 없이 데이터베이스 조작 가능session.query(User).filter_by(name="Alice").first()와 같은 코드로 SQL 문을 대체.
  • 코드 가독성 및 유지보수성 향상 → ORM을 사용하면 SQL을 직접 다루는 것보다 코드가 더 직관적이며, 데이터 구조 변경 시 수정해야 할 코드가 줄어듦.
  • 보안 강화 → ORM은 SQL Injection과 같은 보안 취약점을 방지하는 데 도움을 줌.
  • 데이터베이스 독립성 제공 → SQLite, PostgreSQL, MySQL 등 다양한 데이터베이스를 동일한 코드로 지원 가능.

2. SQLAlchemy 소개

🔹 SQLAlchemy란?

SQLAlchemy는 Python에서 가장 널리 사용되는 ORM 라이브러리로, 강력한 기능과 유연성을 제공합니다. 객체 지향 프로그래밍 방식으로 데이터베이스를 쉽게 다룰 수 있도록 설계되었으며, SQL 표현식 언어와 ORM 레이어를 모두 포함하고 있습니다.

🔹 SQLAlchemy의 두 가지 주요 구성 요소

  1. Core: SQL 표현식 언어와 낮은 수준의 데이터베이스 API를 제공.
  2. ORM(Object Relational Mapper) Layer: 객체 기반으로 SQL을 추상화하여 데이터베이스와 상호작용 가능.

3. Python에서 SQLAlchemy 사용하기

🔹 1. SQLAlchemy 설치

pip install sqlalchemy

🔹 2. 기본적인 데이터베이스 연결 및 테이블 생성

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 데이터베이스 엔진 생성 (SQLite 사용)
engine = create_engine('sqlite:///example.db', echo=True)

# 베이스 클래스 정의
Base = declarative_base()

# 사용자(User) 모델 정의
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String, nullable=False)
    age = Column(Integer)

# 테이블 생성
Base.metadata.create_all(engine)

# 세션(Session) 생성
Session = sessionmaker(bind=engine)
session = Session()

✅ 코드 설명

  1. create_engine('sqlite:///example.db') → SQLite 데이터베이스를 생성 및 연결.
  2. Base = declarative_base() → ORM에서 사용할 기본 클래스를 생성.
  3. User 클래스 → users 테이블과 매핑되는 모델 정의.
  4. sessionmaker(bind=engine) → 세션을 생성하여 데이터베이스와 상호작용.

4. CRUD 작업 (생성, 조회, 수정, 삭제)

🔹 1. 데이터 생성(Create)

new_user = User(name="Alice", age=30)
session.add(new_user)
session.commit()
  • session.add(new_user) → 새로운 User 객체를 데이터베이스에 추가.
  • session.commit() → 변경 사항 저장.

🔹 2. 데이터 조회(Read)

# 모든 사용자 조회
users = session.query(User).all()
for user in users:
    print(f"ID: {user.id}, Name: {user.name}, Age: {user.age}")

# 특정 사용자 조회 (이름이 'Alice'인 사용자)
alice = session.query(User).filter_by(name="Alice").first()
print(f"Alice의 나이: {alice.age}")
  • .query(User).all() → 테이블의 모든 데이터를 조회.
  • .filter_by(name="Alice").first()name="Alice" 조건을 만족하는 첫 번째 데이터 조회.

🔹 3. 데이터 수정(Update)

alice = session.query(User).filter_by(name="Alice").first()
alice.age += 1  # 나이 증가
session.commit()
  • .filter_by(name="Alice").first() → 특정 데이터 찾기.
  • alice.age += 1 → 속성 값 변경 후 session.commit()으로 반영.

🔹 4. 데이터 삭제(Delete)

session.delete(alice)
session.commit()
  • .delete(alice) → 특정 데이터를 삭제.
  • session.commit() → 변경 사항을 데이터베이스에 적용.

5. 테이블 간 관계 설정 (1:N 관계)

SQLAlchemy를 활용하면 테이블 간 관계를 쉽게 설정할 수 있습니다.

🔹 예제: 사용자(User)와 주소(Address) 간의 관계 설정

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class Address(Base):
    __tablename__ = 'addresses'

    id = Column(Integer, primary_key=True)
    email = Column(String, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))  # 외래키 설정

    # User와 관계 설정 (일대다 관계)
    user = relationship("User", back_populates="addresses")

User.addresses = relationship("Address", order_by=Address.id, back_populates="user")

Base.metadata.create_all(engine)

✅ 실행 흐름

  • ForeignKey('users.id')addresses 테이블이 users 테이블을 참조.
  • relationship("User", back_populates="addresses") → ORM에서 자동으로 관계를 설정.

6. SQLAlchemy의 고급 기능

✅ 대량 데이터 삽입 (Bulk Insert)

users = [User(name="Bob", age=40), User(name="Charlie", age=22)]
session.bulk_save_objects(users)
session.commit()

✅ 트랜잭션(Transaction) 사용

session.begin()
try:
    session.add(User(name="Eve", age=29))
    session.commit()
except:
    session.rollback()  # 오류 발생 시 롤백

🔥 결론: ORM을 활용한 데이터베이스 처리의 혁신

SQLAlchemy를 활용하면 SQL을 직접 작성하지 않고도 강력한 데이터베이스 조작이 가능합니다. 이를 통해 개발자는 더 직관적이고, 유지보수하기 쉬운 코드를 작성할 수 있으며, 보안 및 성능도 향상될 수 있습니다.

🎯 핵심 정리

  • ORM을 활용하면 SQL 대신 객체 지향 방식으로 데이터 조작 가능.
  • SQLAlchemy는 Python에서 가장 강력한 ORM 라이브러리로 다양한 기능을 제공.
  • 테이블 간 관계 설정을 쉽게 처리할 수 있으며, 고급 쿼리도 지원.
  • 트랜잭션 및 예외 처리를 활용하여 안정적인 데이터 관리를 수행 가능.

SQLAlchemy를 잘 활용하면 보다 효율적이고 안전한 데이터베이스 관리가 가능하니, 적극 활용해보세요! 🚀

728x90