Django 프로젝트를 진행하다보면 Query를 ORM으로 해서 작성하게 됩니다. 이때 현재 작성 중인 ORM이 효율적으로 작성되어있는지 중복, 비슷한 내용이 계속 발생하지 않는지 확인할 수 있는 툴과 방법에 대해서 소개하려고 합니다.
DEBUG=True 일때 해당 옵션을 통해 shell 상에서 발생하는 쿼리에 대해서 확인가능합니다.
python manage.py shell_plus --ipython --print-sql
로컬 환경에서 테스트 일시 Debug=True (개발환경)에서 사용하게 설정되어 있고, django에서만 사용가능하며, 현재 서버와 클라이언트 간의 request, response 등 다양한 정보를 브라우저에서 쉽게 확인할 수 있는 툴. header, sql, static, cache 여러 정보를 확인 할 수 있습니다. 주로 조회하는 내용의 API를 작성시에 유용하게 사용할 수 있습니다.
# settings.py
INSTALLED_APPS = [
'django.contrib.staticfiles',
'debug_toolbar',
]
MIDDLEWARE = [
'debug_toolbar.middleware.DebugToolbarMiddleware',
]
# project/urls.py
if settings.DEBUG:
import debug_toolbar
urlpatterns += [
path('__debug__/', include(debug_toolbar.urls)),
]
SQL을 클릭하여 현재 API에서 호출되고 있는 Query들을 확인 가능합니다.
예상하지 못하는 문제가 생길 때 바로 확인하기 어렵다. 프로덕션일 경우에는 더욱 어렵다. django에서 기본 제공해주고 있어서 커스텀하게 바꿔서 알람 혹은 기록을 남기기 위해 사용한다.
여기서 설명할 logging의 내용은 API 개발 시 작성한 View에서 어떠한 Query를 호출하고 있는지 파악하기 위한 용도. 아래의 코드를 setting 파일에 추가하여 호출되고 있는 Query를 확인해볼 수 있다.
LOGGING = {
'version': 1,
'formatters': {
'default': {
'format': '[%(asctime)s] %(levelname)s [%(filename)s:%(funcName)s:\
%(lineno)s] %(message)s',
'datefmt': '%d/%b/%Y %H:%M:%S'
},
},
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
}
},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
}
}
다양한 툴과 방법으로 불필요한 Query를 수정 및 제거 함으로써 비용도 절감하고 작성한 프로젝트의 퍼포먼스를 향상할 수 있게 됩니다.