[파이썬] ORM을 사용한 데이터베이스 엔터티 상속

데이터베이스 엔터티 상속은 객체지향 프로그래밍에서 자주 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 공통된 속성과 동작을 가지는 엔터티들을 상속 관계로 구성하여 코드의 재사용성과 유지보수성을 높여줍니다.

파이썬에서 ORM(Object-Relational Mapping) 라이브러리를 사용하면 데이터베이스의 테이블과 객체 간의 매핑을 손쉽게 처리할 수 있습니다. 이번 블로그 포스트에서는 ORM을 사용하여 데이터베이스 엔터티 상속을 어떻게 구현할 수 있는지 알아보겠습니다.

ORM이란?

ORM은 자바, 파이썬 등의 프로그래밍 언어와 데이터베이스 간의 상호 작용을 추상화해주는 도구입니다. ORM을 사용하면 데이터베이스 테이블의 데이터를 객체로 다룰 수 있으며, 객체를 데이터베이스에 저장하고 검색하는 작업을 간단하게 수행할 수 있습니다.

주요 ORM 라이브러리로는 Django의 ORM, SQLAlchemy, Peewee 등이 있습니다.

데이터베이스 엔터티 상속 구현하기

데이터베이스 엔터티 상속을 구현하기 위해서는 ORM 라이브러리를 사용하여 부모 클래스와 자식 클래스의 관계를 매핑해야 합니다. 이때 부모 클래스는 테이블이 되며, 자식 클래스는 부모 클래스를 상속받아 다른 테이블로 매핑됩니다.

다음은 SQLAlchemy를 사용하여 데이터베이스 엔터티 상속을 구현하는 예시입니다.

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    name = Column(String)

class Child(Parent):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    age = Column(Integer)

위 예시에서 Parent 클래스는 Base 클래스를 상속받아 테이블로 매핑되며, Child 클래스는 Parent 클래스를 상속받아 다른 테이블로 매핑됩니다. 이를 통해 ParentChild는 공통된 속성인 id를 가지면서 Child는 별도의 속성인 age를 가지게 됩니다.

이렇게 구현된 데이터베이스 엔터티 상속은 다음과 같이 활용할 수 있습니다.

# 데이터베이스에 새로운 Parent 객체 저장
parent = Parent(name='John')
session.add(parent)
session.commit()

# 데이터베이스에 새로운 Child 객체 저장
child = Child(name='Jane', age=10)
session.add(child)
session.commit()

# Parent 객체 조회
parents = session.query(Parent).all()
for parent in parents:
    print(parent.name)  # John

# Child 객체 조회
children = session.query(Child).all()
for child in children:
    print(child.name, child.age)  # Jane, 10

위 예시에서는 Parent 클래스와 Child 클래스를 사용하여 각각의 테이블에 데이터를 저장하고 조회하는 방법을 보여줍니다.

결론

ORM을 사용하여 데이터베이스 엔터티 상속을 구현하면 객체지향 프로그래밍의 장점을 데이터베이스 모델링에 적용할 수 있습니다. ORM 라이브러리를 활용하여 데이터베이스와 객체 간의 매핑을 간단하게 처리하면 코드의 재사용성과 유지보수성을 높일 수 있습니다.