www.tutorialspoint.com/spring_batch/spring_batch_architecture.htm
스프링 배치 아키텍처의 구성도입니다.
job과 step을 생성만 했는데 스프링 배치가 실행됐습니다.
스프링 배치는 job타입의 빈이 생성되면 job Launcher객체에 의해 job을 수행합니다.
그럼 job은 step을 수행하게 될 것입니다.
이 Job Repository는 DB, Memory에 스프링 배치가 실행될 수 있도록 배치의 메타데이터를 관리하는 클래스입니다.
Job은 N개의 Step을 실행할 수 있으며, 흐름(Flow)을 관리할 수 있다.
스텝은 순서대로 시작되기 때문이다.
Step의 실행 단위는 크게 2가지로 나누어진다.
chunk 기반 step은 하나의 큰 덩어리를 n개씩 나눠서 실행합니다.
tast 기반 step은 하나의 작업을 기반으로 실행합니다.
Chunk 기반 Step은 ItemReader, ItemProcessor, ItemWriter가 존재합니다.
여기서 Item은 배치 처리 대상 객체를 의미합니다.
-
ItemReader는 배치 처리 대상 객체를 읽어 ItemProcessor 또는 ItemWriter에게 전달합니다. DB 혹은 입력값 혹은 파일에서 Item을 읽겠죠.
-
ItemWriter는 배치 처리 대상 객체를 처리한다. DB 업데이트를 하거나 처리 대상 사용자에게 알림을 보낸다.
-
ItemProcessor는 input 객체를 output 객체로 filtering 또는 processing 해 ItemWriter에게 전달합니다.
-
순서는 다음과 같을 겁니다. ItemReader에서 읽은 데이터를 수정 또는 ItemWriter 대상인지 filtering 한다.
-
ItemProcessor는 optional 하다.
-
ItemProcessor가 하는 일을 ItemReader 또는 ItemWriter가 대신할 수 있다
-
만약 수만 개의 데이터를 처리할 능력이 된다면 Tasklet을 사용하며, 그렇지 않다면 chunk로 분할해서 처리할 수 있습니다.
Tasklet을 사용한 Task 기반 처리
- 배치 처리 과정이 비교적 쉬운 과정에 쉽게 사용할 수 있다.
- 대량 처리를 하는 경우 더 복잡해진다.
- 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합
Chunk를 사용한 chunk기반 처리
- ItemReader, ItemPorcessor, ItemWriter의 관계 이해가 필요하다.
- 대량 처리를 하는 경우 Tasklet 보다 비교적 쉽게 구현
- 만개 데이터를 천 개씩 10개 덩어리로 수행한다면 tasklet은 만개를 한 번에 혹은 수동으로 천 개씩 분할
chunk 기반일 경우 reader에서 null을 return 할 때까지 step이 반복됩니다. 즉 처리할 데이터가 없을 때까지 합니다.
itemReader와 itemProcessor는 하나씩 , ItemWriter은 List형태
@Slf4j
@Configuration
public class ChunkProcessConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public ChunkProcessConfiguration(JobBuilderFactory jobBuilderFactory,
StepBuilderFactory stepBuilderFactory){
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public Job chunkProcessingJob(){
return jobBuilderFactory.get("chunkProcessingJob")
.incrementer(new RunIdIncrementer())
.start(this.taskBaseStep())
.next(this.chunkBaseStep())
.build();
}
@Bean
public Step chunkBaseStep(){
return stepBuilderFactory.get("chunkBaseStep")
.<String,String>chunk(10) //<InputType,OutputType>
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build();
}
private ItemWriter<String> itemWriter() {
return items -> log.info("chunk item size : {}", items.size());
}
//item을 가공하거나, writer로 넘길지 말지 결정 null일경우 writer로 넘어가지 않음
private ItemProcessor<String, String> itemProcessor() {
return item -> item + ", Spring Batch";
}
private ItemReader<String> itemReader() {
return new ListItemReader<>(getItems()); //100개 String list
}
@Bean
public Step taskBaseStep() {
return stepBuilderFactory.get("taskBaseStep")
.tasklet(this.tasklet()) //tasklet으로 100개 한번에 처리
.build();
}
private Tasklet tasklet() {
return (contribution, chunkContext) -> {
List<String> items = getItems();
log.info("task item size : {}",
items.size());
return RepeatStatus.FINISHED;
};
}
private List<String> getItems() {
List<String> items = new ArrayList<>();
for (int i =0; i < 100; i++){
items.add(i + "hello");
}
return items;
}
}
'Spring|Spring-boot > Spring Batch' 카테고리의 다른 글
Spring Batch ItemReader (0) | 2021.03.06 |
---|---|
Spring Batch Parameter (0) | 2021.02.28 |
Spring Batch step 작성해보기 (0) | 2021.02.27 |
Spring Batch Job Repository (0) | 2021.02.27 |
Batch Hello World (0) | 2021.02.27 |
댓글