
백엔드
MySqlPagingQueryProvider 살펴보기
두줄요약
JdbcPagingItemReader와 MySqlPagingQueryProvider의 페이지네이션 동작과 주의사항을 정리했습니다.\nsort key와 group clause 설정에 따라 데이터 누락과 SQL 오류가 발생할 수 있어 조심해야 했습니다.
문제 상황
- Spring Batch의 JdbcPagingItemReader와 MySqlPagingQueryProvider 사용 중 페이지네이션 동작이 기대와 다르게 나타난 사례
- 첫 번째 이슈: sort key를 created_at으로 둔 경우 동일 시각 데이터가 많은 구간에서 일부만 발행
- 두 번째 이슈: group clause와 table alias 조합에서 remaining page 조회 시 SQL 오류 발생
원인 분석
- MySqlPagingQueryProvider가 offset/limit이 아니라 sort key를 기준으로 WHERE 조건을 추가하는 방식으로 페이지를 구분
- JdbcPagingItemReader가 이전 페이지의 마지막 sort key 값을 startAfterValues에 저장해 다음 페이지 조건에 활용
- group clause가 있으면 inline view(MAIN_QRY)를 만들기 때문에 table alias가 포함된 sort key가 깨질 수 있음
해결 방법
- unique하고 순서를 보장하는 컬럼을 sort key로 사용해 페이지 누락 방지
- group clause 사용 시 sort key에서 table alias를 제거하고 컬럼명만 사용
- MySqlPagingQueryProvider의 remaining query 생성 방식과 내부 동작을 이해한 뒤 쿼리 구성
