ORM이란?
ORM(Object-Relational-Mapper)은 관계형 데이터베이스 테이블에 저장된 데이터를 객체로 자동 전송하는 코드 라이브러리이다.
그렇다면 Object-Relational Mapping은 뭘까?
Object-Relational-Mapping은 raw 쿼리를 사용하는 것이 아닌, 개발자가 현재 사용하고 있는(SQL보다 더 친숙한) 언어의 객체 지향 패러타임을 이용해 쿼리하는 것을 말한다.
이를 가능하게 해주는 라이브러리가 바로 Object-Relational-Mapper이다.
ORM의 특징
- ORM은 관계형 데이터베이스에 대한 고수준의 추상화를 통해 SQL을 이용해 CRUD를 하는 대신 특정 언어를 이용해 쿼리할 수 있도록 해준다.
- 또한 ORM을 이용하면 ORM이 제공하는 고급 기능들을 사용할 수 있다. 그 기능들은 예를 들면 트랜잭션 지원, 커넥션 풀링, 마이그레이션 같은 것들이 있다.
- 이밖에도 개발 환경과 운영 환경 등 서로 다른 상황에서도 여러 다양한 관계형 데이터베이스를 함께 사용할 수 있다.
- 즉, ORM은 RDBMS에 의존적이지 않기 때문에 개발 환경에서는 SQLite를 사용하고 운영 환경에서는 PostgreSQL을 사용하는 등 서로 다른 데이터베이스를 사용하는 것이 가능하다.
- 그러나 실제 개발 시에는 개발 환경과 운영 환경이 보통 동일한 RDBMS를 사용하기 때문에(서로 다른 RDBMS를 사용함으로써 생길 수 있는 문제를 방지하기 위해) 이 부분은 굳이 알 필요 없을 것 같다.
프로그래밍 언어는 ORM으로만 DB 접근이 가능할까?
프로그래밍 언어를 이용해 관계형 데이터베이스에 접근할 때 ORM 라이브러리가 항상 필요한 것은 아니다. ORM보다 비교적 저수준의 접근이 가능하도록 구현된 psycopg 또는 MySQL-python이 제공하는 databse connector를 이용하는 것도 가능하다.
이를 통해 필요시 프로그래밍 언어를 이용해 raw SQL로 쿼리하는 것도 가능하다.
가령 window function을 이용한 복잡한 쿼리를 해야하는 경우 ORM으로 쿼리를 짜는 것이 어려울 수 있는데 이럴 때 raw 쿼리가 도움이 된다.
ORM 사용시 발생할 수 있는 문제점
Impedance Mismatch
Impedance mismatch는 데이터베이스 모델과 프로그래밍 언어의 모델이 서로 달라서 발생할 수 있는 문제점이다.
데이터 타입 mismatch
- 프로그래밍 언어에서 사용하는 데이터의 타입과 데이터 모델에서 사용하는 데이터 타입이 서로 다를 수 있다.
- 따라서, 각 속성 유형에 대한 호환이 가능하도록 프로그래밍 언어끼리 언어 유형 별 바인딩을 가지고 있어야 한다.
Tuple의 사용
- 대부분의 쿼리의 결과는 튜플로 구성 된다. 따라서, 각 데이터에 접근하기 위해서는 튜플에 어떻게 접근할 것인지를 파악해야 한다.
성능 저하
- ORM을 이용할 경우 프로그래밍 언어를 SQL문으로 변환하게 되면서 성능 저하가 생길 수 있다.
- ORM이 SQL 변환될 때 이 SQL문이 적절히 튜닝되어 있을 가능성이 적기 때문이다. 왜냐하면, 보통 ORM을 마스터 하지 않는 이상 장고에서 사용하는 select_related()
와 같은 고급 쿼리를 접하기는 어렵기 때문이다.
- 이 문제는 오히려 DBA와 같은 분들이 raw 쿼리를 통해 성능 최적화를 함으로써 해결될 수 있다.
데이터를 코드 상에서 사용하며 생기는 문제
- ORM이 사용되기 전에는 데이터베이스 프로시저를 통해 데이터베이스 로직을 캡슐화 하여 사용했으나 ORM의 경우 코드 내부에서 데이터를 조작하기 위한 로직이 들어가야 하기 때문에 이렇게 데이터를 다루기 위해 추가적인 코드가 더 필요하게 된다.
- 이는 앱에 디자인 패턴이 잘 적용되어 있다면 문제가 되지 않겠지만 그렇지 않다면 데이터를 제대로 캐싱하지 않아 DB에 데이터를 여러 번 요청하며 과부하를 발생시키는 등의 문제가 발생할 수 있다.
참고