@cached_property 를 사용한 경험을 이야기 하려고 한다.
class cached_property(object):
"""
Decorator that converts a method with a single self argument into a
property cached on the instance.
Optional ``name`` argument allows you to make cached properties of other
methods. (e.g. url = cached_property(get_absolute_url, name='url') )
"""
def __init__(self, func, name=None):
self.func = func
self.__doc__ = getattr(func, '__doc__')
self.name = name or func.__name__
def __get__(self, instance, cls=None):
if instance is None:
return self
res = instance.__dict__[self.name] = self.func(instance)
return res
Django github 를 살펴보면 cached_property 함수가 위에 처럼 만들어져 있는것을 확인 할 수 있다.
@cached_property는 @property 와 사용법이 같고 (decorator)
2022.02.23 - [Framework/Django] - [Django] models property decorator (@property)
class Foo(models.Model):
@cached_property
def bar(self):
return self.expensive_computation()
instance 를 캐싱해두어 다시 동일한 instance 호출 할 때 캐싱 된 값을 리턴해준다.
본인이 사용한 이유는..
이미 처음부터 만들어져 있었고 몇년동안 @property 로 decorator 해서 사용 한 부분이 있는데
그 부분에서 중복호출이 너무 많이 일어났다.
같은 instance 인데 계속 중복으로 호출을 하더라..
처음에는 이 중복 호출되는 부분을 하나씩 찾아보기 시작했다.
그런데 서비스 라는것이 계속 추가 되는 부분들도 있고 코드량이 방대해지다보니 전부 리팩토링할 엄두가 나지 않았다.
그래서 나와 비슷한 고민을 하고있는 사람이 있는지.. 찾아보기 시작했고
cached_property 를 사용해서 고민을 해결한 사람들이 종종 있더라.
그래서 @property -> @cached_property 로 사용해보니
중복 호출이 일어나지 않는다. instance 가 변경 될 때만 호출을 한다.
혹시나 캐시를 사용하면 메모리를 많이 사용할 것 같아서 메모리도 확인을 해보았는데 기존과 차이가 없다.
오히려 더 안정적인 느낌
아마 @property 를 계속해서 호출 하는 부분이 더 많은 리소스를 사용하는 것이 아니였을까?
이렇게 @property를 사용해서 같은 instance 에 중복호출이 많이 일어난다면
@cached_property 를 적용해보는 것을 추천한다.
'Framework > Django' 카테고리의 다른 글
[Django] CORS (Cross-Origin Resource Sharing) (0) | 2022.07.16 |
---|---|
[Django] webhook receiver (웹훅 수신) (0) | 2022.06.29 |
[Django] models property decorator (@property) (0) | 2022.02.23 |
[Django] Ratelimit (django-ratelimit) (0) | 2022.02.17 |
[Django] auto_now , auto_now_add (0) | 2022.02.11 |