1. ItemReader 개요
- ItemReader는 Spring Batch의 핵심 컴포넌트로, 다양한 소스(데이터베 이스, 파일, XML 등)로부터 데이터를 읽어오는 역할을 담당합니다.
- Spring Batch는 다양한 유형의 데이터 소스에 대응하는 ItemReader 구현체를 제공하며, 필요에 따라 커스텀 ItemReader를 개발할 수도 있습니다.
- 배치 처리 성능의 핵심은 ItemReader의 최적화에 있습니다.
1.1 ItemReader 인터페이스 구조
ItemReader 기본 구조
package org.springframework.batch.item;
import org.springframework.lang.Nullable;
@FunctionalInterface
public interface ItemReader<T> {
@Nullable
T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException;
}
- ItemReader 인터페이스는 단일 메서드
read()를 정의하는 함수형 인터페이스입니다. - Spring Batch가 ItemReader의 read 메서드를 호출하면 해당 메서드는 스텝 내에서 처리할 아이템 한 개를 반환합니다.
- 스텝에서는 아이템 개수를 세어서 청크 내의 데이터가 몇 개나 처리됐는지를 관리합니다.
1.2 성능 최적화의 중요성
- Spring Batch 성능의 핵심은 ItemReader의 최적화에 있습니다.
- 데이터 조회 패턴에 따라 성능 차이가 크게 발생할 수 있습니다.
- 예시를 통한 성능 차이:
- 100만 개의 전체 주문 정보를 순차적으로 읽는 경우: 성능에 큰 영향 없음
- 10억 개의 데이터 중 특정 조건에 맞는 100만 개를 조회하는 경우: ItemReader가 전체 배치 작업의 병목이 될 수 있음
- Select 쿼리의 최적화만으로도 상당한 성능 개선을 기대할 수 있습니다.
2. 데이터베이스 기반 ItemReader 종류
- Spring Batch는 데이터베이스에서 데이터를 읽어오는 다양한 ItemReader 구현체를 제공합니다.
- 대표적인 ItemReader 구현체로는 Cursor 기반과 Paging 기반이 있습니다.
2.1 Chunk Processing과 페이징
- 대용량 데이터는 메모리 제약으로 인해 한 번에 처리할 수 없습니다.
- 이를 해결하기 위해 Spring Batch는 Chunk Processing을 도입했습니다.
- 스프링 배치에서는 한 번에 처리할 만큼의 레코드만 로딩하는 별도의 두 가지 방법을 제공합니다.
- 이 두 가지 방법은 Cursor 기반과 Paging 기반입니다.