현상:
기존 코드가 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 증가 로직 제거.
테스트:
다양한 시나리오에서 데이터 반환과 페이지 이동 여부를 테스트.
첫 페이지만 처리되는지 확인.
결과:
두 방식 모두 테스트 및 검증 완료.
페이지 순환 방식과 첫 페이지 고정 방식 중 요구사항에 따라 선택 가능.