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 |