Django ORM이란?
ORM(Object-Relation Mapping)란, 객체(Object)와 관계형 데이터베이스(Relational)을 연결(Mapping)해 주는 것을 의미한다. 간단하게 설명하면 데이터베이스의 테이블을 객체(Object)와 연결하여 테이블에 CRUD를 할 때, SQL 쿼리를 사용하지 않고도, 가능하게 하는 것을 말합니다.
QuerySet을 통해 알아보는 ORM의 특징
Lazy Loading : 쿼리셋을 선언할 때는 쿼리셋 자체로만 존재한다. 실제 SQL이 실행되는 시점은, 그 쿼리셋이 사용되었을 때이다. 당장 필요하지 않으면 호출을 지연하는 특성. 꼭 필요한 시점에만 필요한 만큼 SQL이 호출된다. 재사용하지 못함으로, 불필요한 쿼리가 더 호출될 수 있다.
Caching : QuerySet 캐싱을 재사용할 수 있음. 모든 user를 먼저 캐싱해두고, 필요한 특정 유저 정보를 가져올 때 앞의 변수를 활용하면 추가 쿼리를 호출하지 않는다.
Eager Loading(즉시로딩, N+1 Problem) : for문이 돌때마다 쿼리를 계속 돌린다. user가 100명 있으면 for문으로 userinfo를 얻기 위해서는 총 100+1번 쿼리가 호출되는 현상.
Select_related 란?
OneToOne 관계 / OneToMany 관계에서 M(Many)이 사용할 수 있다.
또한 Sql 기능 중 하나인 join기능을 활용할 수 있게 도와주는 QuerySet이라 할 수 있는데
Sql Query 문의 Join 과 Foreign_key(OTO, OTM) 사용하여 정참조 할 시 DB에 접근하여 QuerySet을 가져올때 미리 related objects 까지 불러오는 메서드이다.
비록 Query가 복잡해지지만 한번 DB에 접근하여 불러온 Data는 database 서버가 종료되기 전까지 Cache에 남아 있어
매 Query 마라 DB에 접근하지 않아도 된다
즉, Select_related를 사용함으로서 DB 접근 빈도를 줄여 자원 낭비를 줄일 수 있다. (불필요한 접근 및 부하)
Prefetch_related 란?
Select_related 의 범위에서 더 나아가 ManyToMany 등 대부분 모든 관계에서 사용 할 수 있다.
OneToMany 관계에서 O(One)이 사용 할 수 있다.
Select_related와 마찬가지로 related objects를 함께 불러오는 메서드이다. 동일하게 Cache에 남아있게 하여 DB에 불필요한 접근을 줄여준다.
Select_related 와 Prefetch_related 차이
정참조, 역참조의 차이도 있지만 실제 Join 을 어디서 하냐의 차이가 있다.
select_related 같은경우 DB에서 Join 을 한 채로 가져오고,
prefetch 는 가져와서 Python 으로 Join 을 하게 된다.
정말 간단하게는 Select는 DB에서 join 기능을 수행한 후 가져오므로 1 Query가 실행된다면
Prefetch는 python에서 join 기능을 수행하므로 불러올때 1 Query를 실행하고 불러온 후 1 Query를 한번더 실행한다.
즉, 가급적 Select_related를 사용하는것이 효율적이라 할 수 있겠다