[개발] Spring boot

[JAVA] 자바 배치 처리: ItemReader, ItemProcessor, ItemWriter

  • -
반응형

 

자바 배치 처리: 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

ItemProcessorItemReader에서 읽은 데이터를 가공하거나 변환하는 역할을 합니다. 비즈니스 로직을 적용하여 데이터를 처리한 뒤 기록할 준비를 합니다.

 

 

 

 

 

주요 특징:

  • 입력 데이터를 받아 처리한 후 변환된 데이터를 반환합니다.
  • 데이터를 필터링할 경우 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는 청크 기반 처리 모델에 의해 결합됩니다. 이 모델은 데이터를 청크 단위로 읽고, 처리하며, 기록하여 성능과 리소스 활용을 최적화합니다.

 

 

 

 

처리 흐름:

  1. ItemReader가 데이터를 청크 단위(예: 10개)로 읽습니다.
  2. 각 항목이 ItemProcessor를 통해 변환됩니다.
  3. 변환된 데이터가 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는 자바 기반 배치 처리의 핵심 구성 요소로, 이를 효과적으로 활용하면 안정적이고 확장 가능한 배치 작업을 구현할 수 있습니다.

이 구성 요소들에 대해 더 궁금한 점이 있다면 댓글로 알려주세요! 😊

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.