자바 배치 처리: ItemReader, ItemProcessor, ItemWriter 설명
자바 기반의 배치 처리에서 ItemReader, ItemProcessor, ItemWriter는 데이터를 읽고, 처리하고, 기록하는 데 사용되는 핵심 구성 요소입니다. 이러한 구성 요소는 스프링 배치(Spring Batch)와 같은 프레임워크에서 대규모 데이터 처리를 효율적으로 관리하는 데 널리 활용됩니다.
이번 포스팅에서는 이 구성 요소들의 역할과 동작 원리를 예제를 통해 알아보겠습니다.
1. ItemReader
ItemReader는 데이터 소스(예: 데이터베이스, 파일, API)에서 데이터를 읽어오는 역할을 합니다. 배치 처리 단계의 입력 역할을 담당합니다.
주요 특징:
- 한 번에 하나의 항목(Item)을 읽습니다.
- 읽을 데이터가 없을 경우
null
을 반환합니다.
- CSV, JSON, 데이터베이스 등 다양한 데이터 소스를 처리할 수 있습니다.
일반적인 구현:
- FlatFileItemReader: CSV 또는 텍스트 파일 데이터를 읽습니다.
- JdbcCursorItemReader: 데이터베이스에서 데이터를 읽습니다.
- StaxEventItemReader: XML 파일 데이터를 읽습니다.
예제:
@Bean
public FlatFileItemReader reader() {
return new FlatFileItemReaderBuilder()
.name("csvReader")
.resource(new ClassPathResource("data.csv"))
.delimited()
.names("id", "name", "value")
.fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
setTargetType(MyData.class);
}})
.build();
}
2. ItemProcessor
ItemProcessor는 ItemReader
에서 읽은 데이터를 가공하거나 변환하는 역할을 합니다. 비즈니스 로직을 적용하여 데이터를 처리한 뒤 기록할 준비를 합니다.
주요 특징:
- 입력 데이터를 받아 처리한 후 변환된 데이터를 반환합니다.
- 데이터를 필터링할 경우
null
을 반환하여 다음 단계로 전달되지 않게 할 수 있습니다.
예제:
@Component
public class MyItemProcessor implements ItemProcessor<MyData, MyData> {
@Override
public MyData process(MyData item) throws Exception {
item.setName(item.getName().toUpperCase());
return item;
}
}
3. ItemWriter
ItemWriter는 처리된 데이터를 파일, 데이터베이스 또는 다른 시스템에 기록하는 역할을 합니다.
주요 특징:
- 하나의 항목이 아닌 청크 단위로 데이터를 기록합니다.
- 트랜잭션을 지원하여 데이터의 일관성을 보장합니다.
일반적인 구현:
- FlatFileItemWriter: 데이터를 파일(CSV, 텍스트)로 기록합니다.
- JdbcBatchItemWriter: 데이터를 데이터베이스에 배치 모드로 기록합니다.
- StaxEventItemWriter: 데이터를 XML 파일로 기록합니다.
예제:
@Bean
public JdbcBatchItemWriter writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO my_table (id, name, value) VALUES (:id, :name, :value)")
.dataSource(dataSource)
.build();
}
구성 요소 간의 작동 원리
스프링 배치 작업에서 ItemReader
, ItemProcessor
, ItemWriter
는 청크 기반 처리 모델에 의해 결합됩니다. 이 모델은 데이터를 청크 단위로 읽고, 처리하며, 기록하여 성능과 리소스 활용을 최적화합니다.
처리 흐름:
- ItemReader가 데이터를 청크 단위(예: 10개)로 읽습니다.
- 각 항목이 ItemProcessor를 통해 변환됩니다.
- 변환된 데이터가 ItemWriter로 전달되어 기록됩니다.
설정 예제:
@Bean
public Step step(StepBuilderFactory stepBuilderFactory,
ItemReader reader,
ItemProcessor<MyData, MyData> processor,
ItemWriter writer) {
return stepBuilderFactory.get("step")
.<MyData, MyData>chunk(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
ItemReader, ItemProcessor, ItemWriter의 장점
- 모듈화: 각 구성 요소는 특정 작업에 집중하도록 설계되어 유지보수가 용이합니다.
- 확장성: 청크 기반 모델로 인해 대규모 데이터 처리도 효율적으로 수행 가능합니다.
- 유연성: 다양한 데이터 소스 및 비즈니스 로직에 맞게 커스터마이징이 가능합니다.
- 에러 처리: 각 단계에서 오류 처리 및 재시도를 지원합니다.
결론
ItemReader, ItemProcessor, ItemWriter는 자바 기반 배치 처리의 핵심 구성 요소로, 이를 효과적으로 활용하면 안정적이고 확장 가능한 배치 작업을 구현할 수 있습니다.
이 구성 요소들에 대해 더 궁금한 점이 있다면 댓글로 알려주세요! 😊