Spring Batch

Spring Batch 동작 순서 (Step)

jaewoo 2022. 12. 16. 21:36

 

Batch는 Job 타입에 빈이 생성되면 Job launcher 객체에 의해서 Job을 실행한다. 

Job launcher가 Job을 실행하고 Job은 Step을 실행하게 되는 구조이다.

여기서 Job Repository라는 클래스가 등장하는데 이건 DB 또는 메모리에 Batch가 실행할 수 있도록 Meta 데이터를 관리하는 클래스이다. 

 

JOB은 Batch에 실행단위이고 Step은 Job에 세부 실행단위이다. Job은 n개에 Step을 실행할 수 있고 Step에 흐름을 관리할 수 있다 --> Job Flow

하나에 Job이 A Step을 실행한 후 조건에 따라 B Step 또는 C Step을 실행 할 수 있다. 아니면 모두를 설정도 가능하다.

 

Step의 실행 단위 2가지

  •       Chunk -> 하나의 큰 덩어리를 n개씩 나눠서 실행(ItemReader, ItemProcessor, ItemWriter)
  •       Task   -> 하나의 작업 기반으로 실행한다.

Chunk 기반에는 ItemReader , ItemProceesor, ItemWriter가 있고 여기서 Item은 배치 처리 대상 객체를 의미한다.

 

1. ItemReader는 배치 처리대상 객체를 읽어서 ItemProcessor 또는 ItemWriter에게 전달한다.(DB에서 데이터를읽음 또는 파일)

2.ItemProcessor는 input 객체를 output객체로 filtering 또는 processing 해 itemWriter에게 전달한다.

    (ItemProcessor가 하는 일을 ItemReader 또는 ItemWriter가 대신할 수 있다)

3. ItemWriter는 배치처리 대상 객체를 처리한다.

    (DB 데이터를 저장하거나 처리 대상 사용자에게 알림을 보낼 수 있다)

 

 

 

        @JobScope
        @Bean("planTextStep")   //chunk 기반임 tasklet 기반 아님
        public Step planTextStep(ItemReader planTextReader,
                                 ItemProcessor planTextProcessor,
                                 ItemWriter planTextWriter){
            return stepBuilderFactory
                    .get("planTextStep")
                    .<PlanText,String>chunk(5)//(읽어올 타입, 프로세싱할 타입)chunk 사이즈도 맞춰야함
                    .reader(planTextReader)
                    .processor(planTextProcessor)
                    .writer(planTextWriter)
                    .build();
        }

 

 

- ItemReader 빈으로 등록할때 타입은 RepositoryItemReader<Entity> 이다.

new RepositoryItemReaderBuilder<Entity>()
                    .name("이름")
                    .repository(repository)
                    .methodName("repository에 선언한 메소드")   //repository 클래스에서 지정한 메소드이름
                    .pageSize(5)    //5개에 데이터씩 읽는다.
                    .arguments(List.of())    //(여기서는 Pageable만 매개변수로 받기에 빈 리스트)findBy에 Pageable을 통해 넘어가는 건 자동으로 넘어가는데  다른조건이나 파라미터가 있다면 여기에 리스트를 통해 넘겨야함
                    .sorts(Collections.singletonMap("id", Sort.Direction.DESC))    //어떤순서로 데이터 가져올지(id DESC를 Map으로)
                    .build();

 

- ItemProcessor 는 타입이 ItemProcessor<input,output> 이다.

@StepScope
@Bean
public ItemProcessor<Entity,String> testItemPRocessor(){
	return item -> "변환 데이터"+item.getter();
    }

여기서 item은 맨 위에 설명에서 나왔던 item이다.

 

-itemWriter 에 반환 타입도 ItemWriter<String> 이런식이다.

@StepScope
@Bean
public ItemWriter<String> testItemWriter(){
	return items -> {
    		repository.saveAll(items);
            //items.forEach(System.out::println)  가능
            //위에 Reader에서 설정한 chunkSize 만큼 크기이다
        };