🌈 프로그래밍/Django

[ Django ] select_related()와 prefetch_related()

반응형

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*을 통해 결과를 만들어 낸다

 

정리하자면

- 성능면에서 한번에 많은 데이터를 미리 가져오는것이 유리할 수도 있고, 때로는 작은 양의 데이터를 여러번 가져오는 것이 유리할 수도 있다. 따라서 적절한 상황에 맞게 사용하도록 하자.

반응형