안녕하세요.
이번 포스트에서는 스프링 배치에서 비즈니스 로직을 담당하고 있는 processor를 학습 하겠습니다.
read 부분은 앞에서의 포스트 부분과 동일합니다.
https://junlab.tistory.com/274
processor는 생략이 가능한데, job에 추가를 하도록 하겠습니다.
1. processor 추가
@JobScope
@Bean
public Step flatFileStep(FlatFileItemReader<PlayerDto> playerFileItemReader,
ItemProcessor<PlayerDto, PlayerSalaryDto> playerSalaryItemProcessor
) {
return stepBuilderFactory.get("flatFileStep")
.<PlayerDto, PlayerSalaryDto>chunk(5)
.reader(playerFileItemReader)
.processor(playerSalaryItemProcessor)
.writer(new ItemWriter<>() {
@Override
public void write(List<? extends PlayerSalaryDto> items) throws Exception {
items.forEach(System.out::println);
}
})
.build();
}
playerSalaryItemProcessor는 아직 만들지 않았습니다. 일단은 processor를 추가하였는데요. 읽을 때는 PlayerDto로 읽고, 쓸 때는 PlayerSalaryDto로 쓰게 되겠습니다. 프로세스 단에서 작업을 처리하고 PlayerSalaryDto로 변경을 해주고 write로 넘겨 주시면 되겠습니다.
2. playerSalaryItemProcessor 작성
@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에서는 ItemProcessor를 반환해주면 되고, ItemReader에서는 ItemReader를 반환 해주시면 되겠습니다. 특정 기능이 추가 되는 내용이 있다면 각각의 스텝 안에서 ItemReader나 ItemProcessor를 구현한 객체를 사용해서 반환해주면 되고요. 스프링 배치는 큰 틀을 익히게 되면 필요로 하는 기능은 문서들을 보고 찾아서 사용을 해주시면 되겠습니다.
ItemProcessor에서는 연봉을 추가 하였고 서비스단을 만들어서 PlayerSalaryDto를 반환 하도록 하였습니다.
3. 서비스단 로직 작성
@Service
public class PlayerSalaryService {
public PlayerSalaryDto calcSalary(PlayerDto player) {
int salary = (Year.now().getValue() - player.getBirthYear()) * 1000000;
return PlayerSalaryDto.of(player, salary);
}
}
서비스 로직을 분리 하였습니다. 서비스 로직을 분리 후에 호출은 배치 내의 프로세스에서 호출만 하도록 하였습니다.
호출을 하게 되면 연봉 부분이 추가 된 모습을 보실 수 있습니다.
프로세스에는 프로세스를 작성해서 사용할 수도 있지만 adapter를 사용할 수도 있습니다.
@StepScope
@Bean
public ItemProcessorAdapter playerSalaryItemProcessorAdapter(
PlayerSalaryService playerSalaryService) {
ItemProcessorAdapter<PlayerDto, PlayerSalaryDto> adapter = new ItemProcessorAdapter<>();
adapter.setTargetObject(playerSalaryService);
adapter.setTargetMethod("calcSalary"); // playerSalaryService의 메소드명을 명시
return adapter;
}
Adapter를 사용하면 구현이 되어 있는 서비스 로직을 adapter를 부착 시켜주시고 step에서 호출을 해주시면 되겠습니다.
'Programming > Spring Batch' 카테고리의 다른 글
[Spring Batch] 스프링 배치를 활용 하여 파일 읽기 (reader) (0) | 2022.04.11 |
---|---|
[Spring Batch] job, step 작업 전-후 확인을 위한 listener(리스너) (0) | 2022.04.07 |
[Spring Batch] 스프링 배치 파라미터 입력 및 검증 (0) | 2022.04.05 |
[Spring Batch] 스프링 배치 테스트 코드 작성 (0) | 2022.04.01 |
[Spring Batch] 스프링 배치로 데이터를 읽고 쓰기 예제 (itemXXX 사용) (0) | 2022.03.31 |