택시짱의 개발 노트

ORM (Object-Relational Mapping)이란 본문

Django(장고)

ORM (Object-Relational Mapping)이란

택시짱 2020. 11. 16. 21:46

ORM (Object-Relational Mapping)

  • ORM 이란?
  • ORM은 Object Relational Mapping 즉, 객체-관계 매핑의 줄임말 이다. 객체-관계 매핑을 풀어서 설명 하자면 우리가 OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB(Relational DataBase)에서 쓰이는 데이터인 테이블을 자동으로 매핑(연결)하는 것을 의미한다. 그러나 클래스와 테이블은 서로가 기존부터 호환가능성을 두고 만들어진 것이 아니기 때문에 불일치가 발생하는데, 이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다. 따라서 ORM을 이용하면 따로 SQL문을 짤 필요없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있게 된다.

ORM의 장단점

장점
  • 완벽한 객체지향적인 코드
  • ORM을 이용하면 SQL문이 아닌 클래스의 메서드를 통해 데이터베이스를 조작할 수 있어, 개발자가 객체 모델만 이용해서 프로그래밍을 하는데 집중할 수 있게한다. SQL 문을 사용하면서 같이 필요한 선언문, 할당, 종료 같은 부수적인 코드가 사라지거나 줄어들며, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높일 수 있다. 객체지향적 접근과 SQL의 절차적/ 순차적 접근이 혼재되어있던 기존 방식과 달리 오직 객체지향적 접근만 고려하면 되기때문에 생산성이 증가한다.
  • 재사용, 유지보수, 리팩토링 용이성
  • ORM은 기존 객체와 독립적으로 작성되어있고, 객체로 작성되었기 때문에 재활용할 수 있다. 또한, 매핑하는 정보가 명확하기 때문에 ERD를 보는 의존도를 낮출 수 있다.
  • DBMS(DataBase Management System) 종속성 하락
  • 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하고, 객체의 자료형 타입까지 사용할 수 있기 때문에 RDBMS의 데이터 구조와 객체지향 모델 사이의 간격을 좁힐 수 있다. 객체에만 집중할 수 있기 때문에 DBMS를 교체하는 큰 작업에도 리스크가 적도 드는 시간도 줄어든다.
단점
  • ORM이 모든 걸 해결해줄 수 없다.
  • ORM을 사용하는 것은 매우 편리하지만 그만큼 신중하게 설계해야한다. 프로젝트의 복잡성이 커질 수록 난이도도 올라가고 부족한 설계로 잘못 구현되었을 경우 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있다. 또한 일부 자주 사용되는 대형 SQL문은 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있다.

Lazy Loading

  • Lazy Loading 이란?
    • Django ORM은 Lazy-Loading 방식이다. Lazy-Loading 방식을 사용하면 ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는것이 아니라 모든 명령 처리가 끝나고 실제로 데이터를 불러와야 할 시점이 왔을 때 데이터베이스에 쿼리를 실행하는 방식이다.

N + 1 문제

  • N + 1 문제란 ?

    • N+1 Problem은 쿼리 1번으로 N건의 데이터를 가지고 왔는데, 원하는 데이터를 얻기 위해 이 N건의 데이터를 데이터 수 만큼 반복해서 2차적으로 쿼리를 수행하는 문제
  • django-debug-toolbar를 이용하여 SQL 쿼리 확인

 


 

해결 방안

  • Eager Loding을 사용

Eager Loading

  • Eager Loading 이란?

    • Eager Loading은 Lazy Loading의 반대 개념으로 사전에 쓸 데이터를 포함하여 쿼리를 날리기 때문에 비효율적으로 늘어나는 쿼리 요청을 사전에 방지할 수 있습니다.
    • prefetch_related : 복잡한 관계를 가지고 있는 테이블간에 사용할 수 있는 메서드이다. 하나의 row에 대해 관계가 이루어진 여러개의 row들이 존재할 때 (many=True 옵션이 적용되는 경우) 사용될 수 있습니다. 이 메서드가 쿼리로 치환될 때 WHERE ... IN 구문으로 치환 된다.
    • select_related : 가장 간단하게 Eager Loading을 구현할 수 있는 메서드이다. 이 메서드를 사용하면 쿼리상으로는 SQL Join을 수행하게 된다.
  • django-debug-toolbar를 이용하여 SQL 쿼리 확인

 

반응형
Comments