반응형

안녕하세요.

이번 포스트에서는 스프링 배치에서 비즈니스 로직을 담당하고 있는 processor를 학습 하겠습니다.

read 부분은 앞에서의 포스트 부분과 동일합니다.

https://junlab.tistory.com/274

 

[Spring Batch] 스프링 배치를 활용 하여 파일 읽기 (reader)

이번 포스트에서는 스프링 배치를 활용하여 파일을 읽어 보겠습니다. 1. sample 파일을 하나 만들어주세요. ID,lastName,firstName,position,birthYear,debutYear AbduKa00,Abdul-Jabbar,Karim,rb,1974,1996 AbduR..

junlab.tistory.com

 

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);
    }
}

서비스 로직을 분리 하였습니다. 서비스 로직을 분리 후에 호출은 배치 내의 프로세스에서 호출만 하도록 하였습니다.

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에서 호출을 해주시면 되겠습니다.

반응형

+ Recent posts