[Django] ORM(Object-Relationship Mapping)

황인용·2020년 8월 28일
0

Django

목록 보기
8/13

ORM(Object-Relationship Mapping) 란

  • 프로젝트가 관계형 데이터베이스에 접근하기 위해서는 DB연결하는 라이브러리와 SQL(Structured Query Language)를 통해 접근가능.
  • Django의 ORM은 프로젝트의 객체(Object)와 관계형 데이터베이스를 연결해주는 역할을 한다.
  • Raw SQL없이도 데이터베이스의 데이터를 다룰 수 있음.
  • Model class를 사용하여 데이터베이스를 접근하고 데이터를 다룸.
  • Model class기반으로 데이터베이스를 Migrate를 한다.
  • 데이터에베이스에서 전달 받은 객체는 Queryset(쿼리셋)형태의 객체 목록이다.
# raw sql 방식
import mysql
connection = mysql.connect()
cursor = connection.cursor()
sql = 'SELECT * FROM USER WHERE city="SEOUL"'
cusor.execute(sql)
user = cursor.fetchall()
connection.close()

# ORM
from .models import User
user = User.objects.filter(city="SEOUL")

ORM의 장점

  • 많은 코드를 작성하지 않고 데이터베이스의 CRUD가 가능하여 프로젝트의 생산성이 좋아진다.
  • 선언문, 할당, 종료 같은 부수적인 코드가 줄어든다.
  • 데이터베이스에 대한 사소한 것들을 자동으로 처리해줘서 개발자가 신경쓰지 않아도 된다.
  • 유지보수도 편리하고 코드의 재사용성이 높아진다.

ORM의 단점

  • 해당 프로그래밍 언어의 ORM 라이브러리를 별도로 배워야한다.
  • 규모가 큰 프로젝트나 복잡한 프로젝트는 SQL로 작성하는게 좋다.
    (객체형태로 감싸여 있는 것보다 직관적인 SQL이 유지보수에 더 좋을 수 있다.)
  • 정확히 원리를 이해하지 않고도 쓸 수 있다보니 문제 대처능력이 떨어질 수 있다
    (e.g. queryset 결과가 inner join인지 left join인지 구별하기 힘든 경우가 있음)
  • SQL 구문을 추상화해서 구현했으니, 복잡한 쿼리는 오히려 비효율적으로 SQL 구문이 생성 및 실행될 수 있음
    (e.g. prefetch_related 경우 query가 두번 이상 실행될 수 있음)
profile
dev_pang의 pang.log

0개의 댓글