백엔드에서 프론트로 오는 응답시간(4초 이상걸림)
여러 영화 포스터가 뜨는 Main 페이지
리뷰 목록을 보여주는 Community 페이지
다른페이지는 적어도 2초 안에는 응답이 오는데, 이 두 페이지만 유독 느림
Heroku 서버가 미국에 있기 때문에, 통신지연과 성능이 그렇게 좋지 않은 무료 인스턴스를 사용하고 있기 때문에 느릴 수 밖에 없다.
하지만, 다른 페이지가 2초 안에 응답이 오기 때문에, 저 두개의 페이지도 응답시간 2초 이내로 줄일 방법이 있을 것이다.
Main 페이지
Community 페이지
발생 하는 곳
ForeignField 나 ManyToManyField 를 사용하는 테이블을 Serializer에서 JSON 형태로 바꿔서 넘겨줄 때
각 요소마다 serializer는 foreign key에 해당하는 테이블을 다시 select문으로 서칭하게 됨.
(orm은 lazy하기 때문에 필요하기 전까지 데이터를 가져오지 않은 상태라)
그래서 요소만큼 부가적으로 반복되게 됨
발생장소
# main 페이지 고친 부분
@api_view(['GET'])
def main(request) :
#### 수정부분#####
# latest_movies = Movie.objects.order_by('-release_date')[:10]
latest_movies = Movie.objects.order_by('-release_date').prefetch_related('genres')[:10]
# highscore_movies = Movie.objects.order_by('-vote_average')[:10]
highscore_movies = Movie.objects.order_by('-vote_average').prefetch_related('genres')[:10]
# like_movies = Movie.objects.order_by('-vote_count')[:10]
like_movies = Movie.objects.order_by('-vote_count').prefetch_related('genres')[:10]
################
latest_serializer = MovieSerializer(data=latest_movies, many=True)
highscore_serializer = MovieSerializer(data=highscore_movies, many=True)
like_serializer = MovieSerializer(data=like_movies, many=True)
print(latest_serializer.is_valid() , highscore_serializer.is_valid() , like_serializer.is_valid())
context={
'latest_movies' : latest_serializer.data,
'highscore_movies' : highscore_serializer.data,
'like_movies' : like_serializer.data,
}
return Response(context)
커뮤니티 부분
116쿼리(32.15ms) > 79쿼리(24.14)
줄어들긴 했으나, CommunityDetail의 Serializer와 동일한 Serializer 사용으로
쓸대없는 내용이 너무 많이 들어가있어 쓰지 않는 내용부터 처낼 필요성이 있음.
# 완성된 serializer 모습
class ReviewListSerializer(serializers.ModelSerializer):
movie = MovieDetailSerializer(read_only=True)
comment_count = serializers.IntegerField(source='comment_set.count', read_only=True)
like_users_count = serializers.IntegerField(source='like_users.count', read_only=True)
class Meta :
model = Review
exclude =('user','like_users','funny_users','helpful_users')
# exclude = ('like_users','funny_users','helpful_users')
read_only_fields =('movie',)
앞으로 더 최적화 시킬 일
1. 쿼리를 여러개 보낼 때 한번에 보내도록 처리하기
2. 메인페이지에 뜨는 정보는 캐싱하기
3. JWT 토큰 구조 access, refresh로 변경
4.