본문으로 이동
문서

MySqlPagingQueryProvider 살펴보기

이경훈 컬리 · 컬리 기술 블로그

원문 보기

AI 핵심 요약

Transactional Outbox 배치에서 같은 created_at 값을 가진 행들이 페이지 경계에서 누락되는 문제를 겪고, MySqlPagingQueryProvider가 OFFSET 대신 이전 페이지의 마지막 sort key보다 큰 행을 조회한다는 점을 확인했다. created_at 대신 고유한 auto_increment id를 sort key로 사용해 순서와 페이지 이동을 안정화했다. AML 배치에서는 GROUP BY가 있는 쿼리의 다음 페이지 조회가 테이블 alias를 찾지 못해 실패했는데, provider가 결과를 MAIN_QRY 인라인 뷰로 감싼 뒤 sort 조건을 추가하기 때문이었다. 이 경우 sort key에서 테이블 alias를 제거해야 하며, JdbcPagingItemReader의 내부 쿼리 생성 방식을 이해하는 것이 데이터 누락과 SQL 오류를 예방하는 데 중요하다.

  • JdbcPagingItemReader는 OFFSET이 아니라 이전 페이지 마지막 sort key를 기준으로 다음 페이지를 조회한다.
  • 페이지 경계에서 데이터가 누락되지 않도록 정렬 키는 고유하고 안정적인 컬럼으로 선택한다.
  • GROUP BY가 있으면 MySqlPagingQueryProvider가 결과를 MAIN_QRY 인라인 뷰로 감싸므로 sort key에 테이블 alias를 붙이지 않는다.
  • 프레임워크의 쿼리 생성 코드를 확인하면 예상과 다른 페이징 동작과 SQL 오류의 원인을 찾을 수 있다.

소개

JdbcPagingItemReader와 MySqlPagingQueryProvider를 사용할 때 주의사항

비슷한 학습 자료

문서 이창섭

AccessBlock, 그 시작과 진화의 여정

백엔드 데브옵스 · 인프라

문서 김동호

DB Connection과 Garbage Collector의 관계를 중심으로 mysql-connector-j 사용 시 발생할 수 있는 메모리 누수를 탐지하고 해결한 경험을 공유합니다.

백엔드 데이터베이스

문서 호선우

COMMIT, MVCC 그리고 SET AUTOCOMMIT

데이터베이스

문서 유형환

애플리케이션, DB 모두 행복한 BULK 처리

백엔드 데이터베이스

문서 박제희

DB에 저장을 했는데, 조회가 안 돼요

백엔드 데이터베이스

문서 허재진

컬리 데이터 파이프라인의 BigQuery 도입 결과 및 효과

데이터베이스 데브옵스 · 인프라