[230313 - TIL] Django에서 cache 사용하기 (feat. ChatGPT vs Django Document)

Dongwoo Kim·2023년 3월 13일
0

TIL / WIL

목록 보기
93/112

1. 개요

이번에 작업을 진행하면서 여러 요청에서 동일하게 계산하고 응답하는 결과를 cache를 사용하여 관리하게 되었다. 작성 당시에는 이미 사용중인 비슷한 기능을 하는 코드를 가져와서 구현하였지만 좀 더 확실하게 알고 넘어가고자 ChatGPT와 공식문서를 보며 알아보았다.


2. Cache 란?

무언가를 캐시한다는 것은 다음에 계산을 수행할 필요가 없도록 비용이 많이 드는 계산의 결과를 저장하는 것입니다.

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

캐시(cache)는 데이터나 계산 결과 등을 미리 저장해 두어서, 이후에 동일한 작업을 할 때 더 빠르게 처리할 수 있도록 해 준다. 예를 들어 이번 작업의 경우, 서버에서 상품과 회원등급별로 적용가능한 혜택을 계산해서 반환하는 로직을 캐시로 이용했다. 따라서 상품번호, 회원등급번호만 알고 있으면 첫 적용혜택을 구한다음 캐시를 업데이트하지 않는한 같은 상품번호, 회원등급번호에 대한 적용혜택은 다시 계산할 필요가 없는 것이다.


3. ChatGPT가 알려준 django.core.cache

다음은 ChatGPT에서 검색한 django.core.cache를 이용한 캐시이용방법이다.


3-1) django 캐시 백엔드 종류

Django는 다양한 캐시 백엔드를 지원합니다. 각 백엔드는 다른 특성을 가지고 있으므로, 사용 시 주의해야 합니다. Django의 캐시 백엔드는 다음과 같습니다.

  1. django.core.cache.backends.db.DatabaseCache: Django의 기본 데이터베이스를 사용하여 캐시를 저장하는 백엔드입니다. 따라서 데이터베이스에 대한 액세스가 필요합니다. 데이터베이스 캐시 백엔드는 여러 쓰레드에서 사용하기에는 적합하지 않습니다.
  2. django.core.cache.backends.filebased.FileBasedCache: 파일 시스템을 사용하여 캐시를 저장하는 백엔드입니다. 파일 기반 캐시 백엔드는 여러 서버에서 사용하기에는 적합하지 않습니다.
  3. django.core.cache.backends.memcached.MemcachedCache: Memcached를 사용하여 캐시를 저장하는 백엔드입니다. Memcached는 분산 캐시 서버이므로, 여러 서버에서 사용하기에 적합합니다.
  4. django.core.cache.backends.memcached.PyLibMCCache: PyLibMC를 사용하여 Memcached를 빠르게 액세스할 수 있는 백엔드입니다. PyLibMC는 Memcached의 Python 바인딩입니다.
  5. django.core.cache.backends.memcached.MemcachedCache: Memcached를 사용하여 캐시를 저장하는 백엔드입니다. Memcached는 분산 캐시 서버이므로, 여러 서버에서 사용하기에 적합합니다.
  6. django.core.cache.backends.memcached.PyLibMCCache: PyLibMC를 사용하여 Memcached를 빠르게 액세스할 수 있는 백엔드입니다. PyLibMC는 Memcached의 Python 바인딩입니다.
  7. django.core.cache.backends.dummy.DummyCache: 실제로 아무런 일을 하지 않는 테스트용 캐시 백엔드입니다.
  8. django.core.cache.backends.locmem.LocMemCache: 로컬 메모리를 사용하여 캐시를 저장하는 백엔드입니다. 캐시가 한 번에 하나의 프로세스에서만 작동하므로, 여러 서버에서 사용하기에 적합하지 않습니다.

위의 캐시 백엔드들은 Django에서 기본으로 제공되며, 더 많은 캐시 백엔드를 사용하기 위해서는 django-cache-url이나 python-memcached 등의 패키지를 설치해야 할 수 있습니다.


3-2) settings.py 설정 방법

django.core.cache.backends.locmem.LocMemCache는 로컬 메모리를 사용하여 캐시를 저장하는 백엔드입니다. 이 백엔드를 사용하기 위해서는 Django의 CACHES 설정에 LOCATION을 지정해주어야 합니다.

CACHES 설정은 Django의 settings.py 파일에 있으며, 다음과 같은 형식으로 작성됩니다.

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

위 설정에서 'default'는 캐시 설정의 이름입니다. 이 이름을 사용하여 캐시를 참조할 수 있습니다. 'BACKEND'는 캐시 백엔드를 지정하는 옵션으로, 'django.core.cache.backends.locmem.LocMemCache'를 지정하여 LocMemCache를 사용하도록 설정합니다. 'LOCATION'은 캐시의 식별자입니다. 이 식별자는 캐시를 구분하기 위한 것으로, 유니크한 값을 사용하는 것이 좋습니다.

만약 여러 개의 캐시 백엔드를 사용하려면, 'CACHES' 설정에 각각의 캐시 설정을 추가하면 됩니다.

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    },
    'secondary': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

위 설정에서 'default''secondary'는 각각의 캐시 설정의 이름이며, LocMemCacheMemcachedCache를 각각 사용합니다. 'LOCATION'은 각각의 캐시 식별자입니다. 이렇게 설정하면, cache.get_cache('default')cache.get_cache('secondary')를 사용하여 각각의 캐시 객체를 얻을 수 있습니다.


3-3) 기본 사용방법

