8장 ItemProcessor
ItemProcessor란
itemProcessor는 읽은 데이터를 사용해 특정 작업을 수행할때 사용한다.
- 입력의 유효성 검증
- 구 버전에서는 ValidationgItemReader 클래스를 서브클래싱해 ItemReader에서 유효성 검증이 가능하다. 그러나 스프링 배치에서 제공하는 ItemReader는 ValidationgItemReader를 서브클래싱하지 않기 때문에 유효성 검증을 하고 싶을때 바로 사용할 수 있는 스프링 배치 리더가 없다.
- ItemProcessor가 유효성 검증을 수행하도록 바꾸면 입력 방법에 상관없이 처리 전에 객체의 유효성 검증 가능
- 기존 서비스의 재사용
- Adapter를 활용해 기존의 서비스를 재사용하는 방법
- 스크립트실행
- 특정 스크립트를 ItemProcessor로 실행해 스프링을 사용하지 않는 환경의 기능도 가져와서 사용가능하다
- itemProcessor의 체인
- 각 기능에 맞는 ItemProcessor를 생성해 순차적 실행 가능
- 동일한 트랜잭션 내에서 단일 아이템으로 여러작업을 수행할 수 있다
- 참고
- ItemProcessor는 null 반환시 해당 아이템에 대한 처리 중지
- 스킵하고 싶은 아이템은 null 반환
- JobRepository의 데이터로 필터링된 카운트 저장된다 (Batch_step_context)
- ItemProcessor는 멱등이어햐 하고, 내결함성 시나리오에서 두 번 이상 전달될 수도 있다
- 멱등성 - 연산을 여러번 적용하더라도 결과가 달라지지 않는 성질.
- https://restfulapi.net/idempotent-rest-apis/
- ItemProcessor는 null 반환시 해당 아이템에 대한 처리 중지
ItemProcessor
- ValidatingItemProcessor
- 스프링 배치에서 제공하는 Validator 인터페이스를 활용해 유효성 검증
- 빈 유효성 검증을 위한 자바 사양으로 javax.validation.* 코드를 통해 수행되는 유효성 검증 - 애너테이션을 적용해 구성
- Spring-boot-starter-validation을 통한 jsr-303 유효성 검증 도구의 하이버네이트 구현체 사용
- 스프링 배치 프레임워크가 제공하는 Validator 인터페이스는 코어 스프링 프레임워크의 일부인 Validator 인터페이스와 다르다
- BeanValidatingItemProcessor
- 가장 쉽게 유효성 검증 어노테이션을 동작시키는 ItemProcessor 구현체
- 해당 Processor는 다른 Processor와 연계해서 사용해도 항상 빈으로 띄워야한다.
- ItemProcessorAdapter
- 기존에 존재하던 서비스를 배치 잡 아이템 처리용 프로세서로 재사용
-
@Bean(STEP_NAME + "Processor") @StepScope public ItemProcessor<Customer, Customer> adapterProcessor() { ItemProcessorAdapter<Customer, Customer> adapter = new ItemProcessorAdapter<>(); adapter.setTargetObject(upperCaseNameService); adapter.setTargetMethod("upperCase"); return adapter; }
- 예제 링크
- ScriptItemProcessor
- 스크립트를 ItemProcessor로써 실행할 수 있어서 유연하게 배치 잡에 주입할 수 있다
- 스크립트는 일반적으로 작성과 수정이 용이하므로 자주 변경되는 컴포넌트의 경우 스크립트가 큰 유연성을 제공할 수 있다
- CompositeItemProcessor
- 개별 ItemProcessor를 하나의 Processor로 연결 후 실행 가능
- ItemProcessor를 체인처럼 연결할 수 있으므로 비지니스 로직 내에서도 동일학 책임분담 가능
-
@Bean(STEP_NAME + "Processor") @StepScope public ItemProcessor<Customer, Customer> processor() { CompositeItemProcessor<Customer, Customer> itemProcessor = new CompositeItemProcessor<>(); itemProcessor.setDelegates( Arrays.asList( new ValidatingItemProcessor<>(new UniqueLastNameValidator()), adapterProcessor() ) ); return itemProcessor; }
- 예제링크
- ClassifierCompositeItemProcessor
- 아이템별 ItemProcessor 설정 가능
-
@Bean(STEP_NAME + "Processor") @StepScope public ItemProcessor<Customer, Customer> processor() { ItemProcessor<Customer, Customer> customValidProcessor = new ValidatingItemProcessor<>(new UniqueLastNameValidator()); ClassifierCompositeItemProcessor<Customer, Customer> processor = new ClassifierCompositeItemProcessor<>(); processor.setClassifier(item -> { if (item.getFirstName().length() > 5) { return beanValidProcessor(); } else { return customValidProcessor; } }); return processor; }
- 예제링크
'Reading Record > 스프링 배치 완벽 가이드' 카테고리의 다른 글
[9장] ItemWriter (1) (0) | 2021.12.20 |
---|---|
7장 ItemReader: JDBC 부터 (0) | 2021.11.29 |
7장 ItemReader: Json 까지 (0) | 2021.11.22 |
6장 잡 실행하기 (0) | 2021.11.15 |
5장 JobRepository와 메타데이터 (0) | 2021.10.30 |