모르지 않다는 것은 아는것과 다르다.

Spring Batch

ItemProcessor

채마스 2022. 2. 27. 01:21

ItemProcessor

 

  • ItemWriter에 데이터를 보낼지 말지를 결정함
    • ItemReader에서 null을 리턴하면 chunk처리가 끝났다는 의미
    • ItemProcessor에서 null을 리턴하면 ItemWriter에서 해당 item을 처리하지 않겠다는 의미
  • ItemProcessor는 필수는 아니지만, 책임 분리를 위해 사용하는 것이 좋다.
  • 구현은 아래와 같이 할 수 있다.
@Service
public class PlayerSalaryService {

    public PlayerSalaryDto calcSalary(PlayerDto player) {
        int salary = (Year.now().getValue() - player.getBirthYear()) * 1000000;
        return PlayerSalaryDto.of(player, salary);
    }
}
  • processor 에서 사용할 서비스를 구현한다.
@JobScope
@Bean
public Step flatFileStep(FlatFileItemReader<PlayerDto> playerFileItemReader,
                            ItemProcessor<PlayerDto, PlayerSalaryDto> playerSalaryItemProcessor,
                            FlatFileItemWriter<PlayerSalaryDto> playerFileItemWriter
                            ) {
    return stepBuilderFactory.get("flatFileStep")
            .<PlayerDto, PlayerSalaryDto>chunk(5)
            .reader(playerFileItemReader)
            .processor(playerSalaryItemProcessor)
            .writer(playerFileItemWriter)
            .build();
}

@StepScope
@Bean
public ItemProcessor<PlayerDto, PlayerSalaryDto> playerSalaryItemProcessor(PlayerSalaryService playerSalaryService) {
    return new ItemProcessor<PlayerDto, PlayerSalaryDto>() {
        @Override
        public PlayerSalaryDto process(PlayerDto item) throws Exception {
            return playerSalaryService.calcSalary(item);
        }
    };
}
  • 위와 같이 ItemProcessor 를 구현해 줄 수 있다.
  • 물론 람다식을 이용해서 더 간단하게 아래처럼 더 간단하게 바꿀 수 있다.
@StepScope
@Bean
public ItemProcessor<PlayerDto, PlayerSalaryDto> playerSalaryItemProcessor(PlayerSalaryService playerSalaryService) {
    return playerSalaryService::calcSalary;

}

 

 

ItemProcessorAdapter

  • ItemProcessorAdapter 를 사용하면 좀더 간단하게 processing 할 수 있다.
@JobScope
@Bean
public Step flatFileStep(FlatFileItemReader<PlayerDto> playerFileItemReader,
                            ItemProcessorAdapter<PlayerDto, PlayerSalaryDto> playerSalaryItemProcessorAdapter,
                            FlatFileItemWriter<PlayerSalaryDto> playerFileItemWriter
                            ) {
    return stepBuilderFactory.get("flatFileStep")
            .<PlayerDto, PlayerSalaryDto>chunk(5)
            .reader(playerFileItemReader)
            .processor(playerSalaryItemProcessorAdapter)
            .writer(playerFileItemWriter)
            .build();
}
@StepScope
@Bean
public ItemProcessorAdapter<PlayerDto, PlayerSalaryDto> playerSalaryItemProcessorAdapter(PlayerSalaryService playerSalaryService) {
    ItemProcessorAdapter<PlayerDto, PlayerSalaryDto> adapter = new ItemProcessorAdapter<>();
    adapter.setTargetObject(playerSalaryService);
    adapter.setTargetMethod("calcSalary");
    return adapter;
}
  • 위와 같이, adapter.setTargetObject(playerSalaryService) processor 에 사용할 서비스를 지정해준다.
  • adapter.setTargetMethod("calcSalary") 에서 메소드를 지정해준다.




  • 황지연님의 스프링 배치

'Spring Batch' 카테고리의 다른 글

JobExecutionListener  (0) 2022.02.27
ItemWriter  (0) 2022.02.27
ItemReader  (0) 2022.02.27
Tasklet, Chunk 비교  (0) 2022.02.27
Spring Batch  (0) 2022.02.27