Spring Batch

Spring Batch Chunk 기초학습

jaewoo 2022. 12. 19. 15:56

 

Batch를 처리할 수 있는 방법은 크게 2가지이다.

 

1. Tasklet을 사용항 Task기반 처리

      - 배치 처리과정이 비교적 쉬운 경우 쉽게 사용한다.

      - 대량 처리를 하는 경우 더 복잡하다.

      - 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합하다.

2. Chunk를 사용한 chunk(덩어리) 기반처리

     - ItemReader, ItemProcessor, ItemWriter의 관계 이해필요하다.

     - 대량처리를 하는 경우 Tasklet보다 비교적 쉽게 구현가능

     - 덩어리로 나누어 수행가능

 

코드

 

@Configuration
@RequiredArgsConstructor
public class Practice{
		
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilcerFactory;
        
        
        @Bean
        public Job practiceJob(){
        		return jobBuilderFactory.get("practiceJob")
                			.start(this.practiceStep())
                            .build();
                }
        
        .....

 

JOB을 생성함

 

 .....
 		
        @Bean
        public Step practiceStep(){
				return stepBuilderFactory.get("practiceStep")
                			.<String,String>chunk(5)
                            .reader(this.practiceReader())
                            .processor(this.practiceProcessor())
                            .writer(this.practiceWriter())
                            .build();
                    }

여기서 ItemReader, ItemProcessor, ItemWriter 개념이 나오게 된다.

 

Chunk 기반에 Step 종료 시점은 ItemReader에서 null을 리턴할때까지 Chunk가 반복된다.

ItemReader에서 null을 리턴한다는 것은 처리할 데이터가 없다는 것이기에 당연하다. ItemReader와 ItemProcessor는 Item을 하나씩 처리하는 반면에 ItemWriter는 List로 처리한다. ItemReader는 INPUT 타입에 Item을 하나씩 반환하고 반환한 Item을 Processor 에서 INPUT타입으로 받아서 Processing 한 후에 OUTPUT타입으로 리턴하게 된다.(그래서 Processor는 제네릭이 두개이다- INPUT,OUTPUT)

이 OUTPUT 타입으로 리턴한 Item을 ItemWriter에 전달하게 되는데 ItemWriter는 ItemReader Processor를 거친 후에 OUTPUT을 리스트로 받아 처리하는데 리스트 크기는 Step에서 설정한 ChinkSize이다. ChunkSize 이하로 ItemReader와 ItemProcessor가 반복실행된 후에 마지막으로 ItemWriter를 일괄처리하게 된다.

 

....
	@Bean
    public ItemReader<String> practiceReader(){
    	return new ListItemReader<>(this.getItems());	//getItems는 단순한 문자열 리스트 
    }
    
    @Bean
    public ItemProcessor<String,String> practiceProcessor(){
    	return Item -> "Prcessing + "+item'    
    }
    
    @Bean
    public ItemWriter<String> practicewriter(){
    	return items ->{
        	   log.info("items size => {}",items.size());
                log.info("items 각 페이지 첫번째 요소 ==> {}",items.get(0));
        };
    }
}//end

 

여기서 ItemWriter는 리스트로 받아 처리한다 했는데 job에서 설정한 

5개에 데이터를 받아 처리한다는 걸 보이기위해 log를 찍었다. 이렇게 한다면 item.size는  5가 계속 나오고 첫번째 요소는 5단위로 계속해서 나올 것이다.

 

 

intellij에서 실행시 Program arguments 설정하기

   Modify options 클릭후 Program arguments 체크

밑에 빈칸이 생성되게 되는데 여기서 --spring.batch.job.nams=잡이름 적고 실행하면 실행된다.

앞에 파라미터 이름은 yml에서 설정가능하다