-
Tasklet과 ItemReader, ItemProcessor, ItemWriter란?Spring/Spring Batch 2024. 7. 26. 11:46728x90반응형
Tasklet
- 목적: 배치 작업에서 단일 태스크를 정의합니다. 주로 간단한 작업을 수행할 때 사용합니다. , Tasklet은 Step에서 단일 작업을 정의할 때 사용됩니다. 간단한 파일 읽기, 쓰기, 데이터베이스 작업 등에 적합합니다.
- 구현 방법: Tasklet 인터페이스를 구현하고 execute 메서드를 오버라이드하여 작업을 정의합니다.
Tasklet 구현 (MyTasklet)
// MyTasklet.java package com.example.batch; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class MyTasklet implements Tasklet { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { // 파일 읽기 String content = new String(Files.readAllBytes(Paths.get("input.txt"))); // 파일 쓰기 Files.write(Paths.get("output.txt"), content.getBytes(), StandardOpenOption.CREATE); return RepeatStatus.FINISHED; } }
배치 설정 (BatchConfig)
// BatchConfig.java package com.example.batch; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; 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.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableBatchProcessing public class BatchConfig { @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBuilderFactory stepBuilderFactory; @Bean public MyTasklet myTasklet() { return new MyTasklet(); } @Bean public Step step1() { return stepBuilderFactory.get("step1") .tasklet(myTasklet()) .build(); } @Bean public Job job(Step step1) { return jobBuilderFactory.get("job") .incrementer(new RunIdIncrementer()) .flow(step1) .end() .build(); } }
ItemReader, ItemProcessor, ItemWriter
- 목적: 대량의 데이터를 읽고, 처리하고, 쓰는 과정을 구성하는 데 사용됩니다. 이를 통해 더 복잡한 배치 작업을 정의할 수 있습니다.
- 구성 요소:
- ItemReader: 데이터를 읽어들입니다.
- ItemProcessor: 데이터를 처리합니다.
- ItemWriter: 데이터를 씁니다.
예제
ItemReader: 파일에서 데이터를 읽는 예제
public class MyItemReader implements ItemReader<String> { private List<String> data = Arrays.asList("item1", "item2", "item3"); private int index = 0; @Override public String read() { if (index < data.size()) { return data.get(index++); } return null; // 더 이상 읽을 데이터가 없을 때 null 반환 } }
ItemProcessor: 데이터를 처리하는 예제
public class MyItemProcessor implements ItemProcessor<String, String> { @Override public String process(String item) { return item.toUpperCase(); // 데이터를 대문자로 변환 } }
ItemWriter: 파일에 데이터를 쓰는 예제
public class MyItemWriter implements ItemWriter<String> { @Override public void write(List<? extends String> items) { items.forEach(System.out::println); // 데이터를 콘솔에 출력 } }
Step 구성 예제
@Configuration @EnableBatchProcessing public class BatchConfig { @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBuilderFactory stepBuilderFactory; @Bean public ItemReader<String> reader() { return new MyItemReader(); } @Bean public ItemProcessor<String, String> processor() { return new MyItemProcessor(); } @Bean public ItemWriter<String> writer() { return new MyItemWriter(); } @Bean public Step step1() { return stepBuilderFactory.get("step1") .<String, String>chunk(1) .reader(reader()) .processor(processor()) .writer(writer()) .build(); } @Bean public Job job(Step step1) { return jobBuilderFactory.get("job") .incrementer(new RunIdIncrementer()) .flow(step1) .end() .build(); } }
상세 설명
- Tasklet: 한 번의 실행으로 끝나는 간단한 작업을 정의할 때 사용됩니다. 반복적으로 실행될 필요가 없는 경우 적합합니다.
- Chunk-Oriented Processing (ItemReader, ItemProcessor, ItemWriter): 대량의 데이터를 처리하는데 적합한 방법입니다. 데이터를 청크 단위로 나누어 읽고, 처리하고, 쓰는 과정을 반복합니다.
- ItemReader: 데이터를 소스(예: 파일, 데이터베이스)에서 읽습니다.
- ItemProcessor: 읽은 데이터를 원하는 형태로 변환하거나 처리합니다.
- ItemWriter: 처리된 데이터를 최종 목적지(예: 파일, 데이터베이스)에 씁니다.
이렇게 각각의 구성 요소는 배치 작업에서 서로 다른 역할을 수행하며, 작업의 특성에 따라 적절히 선택하여 사용할 수 있습니다. Tasklet은 간단한 작업에 적합하며, ItemReader, ItemProcessor, ItemWriter는 대량 데이터 처리에 적합합니다.
728x90반응형'Spring > Spring Batch' 카테고리의 다른 글
StepContribution 와 ChunkContext[Spring batch] (0) 2024.08.07