장고가 느리다는 평가가 많은데, 서비스가 커질 수록 성능에 목숨을 많이 거는 것은 맞다. 이 대단한 Django가 그냥 쳐다보고 있지는 않을 것 같다. 여러가지 cache 기법을 사용해서 속도나 성능을 키워보자.
현재 듣고 있는 장고 강의에 소스에 포함된 내용을 공부할 겸 추려본다 - Django 실전 프로젝트 1 - URL Shortener 서비스 ( 패스트캠퍼스 )
아래 공식 사이트에서는 여러가지 방법이 소개가 되어 있다.
https://docs.djangoproject.com/en/3.2/topics/cache/
- Memcached
- Database caching
- Filesystem caching
- Local-memory caching
- ...
강의를 듣는 영상에서는 아래 4가지 방법을 소개해 주었다.
The per-site cache
사이트를 통째로 캐시하는 엄청난 기법, 영 좋은 방법은 아닌 듯하다.
파일이 자꾸 생성되면 전체 사이트를 캐시하는 듯 하다.
특정 부분은 캐시가 되지 않도록 하는 기법이 필요할 듯 한데 이를 위해서
never_cache 라는 데코레이터 예약어가 존재한다.
from django.views.decorators.cache
never_cache(view_func)
max-age=0, no-cache, no-store, must-revalidate, private header to a response to indicate that a page should never be cached.
The per-view cache
View 단위로 캐시하기, per-site cache 와 더불어 이 캐시 기법은 잘 사용하지 않는다고 한다.
캐시를 하려는 view에 아래 데코레이터를 추가하면 된다.
@cache_page 여기에 적힌 시간 만큼 cache 하도록 되어 있어 F5 refresh를 해 줘도 페이지가 변경되지 않는 것 처럼 보이는 것으로 확인해 볼 수 있다.
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
...
Specifying per-view cache in the URLconf - URLconf 부분에서 따로 정의해 줄 수도 있다.
from django.views.decorators.cache import cache_page
urlpatterns = [
path('foo/<int:code>/', cache_page(60 * 15)(my_view)),
]
Template fragment caching
템플릿 프레임워크를 제공하고 있으니깐 간단한 템플릿 페이지 일부분을 캐시 할 수 있는 기능이다. 쓰는 방법은 아래와 같다.
{% load cache %}
{% cache 500 sidebar %}
.. sidebar ..
{% endcache %}
Query cache
가장 많이 쓸 가능성이 높은 캐시 기법으로 보인다. 공식 매뉴얼에서는 The low-level cache API의 일부분으로 설명되어 있다. 먼저 cache 라이브러리를 import 한다.
from django.core.cache import cache
기본 사용법은 아래와 같다.
The basic interface is:cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None)¶
>>> cache.set('my_key', 'hello, world!', 30)
cache.get(key, default=None, version=None)¶
get_cache = cache.get('my_key')
if not get_cache:
cache.set('my_key','hello', 30)
else:
print(get_cache)
사용법은 위의 get 예제 처럼 있는지 보고, 없으면 캐시 한다. 여기서 나오는 시간은 초 단위이다.
Django 성능 올리는 방법
성능올리기는 단순한 캐시 기법를 탈피해서 아래와 같이 시도해 보자.
- 비동기 작업 실시
- 템플릿 태그 안에서 rest api 호출 같은 것을 하지 말자. 끝날때 까지 렌더링 하지 않는다.
- FE 기술을 쓰자. 장고에서 다 해결하지 말자.
- 장고 compressor 를 사용하자. static 파일과 html 압축해 준다.
- Gzip 미들웨어를 활용하자