반응형
Spring-Batch의 기본 개념을 정리하고, 간단한 실습 환경부터 연습해보는 포스팅입니다
참고: Spring-Batch 공식문서(4.3.3 기준)
https://docs.spring.io/spring-batch/docs/4.3.3/reference/html/
이동욱님의 블로그
https://jojoldu.tistory.com/324?category=902551
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 |