본문 바로가기
Practice/SpringBatch

Day 5. Spring Batch Chunk

반응형

Spring-Batch의 기본 개념을 정리하고, 간단한 실습 환경부터 연습해보는 포스팅입니다

참고: Spring-Batch 공식문서(4.3.3 기준)

https://docs.spring.io/spring-batch/docs/4.3.3/reference/html/

 

Spring Batch - Reference Documentation

Welcome to the Spring Batch reference documentation! This documentation is also available as single html and pdf documents. The reference documentation is divided into several sections: The following appendices are available: Lucas Ward, Dave Syer, Thomas

docs.spring.io

 

 

이동욱님의 블로그

https://jojoldu.tistory.com/324?category=902551 

 

1. Spring Batch 가이드 - 배치 어플리케이션이란?

Spring Batch In Action이 2011년 이후 개정판이 나오지도 않고 (2019.03 기준), 한글 번역판도 없고, 국내 Spring Batch 글 대부분이 튜토리얼이거나 공식 문서 중 일부분을 짧게 번역한 내용들이라 대용량 시

jojoldu.tistory.com

 


1. Chunk란?

  • Spring Batch 프로세스(ItemReader -> ItemProcessor -> ItemWriter) 과정에서 한 번에 커밋되는 작업 단위

  • ItemReader에서 한번의 아이템(Paging 단위)을 읽고 읽은 아이템을 ItemProcessor로 가공합니다
  • 읽어진 아이템을 Chunk라는 단위로 쌓게되고, 정의된 Chunk 사이즈만큼 쌓이면 ItemWriter로 일괄 전달합니다
  • 트랜잭션 작업은 Chunk 단위로 나눠지고, Commit, Rollback도 Chunk단위로 처리됩니다
  • 관련 코드
    • org.springframework.batch.core.step.item.ChunkOrientedTasklet 클래스내의 execute() 메서드
    • org.springframework.batch.core.step.item.SimpleChunkProcessor에서 Processor와 Writer 관련 로직 확인

 

2. Chunk 사용 예제

  • 간단하게 Chunk의 흐름을 구성해보겠습니다
  • 복잡도를 줄이기 위해 ItemReader는 간단한 텍스트 파일을 순차적으로 읽고 ItemProcessor가 이를 가공 후 ItemWriter가 콘솔 출력을 하는 형태로 구성해봤습니다
  • 예제 코드
    // SimpleChunkJobConfiguration
    @Slf4j
    @RequiredArgsConstructor
    @Configuration
    public class SimpleChunkJobConfiguration {
    
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory;
    
        @Bean
        public Job simpleChunkJob() {
            return jobBuilderFactory.get("simpleChunkJob")
                    .start(simpleChunkStep())
                    .build();
        }
    
        @Bean
        public Step simpleChunkStep() {
            return stepBuilderFactory.get("simpleChunkStep")
                    .<UserDto, String>chunk(5)
                    .reader(flatFileReader())
                    .processor(simpleChunkProcessor())
                    .writer(simpleChunkWriter())
                    .build();
        }
    
        @Bean
        public FlatFileItemReader<UserDto> flatFileReader() {
            return new FlatFileItemReaderBuilder<UserDto>()
                    .name("flatFileReader")
                    .resource(new ClassPathResource("test.txt"))
                    .targetType(UserDto.class)
                    .lineMapper(lineMapper())
                    .build();
        }
    
        @Bean
        public LineMapper<UserDto> lineMapper() {
            DefaultLineMapper<UserDto> lineMapper = new DefaultLineMapper<>();
    
            DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
            lineTokenizer.setNames("name");
    
            BeanWrapperFieldSetMapper<UserDto> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
            fieldSetMapper.setTargetType(UserDto.class);
    
            lineMapper.setLineTokenizer(lineTokenizer); // lineToken
            lineMapper.setFieldSetMapper(fieldSetMapper);
            return lineMapper;
        }
    
        @Bean
        public ItemProcessor<UserDto, String> simpleChunkProcessor() {
            return userDto -> String.format("accept processor => %s", userDto.getName());
        }
    
        @Bean
        public ItemWriter<String> simpleChunkWriter() {
            return items -> System.out.println(String.join(", ", items));
        }
    
    }​
  • 실행 결과

  • job에 설정된 옵션을 보면 chunk size가 5로 설정되어있다
  • 임시 텍스트파일에는 "테스트계정1" ~ "테스트계정20"까지 작성되어있다
  • 동작 순서
    • 즉 ItemReader에서 텍스트파일의 한줄("테스트계정n")을 읽은 후 UserDto를 생성
    • ItemProcessor에서 String으로 변환
    • Chunk 저장소에 설정된 chunk size만큼 모이지 않았다면 다시 ItemReader 수행
    • Chunk 저장소에 설정된 chunk size만큼 모이면 한번에 List로 만들어 ItemWriter로 전달
    • itemWriter에서 전달바은 List만큼 출력
728x90
반응형

'Practice > SpringBatch' 카테고리의 다른 글

Day 4. Spring Batch Scope  (0) 2021.09.09
Day 3. Spring Batch Job 흐름 정의  (0) 2021.09.05
Day 2. SpringBatch Job 메타 테이블이란?  (0) 2021.09.04
Day 1. Spring-Batch 환경 설정  (0) 2021.09.01