Django를 좀 한다 그러면 이 둘의 개념은 필수적으로 알아야 한다. (그래야 밥벌어 먹고 살 수 있엉..)
기본 개념을 숙지하고 반복해서 실무에 적용할 수 있도록 하여 내 것으로 만들어야겠다!
사용하는 이유?
- QuerySet은 기본적으로 Lazy Loading(지연 로딩) 방식을 선택한다.
- 하지만 SQL로 한번에 많은 양의 데이터를 가지고오고 싶을 때가 있으며 그럴때 위의 메소드들를 사용한다.
- 즉, 관계가 있는 object를 Eager Loading(즉시 로딩) 하기 위해서 사용한다.
이 둘의 차이점?
- 1:1, 1:N, N:M의 관계중에 따라 달리 사용되어진다.
- 우선 가장 큰 차이점으로는 추가 쿼리가 발생하는지 안하는지이다.
1. select_related
- select의 경우 1:1의 관계 또는 1:N의 관계에서 N의 입장에서 사용하며 추가 쿼리가 발생하지 않는다.
- SQL에서의 JOIN과 같은 기능을 한다.
- 정방향 참조를 하며 정보를 미리(Eager Loading) 불러온다.
- on_delete=models.CASCADE 옵션이라면 INNER JOIN으로 수행
2. prefetch_related
- 추가 쿼리가 발생한다.
- 위의 경우와는 반대로 1:N의 관계에서 1의 입장에서 사용할 수 있고, M:N의 관계에서 사용할 수 있다.
- 역방향 참조에 유리하게 사용되어진다.
- 필드값으로 N개를 줄 경우 각 필드값에 대한 N개의 추가 쿼리가 발생하게 된다.
- 추가 쿼리는 *파이썬 단계에서 JOIN*을 통해 결과를 만들어 낸다
정리하자면
- 성능면에서 한번에 많은 데이터를 미리 가져오는것이 유리할 수도 있고, 때로는 작은 양의 데이터를 여러번 가져오는 것이 유리할 수도 있다. 따라서 적절한 상황에 맞게 사용하도록 하자.
'🌈 프로그래밍 > Django' 카테고리의 다른 글
unmanaged table에 대한 django test 하는 방법 (0) | 2023.09.23 |
---|---|
djongo를 설치하는 과정에서 발견한 오류들 (0) | 2023.09.17 |
Django Session Cookie Age 알아보고 커스텀하기 (0) | 2023.02.20 |
[ django ] AWS lambda raw sql 에서 django raw sql로 TypeError: not enough arguments for format string 에러 (2) | 2022.11.30 |
[ Django ORM ] 문자열 숫자를 int로 캐스팅해서 정렬해보자. (0) | 2022.11.24 |