Django ORM이 작동하는 방법

Django ORM이 작동하는 방법

장고 웹 프레임워크에서는 기본으로 object-relational mapping(ORM)이라고 불리는 계층을 포함한다. 혹은 object-relational mapper라고 불리기도 한다.

사실 ORM이라고 불리는 이 기술은 장고에서만 사용되는 것이 아니라 스프링(자바), 플라스크(파이썬) 등 다른 언어와 프레임워크에서 널리 쓰이는 방법이다. 예를 들어, 플라스크에서는 SQL Alchemy라는 ORM을 사용하는데, 장고에서는 Django ORM이라고 불리는 자체 ORM을 사용한다.


ORM은 무엇인가?

장고에서 ORM이라는 기술을 사용하는 것은 알았는데, 그럼 ORM은 무슨 뜻일까? Wikipedia에 따르면 ORM은 호환되지 않는 시스템 간에 객체 지향 프로그래밍 언어를 사용함으로써 데이터를 변환해주는 기술이다.

ORM이 작동하는 방법

장고는 파이썬을 언어로 사용하기 때문에 당연히 장고 어플리케이션은 파이썬으로 작성된다. 그러므로, 만약 장고를 사용해 데이터베이스로부터 데이터를 수집하거나 데이터베이스로 데이터를 전송, 혹은 데이터베이스의 구조를 담당하는 데이터베이스 스키마를 변경하고 싶다면 이와 같은 일들을 파이썬을 통해 실행할 수 있다.

ORM이 작동하는 과정은 다음과 같다.
Image from Very Academy

1. Statement

ORM에서 데이터를 수집하기위해 다음과 같은 statement를 먼저 작성한다.

Student.objects.all()

Student는 테이블의 이름을 나타내고, objects는 장고 매니저 클래스(manager class)로서, 장고 모델에 데이터베이스 쿼리 작업을 제공하는 데 사용되는 인터페이스다. 마지막으로 all을 사용해서 Student 테이블에서 모든 데이터를 수집한다.

2. Mapping

위와 같은 statement가 ORM으로 전달이 되면, ORM은 작성된 파이썬 객체를 데이터베이스 객체로 매핑해준다. 즉, 파이썬 언어에서 SQL 언어로 변환되는 과정이다.

SELECT * FROM Student;

3. SQL

마지막으로, ORM을 통해 파이썬 언어가 SQL 언어가 됨으로써, 데이터베이스가 이해하는 SQL언어로 처음에 의도한 ORM문을 수행한다.

정리하자면, ORM은 파이썬 객체를 받아 데이터베이스로부터 데이터를 수집하기 위해 그 정보를 SQL문으로 매핑한다. 그러고 나면, 데이터베이스는 ORM에게 데이터를 반환하고, 반환된 데이터베이스 객체를 파이썬 객체로 다시 매핑 해주는 단계를 거친다. 결과적으로, 장고(파이썬) 어플리케이션에서 SQL문을 사용하지 않고서 데이터를 다루고 관리할 수 있게 되는 것이다.

데이터베이스 어댑터 & 드라이버

사실 장고에서 ORM이 작동하기 위해서는 한 가지 더 필요한 것이 있는데, 바로 데이터베이스 어댑터와 드라이버라고 불리는 것들이다.

장고는 자체 ORM에서 데이터베이스 드라이버에 접근하기 위해 어댑터를 사용해야 한다. 일종의 다리 같은 개념으로, 클라이언트 프로그램(장고 어플리케이션)이 데이터베이스 백엔드 서버로 쿼리를 전달하고 결과를 반환 받도록 도와준다. 대표적으로 MySQL의 mysqlclient와 PostgreSQL의 psycopg2가 있다.

Image from Very Academy

ORM의 장점과 단점

왜 ORM을 사용해야하는가?

  • 이미 작성중인 언어로 ORM을 작성할 수 있다.
  • 데이터베이스 간 전환이 쉽다.
  • ORM은 틀에서 벗어나 추가적인 기능을 제공한다.
  • SQL문에 익숙치 않다면, ORM으로 단시간 내 더 나은 쿼리를 수행할 수 있다..

왜 ORM을 사용하지 않아야 하는가?

  • SQL을 사용함으로써 쿼리를 잘 튜닝해 사용할 수 있다.
    • ORM - 잠재적으로 퍼포먼스를 저하시킬 수 있다.
  • 임피던스 불일치
    • 객체 및 관계형 테이블에서 데이터 이동이 이루어진다.
    • 임피던스 불일치는 SQL과 프로그래밍 언어 사이에서 데이터 구조, 기능 등의 차이로 발생하는 충돌을 말한다.
  • ORM문으로 SQL 작업을 실행하기 때문에 무슨 일이 벌어지는지 추적하기 어려울 때가 있다.

Reference