Batch ItemReader의 페이지 처리 문제

KangWook·2024년 11월 15일
0

현상:

  • 기존 코드가 currentPage를 증가시키며 페이지 단위로 데이터를 순차적으로 가져오도록 설계되었음.
    하지만, fetchNextPage에서 매번 currentPage가 증가해 다음 페이지로 이동하지 못하는 문제가 발생했음.
    결과적으로 항상 첫 페이지(0번 페이지)만 처리되고, 다른 페이지의 데이터는 읽히지 않음.
    원인:

  • currentPage가 증가하지 않는 문제는 아니었으나, 다음 페이지를 요청할 때 반환된 데이터가 비어있을 경우 noMoreData 플래그가 설정되어 데이터 순환이 종료되었음.
    데이터 제공 서비스(CouponServiceClient)가 페이지 기반으로 동작하지 않는 경우도 고려되지 않음.
    해결 방법:

  • fetchNextPage를 실제로 currentPage를 증가시키며 다음 페이지 데이터를 요청하도록 수정.
    한 페이지에서 데이터가 비어도 다음 페이지를 확인하도록 수정.
    서비스의 CouponServiceClient가 올바르게 페이지 데이터를 반환하는지 확인.

최종 코드 비교
기존 코드

private Page<UserCouponDto> fetchFirstPage() {
    Page<UserCouponDto> page = couponServiceClient.getExpiredUserCoupons(
        currentDate, 
        0, // 항상 첫 페이지를 요청
        pageSize
    );

    if (!page.hasContent()) {
        noMoreData = true;
    }

    return page;
}
  • 장점:
    모든 페이지를 순환하며 데이터를 가져옴.
    데이터 전체 처리에 적합.

  • 단점:
    특정 상황에서 페이지 이동을 제한해야 할 경우 부적합.
    첫 페이지만 처리해야 하는 경우 요구사항 충족 불가

수정된 코드

private Page<UserCouponDto> fetchFirstPage() {
    Page<UserCouponDto> page = couponServiceClient.getExpiredUserCoupons(
        currentDate, 
        0, // 항상 첫 페이지를 요청
        pageSize
    );

    if (!page.hasContent()) {
        noMoreData = true;
    }

    return page;
}
  • 장점:
    항상 첫 페이지 데이터만 처리하도록 고정.
    요구사항에 맞게 동작하며 페이지 이동 방지.

  • 단점:
    데이터가 많은 경우, 다른 페이지 데이터는 처리되지 않음.
    첫 페이지 데이터가 업데이트되지 않으면 중복 처리 가능성.

트러블 슈팅 과정 요약

  • 문제 분석:
    초기 페이지 순환 로직 문제를 확인.
    로그를 통해 currentPage와 noMoreData의 상태를 점검.
    CouponServiceClient에서 반환되는 페이지 데이터가 올바른지 확인.

  • 로직 개선:
    페이지 순환 방식에서 항상 첫 페이지를 처리하도록 로직 변경.
    기존 currentPage 증가 로직 제거.

  • 테스트:
    다양한 시나리오에서 데이터 반환과 페이지 이동 여부를 테스트.
    첫 페이지만 처리되는지 확인.

  • 결과:
    두 방식 모두 테스트 및 검증 완료.
    페이지 순환 방식과 첫 페이지 고정 방식 중 요구사항에 따라 선택 가능.

profile
꾸준히 성장하는 개발자

0개의 댓글