728x90
반응형
SMALL
ItemProcessor는 ItemReader에서 read()로 넘겨준 데이터를 개별로 가공한다. ItemProcessor는 언제 사용할까?
- ItemReader가 넘겨준 데이터를 가공하려고 할 때
- 데이터를 ItemWriter로 넘길지 말지 결정할 때 (null을 반환하면, ItemWriter에 전달하지 않음)
이 ItemProcessor는 필수가 아니다. 필요가 없는 경우는 어떤 경우일까?
- 정말 ItemProcessor가 필요없는 경우. 예를 들면, ItemReader가 데이터베이스에서 데이터를 읽은 뒤 수정없이 그대로 ItemWriter에서 File에 Write하는 경우에는 ItemProcessor가 굳이 필요하지 않다.
- ItemReader나 ItemWriter에서 데이터를 직접 가공까지 하는 경우인데, 이 방법은 추천하지는 않지만 상황에 따라 어쩔 수 없이 ItemReader에서 read할 때, 수정한 데이터를 넘겨주는 경우도 있고, ItemWriter에서 쓰기 전 데이터를 수정해서 write하는 경우가 있다.
ItemProcessor는 어떻게 구현할까?
ItemProcessor는 process를 구현하면 된다. ItemProcessor는 Input과 Output이 있고, Input을 받아서 Output으로 변환한 뒤 반환해야 한다. 이때, Input과 Output의 타입은 같을 수도 있고 다를 수도 있다.
@FunctionalInterface
public interface ItemProcessor<I, O> {
@Nullable
O process(@NonNull I item) throws Exception;
}
다음은, ItemProcessor를 입맛에 맞게 구현한 코드이다.
@Bean
@StepScope
public ItemProcessor<Order, Price> findExpensivePriceProcessor(PriceRepository priceRepository) {
return order -> {
Price price = priceRepository.findByProductId(order.getProductId());
if (price.amount > 1000000L) {
return price;
} else {
return null;
}
};
}
CompositeItemProcessor
자주 사용하지는 않지만, ItemProcessor 여러개를 체인처럼 연결할 때 사용한다. read를 통해 나온 아이템은 processor1 → processor2를 연속적으로 통과한다.
@Bean
@StepScope
public CompositeItemProcessor compositeItemProcessor(ItemProcessor<Order, Order> findExpensivePriceProcessor,
ItemProcessor<Order, Price> priceToPointProcessor) {
List<ItemProcessor> delegates = List.of(findExpensivePriceProcessor, priceToPointProcessor);
CompositeItemProcessor processor = new CompositeItemProcessor<>();
processor.setDelegates(delegates);
return processor;
}
- findExpensivePriceProcessor, priceToPointProcessor를 연속적으로 사용하고자 할 때 이렇게 만들 수 있다.
정리를 하자면
데이터를 받아 가공할 때 사용하는 ItemProcessor를 알아보았다. 이 녀석은 필수는 아니다. 데이터를 가공할 필요가 있을 때 사용하면 된다. 이제 ItemWriter를 알아보자!
728x90
반응형
LIST
'Spring Batch' 카테고리의 다른 글
Listener (1) | 2024.10.09 |
---|---|
ItemWriter (1) | 2024.10.09 |
ItemReader (1) | 2024.10.09 |
Chunk Processing (5) | 2024.10.09 |
Tasklet (0) | 2024.10.09 |