ItemProcessor에는 고유한 비즈니스 로직이 들어가는 곳이다.
ItemProcessor의 process() 메서드가 null을 반환하면 해당 item은 제외된다.read() 메서드를 호출해 청크를 생성process() 메서드 호출process()에서 null이 반환되면 최종 청크에서 제외ItemWriter에 전달되는 청크 크기는 초반 청크의 크기보다 작아진다.null이 반환되는 경우
null 반환 방식의 데이터 검증을 수행하는 ItemProcessor 구현체ValidatingItemProcessor를 생성하려면 Validator 인터페이스가 필요하다.
org.springframework.batch.item.validator.Validatorpublic interface Validator<T> {
void validate(T value) throws ValidationException;
}
public class CommandValidator implements Validator<Command> {
@Override
public void validate(Command command) throws ValidationException {
// ... 특정 로직에 따라 ValidationException 던지기
}
}
T 제네릭 타입(item의 타입)을 받아 ValidationException을 던지도록 구현하면 된다.
setFilter(true)를 설정해야 ValidationException이 발생했을 때 null이 반환된다.setFilter(false)가 되면 예외가 상위로 전달되어 Step이 실패한다.@Bean
public ItemProcessor<Command, Command> commandProcessor() {
ValidatingItemProcessor<Command> processor =
new ValidatingItemProcessor<>(new CommandValidator());
processor.setFilter(true); // ValidationException 발생 시 필터링 수행
return processor;
}
ValidatingItemProcessor를 setFilter(false)로 설정하면 예외가 상위로 전파된다.Step 실패 → Job 실패러 전파process() 메서드에서 예외를 던지면 동일한 결과를 얻는다.ItemProcessor의 가장 핵심적인 역할은 데이터를 다른 데이터로 변환하는 것이다.ItemReader에서 읽은 데이터는 그대로는 사용하기 어려운 경우가 많다.
ItemProcessor의 제네릭 타입
I : ItemReader로부터 읽은 데이터 타입O : ItemWriter로 전달할 데이터 타입chunk() 메서드의 제네릭 타입과 연결된다.
.<Input, Output>chunk()process() 메서드는 아이템을 하나씩 처리하는 작업이기에 데이터 보강 땜누에 외부 api나 db 조회가 필요한 경우 성능 이슈가 발생할 수 있다.ItemWriterListener의 beforeWrite()를 사용해 이 문제를 개선할 수 있다.
Chunk 전체를 입력 받는다.IN 절로 조회 최적화default void beforeWrite(Chunk<? extends S> items) {
}