본문 바로가기

문돌이 존버/Django 스터디

장고(Django) debug toolbar 설치 및 SQL 쿼리문 확인

반응형
본 글은 Holix의 "리액트와 함께 장고 시작하기 Complete" 강의를 듣고 작성한 일지입니다.

이번 시간엔 저희가 작성한 QuerySet 로직이 SQL 쿼리문 관점에서 잘 작동하고 있는지, 중복된 쿼리문을 날리고 있진 않은지 확인할 수 있는 기능을 소개하려고 합니다.

공식 문서에도 잘 나와있으니 직접 보면서 따라하고 싶으신 분은 홈페이지를 방문하시면 되겠습니다.

pip install django-debug-toolbar

이 역시 써드 파티(Third party) 앱이기 때문에 settings.py 파일에서 INSTALLED_APPS 에 추가해줍니다.

# settings.py
INSTALLED_APPS = [
    # django apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # third apps
    'django_extensions',
    'debug_toolbar',
    # local apps
    'blog1',
]


MIDDLEWARE = [
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    ...
]

INTERNAL_IPS = ['127.0.0.1']
# project의 urls.py
if settings.DEBUG: # 개발 모드일 때만
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

    import debug_toolbar
    urlpatterns += [
        path('__debug__/', include(debug_toolbar.urls)),
    ]

이때 저희가 작성한 html 파일에 <body> 태그가 빠져있다면 django-debug-toolbar 가 제대로 작동하지 않는다고 하네요. 로컬호스트에 접속해서 웹 페이지 소스를 보시면 django-debug-toolbar 와 관련된 내용이 주입되어 있습니다. 이렇게 주입될 때 디폴트 주입 타겟이 <body> 태그이기 때문에 없으면 문제가 발생하는 것입니다.

이런 써드 파티 앱을 사용하지 않고 코드로 SQL 쿼리문을 확인하는 방법도 있습니다.

print(Post.objects.all().query)

그리고 settings.DEBUG = True 일 경우 쿼리 실행내역이 메모리에 누적됩니다.

from django.db import connection, connections
for row_dict in connection.queries:
    print('{time} {sql}'.format(**row_dict))

connections['default'].queries

하지만 장고를 통해 실제 서비스를 배포할 때는 settings.DEBUG = False 로 하는 것이 좋습니다. 서비스가 계속 이뤄지면서 장고는 restart 하지 않는데, 이는 쿼리 실행내역이 메모리에 계속 누적됨을 의미하겠죠. 메모리 과부하가 걸리면 서비스의 원활한 배포가 힘들어질 것입니다.

728x90
반응형