Replies: 3 comments
-
좋은 접근이네요! |
Beta Was this translation helpful? Give feedback.
-
일단 이렇게 문제제기 해주고, 근거를 수치화하여 멋지게 작성해준 몰리에게 무한 박수👏👏👏👏👏 몰리 글을 읽어본 결과 페이지네이션을 위해 프론트에게 전달해주고 있는 일단 먼저
결론: (+) 페이지네이션을
|
Beta Was this translation helpful? Give feedback.
-
대면 회의를 통해 현재 페이지 기준 최대 페이지네이션바에 있을 수 있는 페이지를 반환하기로 했습니다. 현재 페이지 1, 총 페이지 25 -> 5페이지 반환 AS ISTOBE
|
Beta Was this translation helpful? Give feedback.
-
템플릿 목록 조회 API
템플릿 목록 조회 API가 성능 개선을 했지만 데이터가 많은 경우 여전히 느리다. (베타 서버 데이터 400만건 기준 API 응답 속도 8s)
그 이유는 여러가지가 있는데, 1차 성능 개선을 한 이후에서 가장 크게 느껴지는 문제는 전체 템플릿 수인 totalElements, totalPages 를 반환하는 것이다.
템플릿 목록을 조회하면, 전체 페이지 수와 전체 페이지 수 값을 반환해야 하기 때문에 조회 시 백엔드에서는 JPA Page타입을 사용하고 있다.
Page 타입을 사용하게 되면 JPA는 (조건에 맞는 템플릿을 조회했던 쿼리 + 조건에 맞는 템플릿의 전체 갯수)를 조회하는 쿼리를 발생시킨다.
"조건에 맞는 템플릿을 조회했던 쿼리"는 조건이 걸리고 인덱스를 탈 수도 있고 20개씩 offset이 지정되어 있기 때문에 상대적으로 속도가 느리지 않다.
하지만 두번째 쿼리인 "조건에 맞는 템플릿의 전체 갯수"는 offset과 별개로 모든 조건에 맞는 컬럼 수를 조회한다.
즉 우리 구경가기 페이지에 제일 처음 조회 시 아무런 조건이 없는데, 100만개의 데이터가 있으면 100만개를 풀스캔하는 것이다.
모든 조건을 구경가기 처음 클릭 시와 동일하게 작성하고 쿼리 실행 시간 분석 진행해보자.
템플릿 조회 쿼리
count 쿼리
실행 시간이 약 0.492ms vs 약 150ms 차이 발생하는 것을 알 수 있다.
다시말해 totalElements를 조회하는 쿼리가 20개의 템플릿을 조회하는 것보다 약 304.878배가 소요된다는 것이다.
totalElements 사용 이유
totalElements의 용도는 목록 조회 시 하단 페이지네이션 바에서 가장 마지막 페이지로 이동하기 위해서이다.
totalElements는 304배를 감수할만큼 자주 사용되고 있을까?
한국에서 굉장히 유명한 백엔드 향로 블로그에 따르면 "굳이 사용율이 떨어지는 페이지 버튼을 위해 매번 전체 count 쿼리가 수행될 필요가 있을까를 한번 고민해볼 필요가 있는데요." 라고 한다.
우리도 한번 이야기해봐요
Beta Was this translation helpful? Give feedback.
All reactions