본문 바로가기
Coding/Python

FastAPI에서 데이터베이스 모델링과 ORM 사용 전략(SQLAlchemy)

by 포스트it 2024. 11. 11.
728x90
반응형

데이터베이스 모델링과 ORM 사용 전략

안녕하세요, 개발자 여러분! 오늘은 효율적인 데이터 관리를 위한 ORM(Object-Relational Mapping) 사용법에 대해 이야기해보려고 합니다. 특히 SQLAlchemy를 중심으로 데이터베이스 세션 관리비동기 데이터베이스 접근 방법을 살펴보겠습니다.

ORM(Object-Relational Mapping)이란?

ORM은 객체 지향 프로그래밍 언어에서 데이터베이스의 테이블과 레코드를 객체로 표현하여, SQL 쿼리를 직접 작성하지 않고도 데이터베이스를 조작할 수 있게 해주는 기술입니다. 이를 통해 데이터베이스 관련 코드를 더 간결하고 유지보수하기 쉽게 만들 수 있습니다.

장점:

  • 생산성 향상: 복잡한 SQL 문을 직접 작성하지 않아도 됩니다.
  • 유지보수 용이: 데이터베이스 구조 변경 시 코드 수정이 간단합니다.
  • 이식성: 다양한 데이터베이스 시스템에 대해 동일한 코드로 작업할 수 있습니다.

SQLAlchemy 소개

SQLAlchemy는 파이썬에서 가장 널리 사용되는 ORM 라이브러리 중 하나로, 강력한 기능과 유연성을 제공합니다.

주요 특징

  • 데이터베이스 독립성: SQLite, MySQL, PostgreSQL 등 다양한 데이터베이스를 지원합니다.
  • 투명한 연결: 고수준의 ORM과 저수준의 SQL 표현 언어를 모두 제공합니다.
  • 성능 최적화: 지연 로딩, 일괄 쿼리 등 다양한 최적화 기법을 지원합니다.

기본 사용법 예제

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

# 데이터베이스 연결 설정
engine = create_engine('sqlite:///example.db', echo=True)
Base = declarative_base()

# 모델 정의
class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    username = Column(String)
    email = Column(String)

    def __repr__(self):
        return f"<User(username='{self.username}', email='{self.email}')>"

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

위 코드는 SQLite 데이터베이스에 users 테이블을 생성하는 예제입니다.

데이터베이스 세션 관리

세션은 데이터베이스와의 모든 대화를 관리하는 핵심 요소입니다. 올바른 세션 관리는 데이터 일관성을 유지하고 자원 누수를 방지합니다.

세션 생성과 사용

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

# 데이터 추가
new_user = User(username='alice', email='alice@example.com')
session.add(new_user)
session.commit()

# 데이터 조회
users = session.query(User).all()
for user in users:
    print(user)

# 세션 종료
session.close()

컨텍스트 매니저 활용

컨텍스트 매니저를 사용하면 세션 관리를 더욱 효율적으로 할 수 있습니다.

with Session() as session:
    user = session.query(User).filter_by(username='alice').first()
    print(user)
    session.commit()

with 블록을 벗어나면 세션이 자동으로 종료됩니다.

비동기 데이터베이스 접근

비동기 프로그래밍은 I/O 바운드 애플리케이션의 성능을 향상시킬 수 있습니다. SQLAlchemy 1.4 버전부터는 비동기 기능을 지원합니다.

비동기 엔진과 세션 생성

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker

# 비동기 엔진 생성
async_engine = create_async_engine('sqlite+aiosqlite:///example.db', echo=True)

# 비동기 세션 팩토리 생성
AsyncSession = sessionmaker(bind=async_engine, class_=AsyncSession)

비동기 세션 사용 예제

import asyncio
from sqlalchemy import select

async def async_main():
    async with AsyncSession() as session:
        # 데이터 추가
        new_user = User(username='bob', email='bob@example.com')
        session.add(new_user)
        await session.commit()

        # 데이터 조회
        result = await session.execute(select(User))
        users = result.scalars().all()
        for user in users:
            print(user)

asyncio.run(async_main())

비동기 함수를 사용하여 데이터베이스 작업을 수행할 수 있습니다.

결론

ORM을 활용하면 데이터베이스 작업을 더욱 효율적으로 수행할 수 있으며, SQLAlchemy는 그중에서도 강력하고 유연한 옵션입니다. 세션 관리를 통해 데이터 일관성을 유지하고, 비동기 접근을 통해 애플리케이션의 성능을 향상시킬 수 있습니다.

여러분의 프로젝트에서 SQLAlchemy와 ORM을 적극 활용해 보시길 바랍니다!


감사합니다. 다음에도 유익한 내용으로 찾아뵙겠습니다.

728x90
반응형

댓글