반응형
본 글은 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
반응형
'문돌이 존버 > Django 스터디' 카테고리의 다른 글
장고(Django), 관계를 표현하는 모델 필드(OneToOneField) (0) | 2021.08.14 |
---|---|
장고(Django) 관계(relationship)를 표현하는 모델 필드, ForeignKey (0) | 2021.08.07 |
장고(Django) Queryset을 통한 검색 구현 및 정렬(sorting) (0) | 2021.08.07 |
장고(Django) 모델을 통한 조회(기초) (0) | 2021.08.07 |
장고(Django) media 파일 다루기 (0) | 2021.08.06 |