Python/Django

[Django] ORM Queryset 특징

yubi5050 2022. 8. 8. 23:01

사전 학습 내용

https://yubi5050.tistory.com/60 // ORM 이란?

https://yubi5050.tistory.com/83 // ORM Queryset API 

 

QuerySet 특징 1 . LazyLoading (지연 로딩)

정말 필요한 시점에 데이터를 로드 진행

  • 반복(Iteration), 슬라이싱 (Slicing)
  • 피클링 / 캐싱 (Pickling/Caching)
  • repr(), len(), list(), bool()

 

 

정말 필요한 만큼만 로드 진행함

 

 

위의 문제는 N+1 Problem 과 같은 문제 발생 

 

QuerySet 특징 2. Caching 

기존에 호출했던 Query 결과에 대해 cache를 가지고 있음

QuerySet의 캐싱을 통해 Query 문이 덜 호출되도록 하는 것이 중요

 

 

QuerySet 특징 3. Eager Loading (from N+1 Problem)

상황 : 1: N의 관계를 가진 User와 Project를 예시로 볼 때 모든 User의 Project를 호출 하고 싶은 상황

Queryset은 user의 project가 호출 될 때 마다 새로운 Query문을 호출함 (ORM은 Lazy 하기 때문에 필요하기 전까지 데이터를 가져오지 않은 상태)

따라서 User 1번 + Project N번 => N+1 Problem 발생

Django models는 prefetch_related()와 select_related() 와 같은 사전 로딩 하는 함수를 지원

 

 

또 다른 case

  • Foreign or ManyToMany 관계시 Serializer 과정에서 발생
  • Serializer는 foreign key (or manytomany)에 해당하는 테이블을 각 요소마다 다시 select 문으로 서칭하게 됨.

 

참고 링크