ORM이란?
Object Relational Mapping의 약자로, 객체 지향형 프로그램과 관계형 데이터 베이스를 연결해주는 도구이다. 클래스를 사용하는 OOP와 테이블을 사용하는 관계형 데이터베이스 사이에서 불일치가 일어나는데 ORM 툴을 사용한다면 SQL 쿼리를 직접 작성하지 않고도 객체를 통해 데이터베이스를 다룰 수 있다.
예시로 특정 사용자에 대한 정보를 데이터베이스에서 가져오는 SQL 쿼리문을 작성한다면 아래와 같다.
SELECT id, name, email, country, phone_number FROM users WHERE id = 20
하지만 ORM 툴을 사용한다면 객체를 활용하여 간단하게 불러올 수 있다.
users.GetById(20)
ORM을 사용하면 가독성이 좋아지고 조작하기 쉽기 때문에 개발 시 비즈니스 로직 자체에 집중할 수 있다. 객체 지향적 프로그래밍이 가능하기 때문에 재사용과 유지보수에도 유리하다. ORM 툴이 데이터베이스와 통신하도록 만들어졌기 때문에 mysql, oracle, mariadb 등 DBMS에 종속적이지 않다. SQL 인젝션 공격 가능성을 없애도록 설계되었기 때문에 보안에도 좋다고 한다. 다만, ORM 툴이 쿼리문을 사용하는 것보다 일반적으로 느리고, 객체를 잘못 사용했을 때 코드가 꼬일 수 있다는 단점이 있다. 파이썬에서 사용할 수 있는 ORM 툴은 SQLAlchemy, django, SQLObject, peewee 등이 있다.
Python에서 ORM으로 PostgreSQL 연결하기
기존에 mysql에서 라이센스 문제, 확장가능성 등 여타 이유로 postgre로 데이터를 이전하게 되었다. 그리고 파이썬에서 직접 쿼리문을 보내는 방식으로 진행하다가 요청할 것들이 복잡해지는 바람에 ORM을 사용해보기로 하였다. 최신까지도 깃헙에 업데이트가 되고 있는peewee를 사용해보고자 한다.
GitHub - coleifer/peewee: a small, expressive orm -- supports postgresql, mysql and sqlite
a small, expressive orm -- supports postgresql, mysql and sqlite - GitHub - coleifer/peewee: a small, expressive orm -- supports postgresql, mysql and sqlite
github.com
깃헙에 나온 예시를 활용하여 postgrsql db를 초기화하고, 예시 모델을 정의하고 db에 테이블을 생성해보았다.
from peewee import *
db = PostgresqlDatabase('my_app', user='postgres', password='secret',
host='10.1.0.9', port=9999)
class BaseModel(Model):
class Meta:
database = db
class User(BaseModel):
username = CharField(unique=True)
class Tweet(BaseModel):
user = ForeignKeyField(User, backref='tweets')
message = TextField()
db.connect()
db.create_tables([User, Tweet])
Model의 하위 클래스를 정의하면, 자동으로 db의 해당 테이블에 매핑된다. 클래스 내 정의된 각 필드는 테이블의 열에 해당하며,
Peewee는 모델 정의를 기반으로 테이블을 생성, 변경 및 쿼리하는 데 필요한 SQL 쿼리를 생성한다. 더 많은 기능들은 peewee로 좀 더 작업해보고 업데이트하고자 한다.
---
관련 링크들
- https://www.freecodecamp.org/news/what-is-an-orm-the-meaning-of-object-relational-mapping-database-tools/
- https://popawaw.tistory.com/239
- https://www.integrate.io/ko/blog/postgresql-vs-mysql-the-critical-differences-ko/
'Dev Notes > BE' 카테고리의 다른 글
NAS vs NFS (0) | 2025.02.26 |
---|---|
[Database] Docker로 RDBMS 사용하기 (ft. postgres, mysql) (0) | 2023.06.04 |
[Database] MySQL 커넥터 비교하기 (0) | 2023.05.28 |
[Network] API와 gRPC vs REST (0) | 2023.05.21 |