django-debug-toolbar로 ORM성능 측정하기 - 오름캠프

프로필 사진mingke

django-debug-toolbar-sql-feature

목차

django-debug-toolbar

지금 오름캠프는 Django 개인프로젝트 기간입니다. 그래서 이번 포스팅에서 개발할 때 사용하면 유용한 django-debug-toolbar 에 대해서 알아보려고 합니다. django-debug-toolbar 써드 파티 라이브러리지만 Django 공식 문서에서 소개될 정도로 아주 널리쓰이는 툴입니다. 이름에서 유추할 수 있듯 bar 형태로 여러가지 툴을 제공합니다. django-debug-toolbar 가 제공하는 SQL 성능 측정 기능을 이용해서 개선작업을 해보는 예제를 살펴보는 것도 해보겠습니다.

django-debug-toolbar 설치 및 세팅하기

django-debug-toolbar 설치 및 세팅은 간단하게 할 수 있습니다.

  • 설치
pip install django-debug-toolbar

세팅은 다음과 같은 순서로 진행하면 됩니다.

  • settings.pyINSTALLED_APPS에 추가하기
INSTALLED_APPS = [
    ...
    "debug_toolbar",
]
  • settings.py 에 있는 MIDDLEWAREDebugToolbarMiddleware 추가하기
MIDDLEWARE = [
    ...
    "debug_toolbar.middleware.DebugToolbarMiddleware",
]
  • settings.pyINTERNAL_IPS 추가하기
INTERNAL_IPS = [
    "127.0.0.1", # 로컬 호스트의 IP인 127.0.0.1을 추가하면 됩니다.
]
  • 프로젝트의 urls.pydebug_toolbar.urls 추가하기
...
from django.conf import settings
...
 
# 모듈 제일 하단에 선언합니다
# 개발 모드 일때만 필요하기 때문에 다음과 같이 선언합니다.
if settings.DEBUG:
    import debug_toolbar
 
    urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns

세팅을 완료하고 서버를 실행해보시면 아래 이미지와 같은 툴바가 생깁니다.

django-debug-toolbar-image

이미지에서 보시다시피 여러가지 기능이 있습니다. 한 번씩 눌러보면 각각이 무엇을 의미하고 어떤 것을 제공해주는지 금방 아실 수 있을 겁니다.

django-debug-toolbar로 SQL 성능 측정하기

위 이미지에 보면 SQL 툴 아래에 몇 개의 쿼리가 실행되고 시간을 얼마나 걸리는지 표시되는 걸 확인할 수 있습니다. 이걸 이용해서 SQL의 성능을 측정하고 개선하는데 도움을 줄 수 있습니다.

예제는 수업시간에 이용했던 도서 대여 시스템을 사용했습니다.

다음과 같이 도서 목록을 보는 ListView 가 있습니다. 테스트에 쓰이는 데이터는 model-bakery를 이용해서 만들었습니다. 한 페이지에 5개씩 보여집니다.

django-debug-toolbar-example-view

최초에 데이터를 10개만 만들었습니다. 10개만 있을 때 속도는 아래와 같습니다.

django-debug-toolbar-sql-feature-smalldata-example

이번에는 데이터를 11만개 정도 만들어 봤습니다.

django-debug-toolbar-sql-feature-moredata-example

엄청 느리다고 할 수는 없지만 처음보다 많이 느려졌습니다. 쿼리를 보니 order_bytitle이 사용되고 있습니다. 이미지엔 없지만 이 밖에도 authorpublication_date도 조회할 때 사용할 수 있습니다. 도서 목록이 삽입이나 업데이트가 많지는 않을 것 같습니다. 이런 상황에서 캐시를 사용해 볼 수도 있지만 SQL의 속도를 높이는 것이 목표이기 때문에 index를 걸어서 성능을 높여보겠습니다.

Django Model db_index 사용하기

조회할 때 단일 컬럼만 쓰이고 있기 때문에 단일 컬럼 인덱스를 걸어보겠습니다. ModelFielddb_index라는 파라미터를 True로 설정하면 끝입니다. 아래와 같이 모델을 변경했습니다.

class Book(models.Model):
    title = models.CharField(max_length=100, verbose_name="제목", db_index=True)
    author = models.CharField(max_length=100, verbose_name="저자", db_index=True)
    publication_date = models.DateField(verbose_name="출판일", db_index=True)
    genre = models.CharField(max_length=100, verbose_name="장르")
    summary = models.TextField(verbose_name="요약")
    image = models.ImageField(upload_to="book_images/", blank=True, null=True)

모델 변경이 끝나면 makemigrationsmigrate를 실행해주어야 합니다.

인덱스 설정이 끝나고 위 예제의 ListView 를 다시 실행해 보았더니 django-debug-toolbar 다음과 같은 결과를 주었습니다.

django-debug-toolbar-sql-feature-data-index-example

데이터가 10개 있을 때와 비슷한 속도로 개선되었음을 확인할 수 있습니다.

마무리

이번 포스팅에서 django-debug-toolbar 를 알아보고 그것을 이용해서 SQL의 성능을 개선해보는 작업을 해보았습니다. 예전에 신입 면접에서도 ORM관련된 질문과 DB 인덱스 관련 질문을 종종 받았는데요. 그만큼 중요하지만 혼자 공부하거나 부트캠프에서 공부할 때 많은 데이터를 많이 다뤄보지 않기 때문에 이런 고민을 해보지 않은 경우가 많은 것 같습니다. 이런 고민도 해봐야 한 다는 것을 알려드리기 위해 django-debug-toolbar 를 이용해서 성능을 측정하고 SQL속도를 개선해보는 작업을 해봤습니다. 저도 갈 길이 멀지만 함께 Django와 백엔드 공부를 시작하신 모든 분들 함께 성장해나갔으면 좋겠습니다.

Loading...
Loading...
Loading...
Loading...