django-debug-toolbar로 ORM성능 측정하기 - 오름캠프
목차
- django-debug-toolbar
- django-debug-toolbar 설치 및 세팅하기
- django-debug-toolbar로 SQL 성능 측정하기
- Django Model db_index 사용하기
- 마무리
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.py
에INSTALLED_APPS
에 추가하기
INSTALLED_APPS = [
...
"debug_toolbar",
]
settings.py
에 있는MIDDLEWARE
에DebugToolbarMiddleware
추가하기
MIDDLEWARE = [
...
"debug_toolbar.middleware.DebugToolbarMiddleware",
]
settings.py
에INTERNAL_IPS
추가하기
INTERNAL_IPS = [
"127.0.0.1", # 로컬 호스트의 IP인 127.0.0.1을 추가하면 됩니다.
]
- 프로젝트의
urls.py
에debug_toolbar.urls
추가하기
...
from django.conf import settings
...
# 모듈 제일 하단에 선언합니다
# 개발 모드 일때만 필요하기 때문에 다음과 같이 선언합니다.
if settings.DEBUG:
import debug_toolbar
urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns
세팅을 완료하고 서버를 실행해보시면 아래 이미지와 같은 툴바가 생깁니다.
이미지에서 보시다시피 여러가지 기능이 있습니다. 한 번씩 눌러보면 각각이 무엇을 의미하고 어떤 것을 제공해주는지 금방 아실 수 있을 겁니다.
django-debug-toolbar로 SQL 성능 측정하기
위 이미지에 보면 SQL
툴 아래에 몇 개의 쿼리가 실행되고 시간을 얼마나 걸리는지 표시되는 걸 확인할 수 있습니다. 이걸 이용해서 SQL의 성능을 측정하고 개선하는데 도움을 줄 수 있습니다.
예제는 수업시간에 이용했던 도서 대여 시스템을 사용했습니다.
다음과 같이 도서 목록을 보는 ListView
가 있습니다. 테스트에 쓰이는 데이터는 model-bakery
를 이용해서 만들었습니다. 한 페이지에 5개씩 보여집니다.
최초에 데이터를 10개만 만들었습니다. 10개만 있을 때 속도는 아래와 같습니다.
이번에는 데이터를 11만개 정도 만들어 봤습니다.
엄청 느리다고 할 수는 없지만 처음보다 많이 느려졌습니다. 쿼리를 보니 order_by
에 title
이 사용되고 있습니다. 이미지엔 없지만 이 밖에도 author
와 publication_date
도 조회할 때 사용할 수 있습니다. 도서 목록이 삽입이나 업데이트가 많지는 않을 것 같습니다. 이런 상황에서 캐시를 사용해 볼 수도 있지만 SQL의 속도를 높이는 것이 목표이기 때문에 index를 걸어서 성능을 높여보겠습니다.
Django Model db_index 사용하기
조회할 때 단일 컬럼만 쓰이고 있기 때문에 단일 컬럼 인덱스를 걸어보겠습니다. ModelField
에 db_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)
모델 변경이 끝나면 makemigrations
와 migrate
를 실행해주어야 합니다.
인덱스 설정이 끝나고 위 예제의 ListView
를 다시 실행해 보았더니 django-debug-toolbar
다음과 같은 결과를 주었습니다.
데이터가 10개 있을 때와 비슷한 속도로 개선되었음을 확인할 수 있습니다.
마무리
이번 포스팅에서 django-debug-toolbar
를 알아보고 그것을 이용해서 SQL의 성능을 개선해보는 작업을 해보았습니다. 예전에 신입 면접에서도 ORM관련된 질문과 DB 인덱스 관련 질문을 종종 받았는데요. 그만큼 중요하지만 혼자 공부하거나 부트캠프에서 공부할 때 많은 데이터를 많이 다뤄보지 않기 때문에 이런 고민을 해보지 않은 경우가 많은 것 같습니다. 이런 고민도 해봐야 한 다는 것을 알려드리기 위해 django-debug-toolbar
를 이용해서 성능을 측정하고 SQL속도를 개선해보는 작업을 해봤습니다. 저도 갈 길이 멀지만 함께 Django와 백엔드 공부를 시작하신 모든 분들 함께 성장해나갔으면 좋겠습니다.