Django cache framework - 속도 성능을 위한 캐시 방법

장고가 느리다는 평가가 많은데, 서비스가 커질 수록 성능에 목숨을 많이 거는 것은 맞다. 이 대단한 Django가 그냥 쳐다보고 있지는 않을 것 같다. 여러가지 cache 기법을 사용해서 속도나 성능을 키워보자.

 

현재 듣고 있는 장고 강의에 소스에 포함된 내용을 공부할 겸 추려본다 - Django 실전 프로젝트 1 - URL Shortener 서비스 ( 패스트캠퍼스 )

 

아래 공식 사이트에서는 여러가지 방법이 소개가 되어 있다. 

https://docs.djangoproject.com/en/3.2/topics/cache/

 

Django’s cache framework | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

- 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 미들웨어를 활용하자

 

성능 파워 업

Monstera 님의 사진, 출처: Pexels