DJango 서버개발, 다양한 캐시 백엔드 설정하기 (Memcached, Redis 등)

작성자: 조광형

날짜: 2024년 11월 26일

1. 캐시의 필요성

웹 어플리케이션 개발에서 성능은 매우 중요한 요소입니다. 사용자 경험을 향상시키고, 서버 자원 소비를 줄이기 위해 caching은 필수적입니다.
캐시를 사용하면 데이터베이스나 소스 시스템에 대한 요청을 줄이고, 이전에 저장된 결과를 빠르게 반환할 수 있습니다.
이로 인해, 응답 시간이 줄어들고 서버 부하도 감소합니다.

Django는 다양한 캐시 백엔드를 지원하며, 매우 유연한 캐시 시스템을 제공합니다.
이 글에서는 Django에서 Memcached와 Redis와 같은 캐시 백엔드를 설정하는 방법에 대해 상세히 다루겠습니다.

2. Django의 캐시 프레임워크 개요

Django의 캐시 프레임워크는 다음과 같은 장점을 제공합니다:

  • 고성능: 메모리 기반 캐시 시스템을 사용하여 빠른 데이터 접근을 가능하게 합니다.
  • 유연성: 다양한 캐시 수단(Memory, Memcached, Redis 등)을 지원합니다.
  • 확장성: 큰 규모의 프로젝트에서도 유용하게 사용할 수 있습니다.

기본적으로 Django는 캐시를 설정하기 위해 두 가지 방법을 제공합니다:

  1. 전체 캐시 설정
  2. 뷰 레벨 캐시 설정

이러한 설정을 통해 사용자 요청의 일부 결과를 저장하고, 주기적으로 갱신하여 불필요한 데이터베이스 쿼리를 줄일 수 있습니다.

3. Memcached 설정하기

3.1 Memcached 설치

Memcached는 메모리 기반의 분산 캐시 시스템으로, 속도가 빠르고 사용이 간편합니다.
설치를 위해서는 운영체제에 따라 다음과 같은 명령어를 사용합니다.

sudo apt-get install memcached

3.2 Django에서 Memcached 설정

Django 프로젝트에 Memcached를 사용하려면, settings.py 파일에서 캐시 설정을 추가해야 합니다.
아래는 Memcached를 사용하는 설정 예제입니다:

 
# settings.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}
        

3.3 데이터 캐싱 예제

캐시를 사용하여 장고의 뷰에서 데이터를 캐시하는 방법은 다음과 같습니다.
간단한 예제에서 특정 사용자 정보를 캐시해 보겠습니다:


from django.core.cache import cache
from django.shortcuts import render
from .models import UserProfile

def user_profile(request, user_id):
    # 캐시에 데이터가 있는지 확인
    user_data = cache.get(f'user_profile_{user_id}')
    
    if not user_data:
        # 캐시에서 데이터를 찾지 못하면 DB에서 조회
        user_data = UserProfile.objects.get(id=user_id)
        # 캐시에 데이터 저장 (5분 동안 유지)
        cache.set(f'user_profile_{user_id}', user_data, timeout=300)
    
    return render(request, 'user_profile.html', {'user_data': user_data})
        

4. Redis 설정하기

4.1 Redis 설치

Redis는 키-값 저장소로 메모리 기반의 데이터베이스입니다. 설치는 다음 명령어로 수행할 수 있습니다.

sudo apt-get install redis-server

4.2 Django에서 Redis 설정

Django에서 Redis를 사용하기 위해 django-redis 패키지를 설치해야 합니다. 다음 명령어를 사용합니다:

pip install django-redis

그 후, settings.py 파일에 Redis 캐시 설정을 추가해야 합니다:


# settings.py
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}
        

4.3 데이터 캐싱 예제

Redis를 사용하여 캐시된 데이터를 이용하는 방법은 Memcached와 유사합니다.
다음 예제에서는 특정 키워드의 검색 결과를 캐시하는 기능을 구현합니다:


from django.core.cache import cache
from django.shortcuts import render
from .models import Product

def search_products(request):
    query = request.GET.get('q')
    cache_key = f'products_search_{query}'
    products = cache.get(cache_key)

    if not products:
        products = Product.objects.filter(name__icontains=query)
        cache.set(cache_key, products, timeout=600)
    
    return render(request, 'search_results.html', {'products': products})
        

5. 캐시 무효화 및 관리

캐시된 데이터는 시간이 지나면 유효성이 떨어지거나 변경될 수 있습니다.
이럴 때는 캐시를 무효화하거나 갱신해야 합니다. Django에서는 cache.delete() 메소드를 통해 특정 키의 캐시를 삭제할 수 있습니다.


# 특정 캐시 삭제
cache.delete(cache_key)
        

또한 모든 캐시를 한 번에 삭제하고 싶다면 cache.clear()를 사용할 수 있습니다.
이는 집합적으로 모든 캐시를 무효화하는 방법입니다.


# 모든 캐시 삭제
cache.clear()
        

6. 결론

Django의 캐시 프레임워크를 활용하면 애플리케이션 성능을 크게 향상시킬 수 있습니다.
이번 글에서는 Memcached와 Redis 두 가지 캐시 백엔드를 설정하고 사용하는 방법에 대해 알아보았습니다.
각각의 캐시는 특정 상황과 용도에 따라 장단점이 있으므로, 필요에 맞는 것을 선택하여 사용하길 권장합니다.

캐시 구성은 초기 설정만으로 끝나는 것이 아니라, 주기적인 모니터링과 조정이 필요합니다.
각 캐시의 성능을 분석하고, 사용자 요구에 맞춰 적절히 관리해 나가는 것이 중요한 만큼
이 글이 Django에서 캐시 시스템을 이해하고 구현하는 데 도움이 되었길 바랍니다.

© 조광형 – All Rights Reserved.