지난 글에 ORM을 사용하는 이유에 대해 정리를 해보았다. 이번에는 이어서 생각했던 것에 대한 2번째 정리시간이다.
ORM을 쓰는 이유
데이터베이스의 접근을 줄이는 방법
Django를 좀 더 활용하는 법
바로 "데이터베이스의 접근을 줄이는 방법"에 대한 생각이다.
시리즈와 가장 알맞는 고민이였던 같다. 가장 기본적인 DB hit수를 줄여 최적화 시키는 방법에 대해 고민을 해봤다.
정말 단순하게 생각을 해서 Queryset 사용횟수를 최소화하기로 했다. 아래와 같다.
# 이전
"sns": [sns.id for sns in Sns.objects.filter(maker_id=maker.id)],
# 이후
"sns": list(maker.sns_set.values_list("address", flat=True)),
이와 같이 반복문을 통해 모든 결과값마다 DB를 Hit시키는 방법을 values() 혹은 values_list()를 통해 한번에 값들만 가져 나올 수 있게 진행하리라 생각했다. 하지만 착각한 것이 있었다.
훨씬 더 전에 코드를 작성할 때 썻던 append()와 list comprehension과의 차이를 간과하고 있었다. for loop를 돌리면서 append를 하면 루프가 돌 때마다 DB hit이 이뤄지는 것이 맞지만 list comprehension은 그렇지 않았다.
하지만 덕분에 의외의 것들을 찾아내었다.
Python list() vs list comprehension building speed
내용을 정리하자면 list comprehension은 일반 루프와 마찬가지로 Python bytecode로 루프를 실행한다.
반면, list()은 C code로만 반복되며, 훨씬 더 빠르다.
또한 마찬가지로 데이터베이스 접근을 줄이는 방법에 대해 찾았지만 세번째 주제와 공통적인 부분으로 다음 글에서 정리하려한다. 앞으로 개발을 하면서 가장 크게 작용할 부분이라 생각이든다. 또한 앞의 글들은 사실 다음 글을 위한 빌드라고 생각해도 무방할정도로 중요한 내용일 것이다.
너무 간단하게 생각했던것 같다..
list() 메소드와 list comprehension을 비교한다는 것은 좋았으나 내부의 쿼리가 일치하지 않다는 것을 알아버렸다. 그렇기 때문에 코드 수정한것만 가지고 list() 와 list comprehension을 비교하는 것은 옳지 않다는 것을 알았다.. 단순히 결과 값이 잘 나왔을 뿐..
또한 글 제목과 내용이 일치하지 않아서 어떻게 할지 고민중이다. ㅠㅠ 일단 제목은 바꿀 것이다.
또한 시리즈에서 제외했다..!