피드로 돌아가기
MySqlPagingQueryProvider 살펴보기
컬리 기술블로그컬리 기술블로그
Backend

MySqlPagingQueryProvider 살펴보기

컬리가 spring-batch의 MySqlPagingQueryProvider 사용 시 sort key에 테이블 alias를 포함하면 데이터 유실이 발생하는 문제 해결

2024년 12월 30일12intermediate

Context

spring-batch의 JdbcPagingItemReader와 MySqlPagingQueryProvider를 사용하여 Transactional Outbox Pattern으로 상품권 상태 변경 이벤트를 배치 처리할 때, 동일 timestamp로 생성된 100개 데이터 중 Chunk 크기만큼만 처리되고 나머지가 유실되는 현상이 발생했다.

Technical Solution

  • MySqlPagingQueryProvider의 Pagination 메커니즘 분석: Where 절에 sort key 조건을 추가하여 페이지 경계를 구분하는 방식 확인
  • sort key 설정 시 테이블 alias 제거: 기존 "t1.merchant_member_id" 형태에서 "merchant_member_id" 컬럼명만 사용하도록 변경
  • GROUP BY 포함 쿼리에서 Inline View 생성 방식 파악: MySqlPagingQueryProvider가 MAIN_QRY라는 Inline View를 자동 생성할 때 Where 절에 alias를 포함하면 컬럼 참조 오류 발생
  • sort key에 Unique 제약조건 컬럼 사용: JdbcPagingItemReader 공식 문서의 권장사항 준수로 데이터 유실 방지

Impact

아티클에 정량적 수치가 명시되지 않았습니다.

Key Takeaway

spring-batch의 MySqlPagingQueryProvider는 Where 절 기반 Pagination을 사용하므로 sort key 설정 시 테이블 alias를 제외하고 컬럼명만 사용해야 하며, GROUP BY 포함 쿼리에서는 생성되는 Inline View 구조를 고려한 설정이 필수적이다.


spring-batch의 JdbcPagingItemReader와 MySqlPagingQueryProvider를 사용하는 배치 애플리케이션에서 sort key 설정할 때 테이블 alias를 제외하고 컬럼명만 사용하면 WHERE 절 기반 Pagination에서 데이터 유실을 방지할 수 있다. 특히 GROUP BY절이 포함된 쿼리에서는 생성되는 MAIN_QRY Inline View 구조로 인해 alias 참조 오류가 발생하므로 주의해야 한다.

원문 읽기