목록 보기
MySqlPagingQueryProvider 살펴보기
백엔드

MySqlPagingQueryProvider 살펴보기

마켓컬리
마켓컬리
2024년 12월 30일

두줄요약

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 생성 방식과 내부 동작을 이해한 뒤 쿼리 구성

다음 읽기

#MySQL 주제를 다룬 다른 회사 글

[SpringBatch 연재 05] JdbcPagingItemReader로 DB내용을 읽고, JdbcBatchItemWriter로 DB에 쓰기

JdbcPagingItemReader로 DB 데이터를 페이지 단위로 읽고 파일로 저장하는 방법을 다루었습니다. JdbcBatchItemWriter로 파일 데이터를 DB에 빠르게 적재하는 구성도 함께 설명했습니다.

데보션
데보션
백엔드

댓글 0

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...