Django의 캐시는 웹 어플리케이션에서 빠른 응답을 위해 데이터를 저장하고 재사용하는 방법입니다. django.core.cache 모듈은 Django에서 캐시를 사용하기 위한 기능을 제공합니다.

다음은 Django 캐시의 일반적인 사용 방법입니다.

  1. cache.set(key, value, timeout=None)를 사용하여 캐시에 값을 저장합니다. key는 캐시 항목의 고유 식별자이며 value는 캐시할 값입니다. timeout은 캐시의 만료 시간을 초 단위로 설정합니다. 기본값은 캐시가 영구적으로 유지됩니다.
  2. cache.get(key, default=None)를 사용하여 캐시에서 값을 가져옵니다. key는 캐시 항목의 고유 식별자이며 defaultkey가 없을 경우 반환할 기본값입니다.
  3. cache.delete(key)를 사용하여 캐시에서 항목을 삭제합니다.

예를 들어, 캐시에 my_keymy_value를 저장하고 60초 후에 만료되도록 설정하려면 다음과 같이 코드를 작성할 수 있습니다.

from django.core.cache import cache

cache.set('my_key', 'my_value', timeout=60)

이제 캐시에서 my_key에 해당하는 값을 가져오려면 다음과 같이 코드를 작성할 수 있습니다.

from django.core.cache import cache

my_value = cache.get('my_key')

캐시에서 my_key를 삭제하려면 다음과 같이 코드를 작성할 수 있습니다.

from django.core.cache import cache

cache.delete('my_key')

Django는 다양한 캐시 백엔드를 지원하므로, CACHES 설정을 사용하여 사용하려는 캐시 백엔드를 구성해야 합니다. 예를 들어, 다음과 같이 설정할 수 있습니다.

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

위의 설정은 Memcached 캐시 백엔드를 사용합니다. 캐시 백엔드를 구성하려면 Django 문서를 참조하십시오.


3-4) 리뷰

ChatGPT가 알려준 내용을 보고 깜짝 놀랐다. 간단하게 한줄로만 질문을 해도 너무나 자세하게 잘 알려준다. 내가 공식 문서를 보고 처음부터 공부하려고했다면 번역부터 전체적인 사용법과 이해까지 시간이 적지않게 들었을텐데 좋은 가이드가 될 수 있었다.

다만 새로운 개념을 이해하는데 ChatGPT에만 의존하는 것은 위험할 수 있다고 생각한다. ChatGPT도 실수할 때가 있기 때문이다. 위 질문을 할 때도 그런 점을 최대한 방지하고자 django document를 참고해서 알려달라고는 했지만 처음 개념을 잡고 기본적인 이해를 위할 때나, 내가 확실하게 알고 있는 내용에 대해 기능 구현을 하면서 작업 시간을 줄이는 용도로 사용하는게 제일 좋은 방법인 듯하다.

다음은 ChatGPT에게 물어본 이후 공식문서를 보며 정리한 내용이다.


4. Django Document

문자열, 사전, 모델 객체 목록 등 안전하게 피클링할 수 있는 Python 객체를 캐시할 수 있다.

4-1) django 캐시 프레임워크 정책

적은 코드

캐시는 가능한 한 빨라야 합니다. 따라서 캐시 백엔드를 둘러싼 모든 프레임워크 코드는 특히 get()작업을 위해 절대 최소로 유지되어야 합니다.

일관성

캐시 API는 다양한 캐시 백엔드에서 일관된 인터페이스를 제공해야 합니다.

확장성

캐시 API는 개발자의 요구에 따라 애플리케이션 수준에서 확장 가능해야 합니다.

https://docs.djangoproject.com/en/4.1/misc/design-philosophies/#cache-framework


4-2) 레디스

  • BACKEND : django.core.cache.backends.redis.RedisCache
  • LOCATION : 적절한 체계를 사용하여 Redis 인스턴스를 가리키는 URL로 설정
  • 사용자 이름과 암호를 제공하려면 LOCATION URL에 추가
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.redis.RedisCache',
        'LOCATION': 'redis://username:password@127.0.0.1:6379',
    }
}

4-3) 로컬 메모리 캐싱

  • 설정 파일에 다른 항목이 지정되지 않은 경우의 기본 캐시
  • BACKEND : django.core.cache.backends.locmem.LocMemCache
  • LOCATION : unique-id
  • LOCATION는 개별 메모리 저장소를 식별하는 데 사용, 로컬 메모리 캐시가 두 개 이상인 경우에는 별도로 유지하기 위해 적어도 하나에 이름을 지정해야함
  • LRU(Least-Recently-Used) 컬링 전략을 사용
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

4-4) LRU (Least-Recently-Used)

LRU 전략은 캐시 메모리의 크기가 제한되어 있는 경우 가장 자주 액세스되는 데이터를 유지하면서 공간을 확보하기 위해 사용한다. 캐시 메모리가 가득 차면, LRU 전략은 가장 오래된 데이터부터 삭제하여 새 데이터를 수용할 공간을 확보한다.


5. ChatGPT vs Django Document

사실 각각의 장단점이 있는 듯하다. ChatGPT 는 내가 알고 싶은 내용을 빠르고 정확하게 알려주지만 신뢰성이 떨어지고 내가 몰랐던 내용이라면 한번더 확인해봐야하는 검증하는 시간이 필요하다. 하지만 공식문서는 오피셜하게 그 내용을 신뢰할 수 있고 내가 필요한 부분만 찾아서 활용할 수 있지만 여러모로 시간이 오래걸릴 수 있다.

다음은 LRU와 관련해서 ChatGPT가 잘못된 내용을 알려준 케이스다.



참고

profile
kimphysicsman

0개의 댓글