Tip: 하지만, Serializer으로 얻는 막대한 개발생산성이 있으며, Serializer를 쓰더라도 적절한 캐싱을 통해 극복할 수 있습니다.
DB/Serializer 대신에 캐싱
데이터가 변경되지 않는다면, 캐싱을 통해 성능을 높일 수 있습니다.
cache는 django에서 기본설정으로 django.conf.global_settings.py에서 cache를 보면 locmemcache인 것을 알수있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from django.core.cache import cache #cache 접근
# 중략
deflist(self, request, *args, **kwargs): db_start = time.time() data = cache.get('post_list_data') #값이 있다면 가져오고 아니면 None반환됨 if data isNone: #None이라면 data = self.queryset.values('author__username', 'message') #data를 DB에서 가져오고 cache.set('post_list_data', data, 60) #그 값을 cache에다가 넣음
self.db_time = time.time() - db_start
self.serializer_time = 0
return Response(data)
수행결과
Tip: 코드 최적화가 먼저입니다. 캐시는 적당히. 무분별한 캐시는 마약과도 같습니다.
APIView에 필요한 설정만 넣기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from rest_framework.negotiation import BaseContentNegotiation from rest_framework.renderers import JSONRenderer
classIgnoreClientContentNegotiation(BaseContentNegotiation): defselect_parser(self, request, parsers): "Select the first parser in the `.parser_classes` list." return parsers[0]
defselect_renderer(self, request, renderers, format_suffix): "Select the first renderer in the `.renderer_classes` list." return (renderers[0], renderers[0].media_type) classPostViewSet(ModelViewSet):#디폴트값들 없앰, 최소한으로 queryset = Post.objects.all() serializer_class = PostSerializer permission_classes = [] authentication_classes = [] renderer_classes = [JSONRenderer] content_negotiation_class = IgnoreClientContentNegotiation