2023.06.01
배포 강의를 다 듣고나니, 이제는 모두가 배포를 할 수 있겠구나 싶었다. 또 이전 보다도 더 쉽게 이해가 되는 것을 보니 나도 예전보다는 배포에 많이 익숙해졌다고 느껴졌다. 동시에 다음에는 더 추가적으로 할 수 있는 게 무엇이 있을까 생각하게 되었다. 그냥 이전에 했던대로 해야지~ 라고 생각하면서 했었을 때는 항상 프로젝트에서 의욕이 영 없었기에, 공부거리를 찾아보기로 했다.
캐시는 자주 열람하거나 혹은 불러오는데 오래걸리는 데이터를 임시적으로 저장했다가 열람시마다 불러오는 기능이다. 다만 이전에도 겪은 적이 있지만 이미 저장된 캐시로 인하여 최신화된 데이터를 불러오지 않는 경우, 데이터 일관성 문제를 겪기도 하기에 자주 수정이 일어나는 데이터에 대해서는 지양하는 게 좋다고 한다. 따라서 캐시를 적용하면 좋은 데이터는 자주 수정되지 않으면서 열람은 자주되고, 또한 용량 크거나 연산이 복잡하여 불러오는 것이 오래걸리는 경우다.
pip install django-redis
#settings.py
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://<redis 주소>:6379/1', #보통 로컬호스트 아니면 redis
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
# view 에서
from django.views.decorators.cache import cache_page
class MyView(APIView):
@cache_page(60 * 15) # 15분 동안 캐싱
def get(self, request, format=None):
...
value = cache.get('my_key',default=None)
cache.set('my_key', 'hello, world!', 30)
cache.delete('my_key')
drf에서 캐시를 사용하는 것은 위 코드와 같다. 이전에는 이해하기 힘들었는데 Celery를 써보려고 캐시를 사용해보니 엄청 간단하고 쉽다고 느껴졌다. 단순히 settings.py에서 캐시 설정을 해주고 View에서 @cache_page 데코레이터를 사용하면 된다고 한다. cache.get , set , delete 메서드도 존재하는데 delete를 제외하면 api view에서는 그렇게 많이 사용할 것 같지는 않았다.
이렇게 글을 쓰려고 마치려고 하는 참에, 유용한 데코레이터를 추가적으로 발견했다.
from django.views.decorators.vary import vary_on_headers
from django.views.decorators.cache import cache_page
@vary_on_headers('Authorization')
@cache_page(60 * 60) # 캐시 유지 시간은 1시간
def my_view(request):
JWT를 쓴다고 가정할때, JWT 결과에 따라서 페이지가 달라지는 경우도 종종 있었다. 이런 경우에는 경우에 따라 캐시 결과가 갈리기 때문에 캐시로 저장하기 힘드나, @vary_on_headers(header_list)의 경우 헤더의 값에 따라 캐시값이 달라진다. JWT의 경우 Authorization을 쓴다면, 로그인 여부에 따라 캐싱 결과가 달라지는 페이지를 만들 수 있는 것.