동일한 인스턴스의 Property를 여러번 호출하는 경우, 중복으로 연산작업을 하게 된다.
Property 안에서 호출하는 함수가 비용이 큰 연산작업인 경우, 중복 연산 작업이 API 성능을 크게 떨어트릴 수 있다.
Django의 cached_property decorator를 사용하면 이러한 이슈를 해결할 수 있다.
cached_property는 처음 호출된 Property 함수 결과값을 캐싱해둔다. 그리고 이후에는 캐싱된 결과값을 리턴한다.
그러면 동일한 Property를 여러번 호출하더라도, 한 번의 연산만 하게 된다.
Sample
from django.utils.functional import cached_property
from weather.utils import WeatherAPI
from django.utils.timezone import datetime
class TodayWeather:
@cached_property
def weather(self):
# 비싼 연산작업이 필요하고, 여러번 호출되는 값은 @cached_property으로 캐싱해두자!
# ex. DB / ElasticSearch / API 통신 등..
target_date = datetime.today()
weather = WeatherAPI.call(target_date=target_date)
return weather
@property
def temperature(self):
self.weather['temperature']
@property
def rain_rate(self):
self.weather['rain_rate']
today_weather = TodayWeather()
print(f'온도 : {today_weather.temperature}')
print(f'비가 올 확률 : {today_weather.rain_rate}')
만약 위의 코드에서 weather property를 캐싱해두지 않았다면, 날씨를 조회하는 Weather API는 2번 호출된다.
그런데 cached_property으로 설정해두면, 이미 연산했던 캐시 값을 반환하기 때문에 Weather API는 1번만 호출된다.
Cache Range
캐싱 데이터는 해당 인스턴스에서만 접근할 수 있다.
그리고 해당 인스턴스가 살아있는 동안에만 유지된다. 때문에, 인스턴스 메모리가 해제되면 캐시된 프로퍼티 데이터도 사라진다.
Django 성능 최적화 아티클을 보면, cached property에 대한 내용들이 항상 언급된다. 성능 최적화를 할 때, 유용한 함수인 것 같다 ~_~
참고
Django Patterns: Fat Models and cached_property
< 끝 >
'소프트웨어-이야기 > 프로그래밍 언어와 프레임워크' 카테고리의 다른 글
(Django) Django에서 비즈니스 로직 관리하기 (0) | 2019.05.12 |
---|---|
(Django) CacheOps - ORM에 Redis Cache 쉽게 적용하기 (6) | 2019.05.12 |
(saleor) 가독성 좋은 함수명 만들 때 유용한 팁 모음집 (0) | 2019.02.10 |
(Django) Django ORM에서 Row Lock 잡기 - select_for_update (2) | 2018.12.15 |
(Django) Django로 e-commerce 개발할 때 참고하기 좋은 오픈소스 (0) | 2018.10.20 |