인프런 커뮤니티 질문&답변

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

스프링 배치

DB - JdbcCursorItemReader

jdbcCursorReader, jdbcPagingReader 질문

작성

·

40

0

안녕하세요 jdbc 를 통해 데이터를 읽어오는 점에 대해 질문이 있습니다.

@Bean
public ItemReader<Customer> jdbcCursorItemReader() {
    return new JdbcCursorItemReaderBuilder<Customer>()
        .name("jdbcCursorItemReader")
        .fetchSize(10)
        .dataSource(dataSource)
        .sql(
            "select id, firstName, lastName, birthDate from customer where firstName like ? order by lastName, firstName")
        .beanRowMapper(Customer.class)
        .queryArguments("A%")
        .build();
}

여기서 fetchSIze 는 db 에서 한번에 가져올 레코드 수이고

 

@Bean
public ItemReader<Customer> jdbcPagingReader() throws Exception {
    Map<String ,Object> paramMap = new HashMap<>();
    paramMap.put("firstName", "H%");

    return new JdbcPagingItemReaderBuilder<Customer>()
        .name("jdbcPagingReader")
        .dataSource(dataSource)
        .fetchSize(3)
        .pageSize(3)
        .queryProvider(pagingQueryProvider())
        .parameterValues(paramMap)
        .beanRowMapper(Customer.class)
        .build();
}

여기 페이징 방식에는 fetchSize, pageSize 두개를 둘 다 사용할 수 있던데 차이가 정확인 뭔가요? pageSize는 설정 시 쿼리에 Limit 설정 수가 추가되어 나가는 것은 확인했습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
hoonseung님, jdbcCursorReaderjdbcPagingReader에서 사용되는 fetchSizepageSize의 차이에 대해 설명드리겠습니다.

jdbcCursorReaderjdbcPagingReader 모두 Spring Batch에서 데이터를 읽어올 때 사용할 수 있는 방법이지만, 그 동작 방식이 다릅니다.

  1. JdbcCursorItemReader:

    • fetchSize: 데이터베이스에서 한 번에 가져올 레코드의 수를 지정합니다. 커서 기반으로 데이터를 순차적으로 가져오기 때문에 메모리 효율 측면에서 주의가 필요합니다. fetchSize는 쿼리가 실행될 때 JDBC 드라이버에 커서가 한 번에 가져올 수 있는 행 수를 조정합니다. 그렇지만, 전체 데이터를 순차적으로 가져오기 때문에 대량의 데이터를 다룰 때는 메모리 소모가 많을 수 있습니다.
  2. JdbcPagingItemReader:

    • fetchSize: 내부적으로 사용되는 JDBC의 Fetch Size입니다. 데이터베이스에서 페이지를 가져올 때 사용할 수 있는 선택 사항이며, 어디까지나 JDBC 드라이버에 최적화된 설정입니다.
    • pageSize: 각 페이지에 포함될 레코드 수를 지정합니다. 결과적으로 SELECT ... LIMIT pageSize와 같은 형태로 쿼리가 보내집니다. 이 방식은 대량의 데이터를 처리할 때 메모리를 절약할 수 있습니다. 데이터베이스에서는 pageSize 값에 따라 쿼리가 여러 번 실행되며, 한 페이지씩 데이터를 가져옵니다. 즉, 대량의 데이터라도 메모리 사용을 최소화하며 처리할 수 있는 장점이 있습니다.

종합하자면, jdbcCursorReader는 단순 반복을 통해 데이터를 가져오지만, jdbcPagingReader는 페이지 단위로 나누어 데이터베이스에 여러 번 쿼리를 보내 데이터를 가져옵니다. jdbcPagingReader의 페이징 방식은 메모리 사용량을 줄여 대량 데이터 처리 시 안정성을 제공합니다. pageSize는 전체 데이터의 페이지 크기를 의미하는 반면, fetchSize는 데이터베이스에서 한 번에 가져올 레코드 수를 의미합니다. 이러한 차이를 이해하신다면, 상황에 맞게 알맞은 Reader를 선정하여 사용할 수 있을 것입니다.

추가적인 설명이 필요하시다면 언제든지 질문해 주세요!

참고 URL:
- Spring Data JPA - Reference Documentation

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

질문하기