본문 바로가기

Reading Record/스프링 배치 완벽 가이드

8장 ItemProcessor

8장 ItemProcessor

ItemProcessor란

itemProcessor는 읽은 데이터를 사용해 특정 작업을 수행할때 사용한다.

  • 입력의 유효성 검증
    • 구 버전에서는 ValidationgItemReader 클래스를 서브클래싱해 ItemReader에서 유효성 검증이 가능하다. 그러나 스프링 배치에서 제공하는 ItemReader는 ValidationgItemReader를 서브클래싱하지 않기 때문에 유효성 검증을 하고 싶을때 바로 사용할 수 있는 스프링 배치 리더가 없다.
    • ItemProcessor가 유효성 검증을 수행하도록 바꾸면 입력 방법에 상관없이 처리 전에 객체의 유효성 검증 가능
  • 기존 서비스의 재사용
    • Adapter를 활용해 기존의 서비스를 재사용하는 방법
  • 스크립트실행
    • 특정 스크립트를 ItemProcessor로 실행해 스프링을 사용하지 않는 환경의 기능도 가져와서 사용가능하다
  • itemProcessor의 체인
    • 각 기능에 맞는 ItemProcessor를 생성해 순차적 실행 가능
    • 동일한 트랜잭션 내에서 단일 아이템으로 여러작업을 수행할 수 있다
  • 참고
    • ItemProcessor는 null 반환시 해당 아이템에 대한 처리 중지
      • 스킵하고 싶은 아이템은 null 반환
      • JobRepository의 데이터로 필터링된 카운트 저장된다 (Batch_step_context)
    • ItemProcessor는 멱등이어햐 하고, 내결함성 시나리오에서 두 번 이상 전달될 수도 있다

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