발생한 문제

오픈런 상품 페이지를 저장하는 Step에서 페이징 방식을 사용하다보니 offset이 뒤로 밀리면

성능이 극단적으로 저하되는 현상 발생.

@Bean
public JpaPagingItemReader<Product> openRunSaveRedisItemReader() {

    return new JpaPagingItemReaderBuilder<Product>()
            .name("openRunSaveRedisItemReader")
            .entityManagerFactory(entityManagerFactory)
            .queryString("select p from Product p where status= 'OPEN' order by id desc")
            .pageSize(16)
            .build();
}

JpaPagingItemReader로 pagesize를 16으로 설정하고 쿼리 조건문에 맞는 row들을 차례로 페이징 해오는 방식이다. 초반에는 무리가 없으나, OFFSET 값이 증가할수록 데이터베이스는 해당 위치까지의 점점 많은 레코드를 건너뛰어야 함. 이는 데이터베이스가 실제로 해당 위치까지 스캔을 수행해야 하기 때문에, OFFSET 값이 크면 클수록 더 많은 레코드를 스캔해야 하고 이는 성능 저하를 초래하며 쿼리 실행 비용이 높아짐

Untitled

Untitled

❗TMI 기존 코드(Spring Batch 사용 전. 즉, 단순 Scheduling 방식)에서는 다음과 같은 문제를 파악하기 힘들었다. 그러나, Spring Batch 도입 이 후, 불러와야 하는 데이터의 양이 증가했을 때 Paging 방식의 문제를 파악할 수 있었다.

해결 방안

<aside> 💡 커서 방식의 도입(JpaCursorItemReader)

</aside>