Django - lazyloading, caching

이주명·2021년 12월 19일
0

Django는 내가 sql문법을 몰라도 queryset을 사용하여 데이터베이스에서 필요한 데이터를 가져올수 있게 해준다.

하지만 queryset을 어떻게 사용함에 따라 서버에 부하가 결정된다.

lazzloading

기본적으로 queryset 한 줄의 코드를 작성하면 django는 데이터베이스에 접근해서 sql명령어를 날린다고 생각한다.

그림과 같이

queryset = Publisher.objects.all() 
queryset2 = Publisher.objects.filter...()

과 같이 queryset을 두번 작성했어도 결과 값의 number of queries 즉 데이터베이스에 query문을 날린 값은 0개이다.

django는 queryset을 바로 database에 접근 시키지 않고 query라는 함수에 저장시키고 queryset이 평가될 때, 즉 slicing, Iteration, repr(), len(), list(), bool() 선언 될때 그때 db호출을 한다.

이 방법을 lazyloading이라고 한다. queryset이 데이터를 직접 객체로 가져와 사용될때 db호출을 하게된다.

아무리 queryset을 작성했더라도 그 queryset이 평가되지 않았다면 db호출이 일어나지 않는다.

caching

다음 살펴볼 django의 orm최적화 기능은 caching 이다.

caching은 불러온 데이터를 캐시메모리에 저장하여 db호출을 여러번 하지 않도록 하는 역할을 한다.

queryset2 = Publisher.objects.filter...()

queryset2[0]
queryset2[0]
list(queryset2)

위와 같이 수행한다면 django는 데이터베이스를 총 3번 호출할 것이다.
위 의 순서를

list(queryset2)
queryset2[0]
queryset2[0]

이렇게 바꿈으로써 db호출을 한번으로 줄 일수 있다.
list를 한번에 불러와 cach에 저장하여 다음번에 queryset2[0]을 사용할때 db호출을 하지않고 cach에 저장된 데이터를 가져오는 형식이다.

이러한 방법을 인지하고 queryset 작성에 유의한다면 ORM 최적화에 많은 도움이 될 것이다.

profile
oh yeah

0개의 댓글