장고 ORM 과 최적화 기법

ORM, 장고 ORM, N+1 문제, Eager Loading

SoniaComp
3 min readOct 17, 2022

--

ORM

데이터베이스 시스템을 직접 다루지 않고도 데이터베이스를 활용할 수 있도록 하는 편리하고 강력한 인터페이스

  • 간단한 것을 쉽게, 어려운 것을 가능하게 해줌
    => ORM객체와 관계형 데이터베이스의 데이터를 매핑해주는 것
    => 데이터베이스객체지향 프로그래밍 언어간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법
  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것
  • DB와 어플리케이션의 특징 [ 특히 데이터를 다루는 인터페이스 ]의 차이
  • 객체 간의 관계를 바탕으로 SQL을 자동으로 생성

장점

  • DB와의 매핑 부분에 더 이상 신경쓰지 않기 때문에, 개발자가 객체 모델로 프로래밍을 하는 데 집중할 수 있습니다.
  • 코드의 가독성도 더 좋다
  • 하나의 ORM 으로 MySQL, postgreSQL에 연결할 수 있으므로, DBMS에 대한 종속성도 줄어듭니다.

단점

  • 자동으로 생성되는 쿼리 때문에 직접 SQL을 사용하는 것보다 복잡할 수 있다.

객체와 RDBMS 의 차이점

  • 세분성: 경우에 따라서는 데이터베이스에 있는 테이블 수 보다 더 많은 클래스를 가진 모델이 생길 수 있다.
  • 상속성: RDBMS는 상속 개념이 없다.
  • 일치: RDBMS 는 Primary Key를 이용하여 동일성을 정의하지만, 객체지향 언어는 객체 식별과 객체 동일성을 모두 지원한다. => 객체 식별: 값이 같아도 주소값이 다름 => 객체 동일성
  • 연관성: 객체지향 언어는 방향성이 있는 객체의 참고를 사용하여 연관성을 나타내지만 RDBMS는 방향성이 없는 외래키를 이용해서 나타낸다. 객체지향 언어는 쌍방향 참조시 각 객체가 서로를 참조할 변수를 지녀야 한다.
  • 탐색: 객체지향 언어의 경우 객체간의 연결을 통해서 이동하며 탐색 및 순회하지만, RDBMS에서는 일반적으로 SQL문을 최소화하고 쿼리를 최적화하여 Join을 통해 여러 entity를 로드하고 탐색 및 선택한다.

Django ORM

  • 장고는 모델을 사용하여 데이터를 정의.
  • 모델의 각 속성은 DB의 필드
  • 모델 클래스는 DB에 접근할 수 있는 API를 제공

ORM 쿼리 최적화

  • Lazy-Loading: ORM 에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아님 => 모든 명령 처리가 끝나고 실제로 데이터를 불러와야할 시점이 왔을 때 데이터베이스에서 쿼리
  • N+1 Problem: 쿼리 1번으로 N건의 데이터를 가져왔는데, 원하는 데이터를 얻기 위해 이 N건의 데이터를 데이터 수만큼 반복해서 2차적으로 쿼리를 수행하는 문제
    - for 문 => 한번의 호출로 N개의 모델을 가져오고, for loop 를 돌면서, 데이터를 불러와야되는 시점에 1개의 row를 가져오는 쿼리가 실행되는 것을 확인
  • EagerLoading 방식: 사전에 쓸 데이터를 포함하여 쿼리를 날리기 때문에 비효율적으로 늘어나는 쿼리 요청을 방지
    -
    selected_related: foreign-key, one-to-one 처럼 single-valued relationships 에서만 사용이 가능하다. SQL의 JOIN을 사용하는 방법
    => 참조하는 대상이 중간 테이블이 아닐시, 쿼리문에서 JOIN을 이용해서 data를 불러들입니다. 두 테이블간 JOIN을 할 수 있는 구조에서 사용 => JOIN을 이용해서 불러들이기 때문에, 쿼리문은 1번 실행 => 중간 테이블을 이용해서 관계를 형성하는 many-to-many모델에서는 사용할 수 없다.
    - prefetch_related: foreign-key, one-to-one 뿐만 아니라 many-to-many, many-to-one 등 모든 relationships 에서 사용 가능하다. SQL의 WHERE … IN 구문을 사용하는 방법

--

--

SoniaComp

Data Engineer interested in constructing Data-Driven Architecture with Cloud Service (https://www.linkedin.com/in/sonia-comp/)