본문으로 이동
문서

MySqlPagingQueryProvider 살펴보기

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

원본 보기

소개

JdbcPagingItemReader와 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 오류의 원인을 찾을 수 있다.