개요
ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 사이의 데이터 변환을 자동화하는 도구입니다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하지 않고도 데이터베이스에 접근하고 조작할 수 있습니다. 이번 포스트에서는 Python에서 많이 사용되는 ORM인 SQLAlchemy를 활용하여 데이터베이스 테스트 코드를 작성하는 방법에 대해 알아보겠습니다.
사전 준비
다음과 같은 패키지를 설치해야 합니다:
- SQLAlchemy
- pytest
pip install SQLAlchemy pytest
데이터베이스 설정
먼저 SQLAlchemy를 사용하여 데이터베이스에 연결하는 설정을 해야 합니다. 예를 들어, SQLite 데이터베이스를 사용하는 경우 다음과 같이 설정 파일에 다음 내용을 적습니다:
from sqlalchemy import create_engine
DATABASE_URI = "sqlite:///test.db"
engine = create_engine(DATABASE_URI)
모델 정의
다음으로 데이터베이스 모델을 정의해야 합니다. SQLAlchemy에서는 클래스를 테이블로 매핑하는 방식으로 모델을 정의합니다. 각 클래스는 테이블의 컬럼을 속성으로 가지며, 테이블간의 관계를 정의할 수도 있습니다. 예를 들어, 다음과 같이 User
모델을 정의할 수 있습니다:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String)
email = Column(String)
테스트 코드 작성
이제 테스트 코드를 작성해보겠습니다. pytest를 사용하여 테스트를 수행하기 때문에, 각 테스트 함수는 test_
로 시작해야 합니다. 먼저 데이터베이스에 모델을 생성하고 쿼리를 수행하여 결과를 검증하는 테스트를 작성해보겠습니다:
from sqlalchemy.orm import sessionmaker
from myapp.db import engine, Base, User
Session = sessionmaker(bind=engine)
def setup_module():
Base.metadata.create_all(bind=engine)
def teardown_module():
Base.metadata.drop_all(bind=engine)
def test_create_user():
session = Session()
user = User(username='john', email='john@example.com')
session.add(user)
session.commit()
assert user.id is not None
def test_get_user_by_username():
session = Session()
user = session.query(User).filter_by(username='john').first()
assert user.username == 'john'
assert user.email == 'john@example.com'
실행 및 결과 확인
테스트를 실행하기 위해 프로젝트 루트 디렉토리에서 다음 명령을 실행합니다:
pytest
테스트 결과가 출력되며, 성공한 테스트는 초록색으로, 실패한 테스트는 빨간색으로 표시됩니다. SQLAlchemy를 사용하여 올바르게 데이터베이스에 접근하고 조작하는지 확인할 수 있습니다.
마치며
이번 포스트에서는 ORM을 사용하여 데이터베이스 테스트 코드를 작성하는 방법에 대해 알아보았습니다. SQLAlchemy를 통해 쉽게 데이터베이스 모델을 정의하고 테스트 코드를 작성할 수 있습니다. ORM을 활용하면 데이터베이스와의 상호작용이 간편해지며, 유지 보수성과 생산성을 높일 수 있습니다.