카테고리 없음

[Spring Batch] ItemReader에 대해 알아보자

Joonfluence 2024. 12. 1. 11:27

Spring Batch에서 ItemReader는 데이터를 읽어오는 역할을 담당하며, 데이터 읽기 방식에는 Cursor 기반Page 기반의 두 가지 주요 옵션이 있습니다. 이 두 방식은 데이터 접근과 메모리 사용 방식에서 차이가 있으며, 각각의 특징과 사용 사례가 있습니다.

1. Cursor 기반 ItemReader

Cursor 기반 접근은 데이터베이스 커서를 열어 한 번에 한 개의 레코드를 순차적으로 읽어옵니다.

특징

  • 순차적 읽기:
    • 데이터를 하나씩 읽기 때문에 메모리 소비가 적습니다.
    • 데이터베이스 커서가 열려 있는 상태에서 작업을 진행.
  • 지속적인 연결:
    • 데이터베이스와의 연결이 작업이 완료될 때까지 유지됩니다.
    • 커밋 주기에 따라 트랜잭션이 갱신될 수 있음.

장점

  • 메모리 효율적: 한 번에 한 레코드만 처리.
  • 간단한 설정: 대부분의 경우 기본적인 JdbcCursorItemReader 구현으로 충분.

단점

  • 데이터베이스 연결이 길게 유지됨: 대량 데이터 처리 시 문제가 될 수 있음.
  • 네트워크 지연에 민감: 데이터베이스 커넥션이 안정적이어야 함.

사용 사례

  • 데이터 양이 크지 않은 경우.
  • 트랜잭션 안전성이 중요한 경우.
  • 연속적인 데이터 처리에 적합.

예제

@Bean
@StepScope
public JdbcCursorItemReader<MyEntity> cursorItemReader(DataSource dataSource) {
    JdbcCursorItemReader<MyEntity> reader = new JdbcCursorItemReader<>();
    reader.setDataSource(dataSource);
    reader.setSql("SELECT id, name, value FROM my_table");
    reader.setRowMapper(new BeanPropertyRowMapper<>(MyEntity.class));
    return reader;
}

2. Page 기반 ItemReader

Page 기반 접근은 데이터를 페이지 단위로 읽어옵니다. 한 번의 데이터베이스 호출로 여러 레코드를 가져옵니다.

특징

  • 배치 읽기:
    • 데이터베이스에서 설정된 크기(페이지 크기)만큼 데이터를 한 번에 가져옵니다.
    • 커서 대신 LIMIT과 OFFSET을 사용해 페이징 처리.
  • 끊어진 연결:
    • 각 페이지 요청마다 데이터베이스와 새 연결을 사용.
    • 읽기 완료 후 커넥션이 닫힘.

장점

  • 데이터베이스 연결 효율적: 필요할 때만 연결을 열어 데이터를 읽음.
  • 데이터 병렬 처리 가능: 페이지를 병렬 처리하거나 캐싱할 수 있음.

단점

  • 페이징 쿼리의 성능 문제: 대량 데이터에서 OFFSET이 클 경우 성능 저하.
  • 더 많은 메모리 필요: 한 페이지를 메모리에 로드한 후 처리.

사용 사례

  • 데이터 양이 많거나 병렬 처리가 필요한 경우.
  • 데이터베이스 연결 유지 시간을 최소화하려는 경우.
  • JpaPagingItemReader를 활용한 엔터프라이즈 애플리케이션.

예제

@Bean
@StepScope
public JpaPagingItemReader<MyEntity> pagingItemReader(EntityManagerFactory entityManagerFactory) {
    JpaPagingItemReader<MyEntity> reader = new JpaPagingItemReader<>();
    reader.setEntityManagerFactory(entityManagerFactory);
    reader.setQueryString("SELECT e FROM MyEntity e");
    reader.setPageSize(100);
    return reader;
}

 


3. Cursor 기반과 Page 기반의 비교

특징Cursor 기반Page 기반

데이터 처리 단위 레코드 단위 처리 페이지 단위 처리
데이터베이스 연결 작업 내내 연결 유지 페이지 요청 시 연결
메모리 소비 낮음 높음 (페이지 크기만큼 데이터 유지)
처리 속도 작은 데이터셋에 적합 대규모 데이터에 적합
병렬 처리 어려움 가능 (페이지 병렬 처리)
성능 커넥션 안정성이 중요 페이징 쿼리 성능이 중요
사용 사례 연속적인 읽기, 트랜잭션 중요 작업 대규모 데이터, 병렬 처리 필요 작업

4. 선택 기준

  • 데이터 크기: 데이터가 크다면 Page 기반, 작다면 Cursor 기반.
  • 데이터베이스 연결 시간: 연결을 짧게 유지하고 싶다면 Page 기반.
  • 트랜잭션 요구사항: 트랜잭션이 중요한 경우 Cursor 기반.
  • 성능 요구: 페이징 쿼리가 최적화된 경우 Page 기반이 더 효율적.
반응형