사전 학습 내용
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 문으로 서칭하게 됨.
참고 링크
'Python > Django' 카테고리의 다른 글
[Django] Query Profiling Tool (2) - Custom Decorator & Logger (0) | 2022.08.12 |
---|---|
[Django] Queryset 최적화 기법 (select, prefetch, F, Indexing 등) (0) | 2022.08.11 |
[Django] django-dotenv 설정 (0) | 2022.08.08 |
[Django] 채팅 시스템 (3) UUID가 포함된 URL을 Channels Websocket이 수신하는 법 (0) | 2022.07.22 |
[Django] Timezone 한국 시간으로 설정하기 (0) | 2022.07.17 |