Spring Batch - Chunk(청크) 란 ?Spring batch2024. 7. 7. 12:33
Table of Contents
Spring Batch 에서 청크(Chunk)는 데이터를 처리하는 기본 단위이다. 청크 기반 처리 (Chunk - oriented Processing)는 대량의 데이터를 작은 단위(청크)로 나누어 처리하는 방법을 의미한다. 이는 메모리 효율성을 높이고, 트랜잭션 관리를 용이하게 한다.
청크 기반 처리의 주요 개념
- ItemReader:
- 데이터를 읽어오는 역할을 합니다.
- 한 번에 하나의 아이템을 읽어오며, 청크 단위로 모아서 처리합니다.
- ItemProcessor:
- 읽어온 데이터를 처리하는 역할을 합니다.
- 데이터 변환, 필터링, 검증 등을 수행할 수 있습니다.
- 선택 사항으로, 필요하지 않을 경우 생략할 수 있습니다.
- ItemWriter:
- 처리된 데이터를 저장하는 역할을 합니다.
- 한 번에 청크 단위로 데이터를 저장합니다.
- Chunk Size:
- 청크의 크기를 정의합니다.
- 예를 들어, 청크 크기가 10이라면 10개의 아이템을 읽고, 처리하고, 쓴 후에 트랜잭션을 커밋합니다.
청크 기반 처리의 동작 흐름
- 읽기 (Read):
- ItemReader가 데이터를 하나씩 읽어와 청크 크기만큼 모읍니다.
- 처리 (Process):
- 모인 데이터를 ItemProcessor를 통해 하나씩 처리합니다.
- 쓰기 (Write):
- 처리된 데이터를 ItemWriter를 통해 한 번에 저장합니다.
- 커밋 (Commit):
- 청크 단위의 처리가 완료되면 트랜잭션을 커밋합니다.
예제 코드
다음은 청크 기반 처리의 예제 코드입니다. 이 코드는 청크 크기를 10으로 설정하고, 데이터를 읽어와 처리한 후 저장하는 예제입니다.
구성 요소
- ItemReader: 데이터를 읽어오는 역할을 합니다.
- ItemProcessor: 데이터를 처리하는 역할을 합니다.
- ItemWriter: 데이터를 저장하는 역할을 합니다.
예제 코드
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import java.util.Arrays;
import java.util.List;
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.start(step(stepBuilderFactory))
.build();
}
@Bean
public Step step(StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get("step")
.<String, String>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
@Bean
public ItemReader<String> reader() {
List<String> data = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve");
return new ListItemReader<>(data);
}
@Bean
public ItemProcessor<String, String> processor() {
return item -> {
System.out.println("Processing item: " + item);
return item.toUpperCase();
};
}
@Bean
public ItemWriter<String> writer() {
return items -> {
for (String item : items) {
System.out.println("Writing item: " + item);
}
};
}
}
동작 설명
- Job: job 메서드는 Job을 정의합니다. 이 Job은 단일 Step을 실행합니다.
- Step: step 메서드는 Step을 정의합니다. 청크 크기를 10으로 설정하고, ItemReader, ItemProcessor, ItemWriter를 사용하여 데이터를 처리합니다.
- ItemReader: reader 메서드는 데이터를 리스트에서 읽어옵니다.
- ItemProcessor: processor 메서드는 데이터를 대문자로 변환합니다.
- ItemWriter: writer 메서드는 데이터를 콘솔에 출력합니다.
실행 결과
위의 예제를 실행하면 다음과 같은 결과가 콘솔에 출력됩니다:
Processing item: one
Processing item: two
...
Processing item: ten
Writing item: ONE
Writing item: TWO
...
Writing item: TEN
Processing item: eleven
Processing item: twelve
Writing item: ELEVEN
Writing item: TWELVE
청크 크기 10으로 설정된 경우, 10개의 아이템을 읽고, 처리하고, 쓴 후에 트랜잭션이 커밋됩니다. 마지막에 남은 2개의 아이템도 동일한 방식으로 처리됩니다.
이제 청크 기반 처리에 대해 이해하셨을 것입니다. 청크 크기를 적절하게 설정하고, ItemReader, ItemProcessor, ItemWriter를 활용하여 효율적으로 데이터를 처리할 수 있습니다. 다음 단계로는 더 복잡한 시나리오와 성능 최적화 방법을 학습하는 것이 좋습니다.
'Spring batch' 카테고리의 다른 글
Spring Batch - Tasklet(테스크렛) ? (0) | 2024.07.07 |
---|---|
Spring batch 란 ? - 2 (0) | 2024.07.07 |
Spring Batch 란? - 1 (0) | 2024.07.07 |
@Soohocoding :: Soohocoding
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!