
MySqlPagingQueryProvider 살펴보기
두줄요약
MySqlPagingQueryProvider의 sort key 기반 페이지 처리 방식으로 발생한 데이터 누락과 SQL 오류를 분석했습니다. 고유 sort key 사용과 group by 시 별칭 제거로 문제를 해결했습니다.
문제 상황
- JdbcPagingItemReader와 MySqlPagingQueryProvider 기반 Outbox 배치에서 동일한 created_at 값을 가진 데이터 일부 미발행
- group by와 테이블 별칭 포함 sort key 조합에서 두 번째 페이지부터 SQLSyntaxErrorException 발생
원인 분석
- MySqlPagingQueryProvider의 다음 페이지 조회 방식에서 이전 Chunk 마지막 sort key보다 큰 행만 조회
- created_at 중복으로 동일 시각의 나머지 행 필터링
- group by 사용 시 MAIN_QRY 인라인 뷰 생성 후 외부 WHERE 절에서 원본 테이블 별칭 참조
해결 방법
- Outbox 조회 sort key를 고유한 auto_increment id로 변경해 발행 순서와 페이지 누락 방지
- group by 조회의 sort key에서 t1 별칭을 제거하고 컬럼명만 사용
주의할 점
- JdbcPagingItemReader의 sort key에 고유 제약조건이 있는 컬럼 선택
- group clause 사용 시 MySqlPagingQueryProvider의 인라인 뷰 생성과 sort key 참조 범위 확인


