ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Tasklet과 ItemReader, ItemProcessor, ItemWriter란?
    Spring/Spring Batch 2024. 7. 26. 11:46
    728x90
    반응형

     

    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
Designed by Tistory.