카테고리 없음
[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 기반이 더 효율적.
반응형