Django 개발자라면 django.core.cache (서버 측 캐시)에는 익숙할 것입니다. 하지만 Django는 HTTP 캐싱을 효과적으로 제어할 수 있는 또 다른 강력한 도구 모음인 django.utils.cache를 제공합니다. 이 모듈은 서버의 부하를 줄이고 사용자 경험을 향상시키는 데 필수적인 HTTP 헤더를 관리하는 데 중점을 둡니다.
이 포스트에서는 django.utils.cache의 주요 기능과 사용법을 살펴보겠습니다.
django.core.cache와 django.utils.cache의 차이점
가장 먼저 명확히 해야 할 부분입니다.
-
django.core.cache(서버 측 캐시):- 데이터베이스 쿼리 결과, 복잡한 연산 결과, 템플릿 일부 등을 서버 메모리(RAM), Redis, Memcached 등에 저장합니다.
- 목적: 서버 내부의 연산 부하를 줄여 응답 생성 속도를 높입니다.
-
django.utils.cache(HTTP 캐시 / 클라이언트 측 캐시):Cache-Control,Vary,ETag,Last-Modified같은 HTTP 응답 헤더를 설정합니다.- 목적: 브라우저나 프록시 서버가 응답을 캐싱하도록 지시하여, 동일한 요청이 발생했을 때 서버에 다시 요청하지 않고 캐시된 응답을 사용하도록 합니다.
간단히 말해, core.cache는 데이터를 캐싱하고, utils.cache는 HTTP 응답을 캐싱하는 방법을 제어합니다.
주요 데코레이터 및 기능
django.utils.cache 모듈은 주로 뷰(View)에 적용하는 데코레이터 형태로 사용됩니다.
1. @cache_control
가장 기본적이면서 강력한 데코레이터입니다. Cache-Control HTTP 헤더를 세밀하게 제어할 수 있게 해줍니다.
max_age: 캐시가 유효한 시간 (초 단위). 브라우저는 이 시간 동안 캐시된 버전을 사용합니다.public=True: 응답이 공개(public) 캐시(예: CDN, 프록시)에 저장될 수 있음을 의미합니다.private=True: 응답이 사용자 브라우저와 같은 비공개(private) 캐시에만 저장되어야 함을 의미합니다. (일반적으로max_age와 함께 사용)no_cache: 캐시를 사용하기 전에 항상 서버에 유효성을 검사하도록 합니다.no_store: 응답을 절대로 캐시하지 않도록 합니다.
예제:
# views.py
from django.utils.cache import cache_control
# 이 뷰의 응답을 1시간(3600초) 동안 브라우저 캐시에 저장
@cache_control(max_age=3600)
def my_public_view(request):
# ...
return response
# 이 뷰는 민감한 사용자 정보가 있으므로 비공개 캐시(브라우저)에만 30분간 저장
@cache_control(private=True, max_age=1800)
def user_profile_view(request):
# ...
return response
2. @never_cache
이름 그대로, 이 뷰의 응답을 절대 캐시하지 않도록 설정합니다.
Cache-Control: max-age=0, no-cache, no-store, must-revalidate 헤더를 추가하여 브라우저가 응답을 캐시하지 않도록 강력하게 지시합니다.
예제: (주로 결제 페이지, 중요한 폼 제출 페이지 등에 사용)
# views.py
from django.utils.cache import never_cache
@never_cache
def sensitive_form_view(request):
# ...
return response
3. @vary_on_headers / @vary_on_cookie
Vary 헤더를 설정하는 데 사용됩니다. Vary 헤더는 캐시된 응답이 어떤 조건에 따라 달라질 수 있는지 알려주는 중요한 역할을 합니다.
예를 들어, @vary_on_headers('User-Agent')를 사용하면 모바일과 데스크톱 User-Agent에 따라 다른 HTML을 제공할 때, 캐시가 이 둘을 구별하여 저장하도록 만듭니다.
@vary_on_cookie는 쿠키 값에 따라 뷰의 내용이 달라질 때 사용됩니다. (예: 세션 쿠키에 따라 로그인/로그아웃 상태가 달라질 때)
예제:
# views.py
from django.views.decorators.vary import vary_on_headers, vary_on_cookie
# User-Agent(모바일/데스크톱)와 Accept-Language(언어 설정)에 따라
# 캐시를 별도로 저장
@vary_on_headers('User-Agent', 'Accept-Language')
def content_view(request):
# ...
return response
# 쿠키(세션)에 따라 내용이 달라지는 뷰
@vary_on_cookie
def user_specific_view(request):
# ...
return response
요약
django.utils.cache는 Django가 HTTP 표준을 잘 준수하며 클라이언트 측 캐싱을 정교하게 다룰 수 있도록 지원하는 핵심 모듈입니다.
적절한 Cache-Control과 Vary 헤더 설정은 서버 트래픽을 극적으로 줄이고, 사용자가 더 빠른 로딩 속도를 경험하게 하는 핵심 전략입니다. 특히 정적 콘텐츠나 자주 변경되지 않는 목록 페이지에 이 모듈의 데코레이터를 활용하면 큰 성능 향상을 기대할 수 있습니다.
댓글이 없습니다.