프로그래밍 노트/SPRING BATCH

[SPRING BATCH] Job/Step 구성

깡냉쓰 2023. 10. 3. 13:28
728x90
반응형

1. JobBuilder

  • Job과 Step을 쉽게 생성/설정할 수 있도록 util 성격의 빌더 클래스

JobBuilderFactory

  • JobBuilder를 생성하는 팩토리 클래스 - get(name: String)
  • jobBuilderFactory.get("jobName")
    • "jobName"은 스프링 배치가 Job을 실행시킬 때 참조하는 Job의 이름
    • 메타 테이블에 해당 이름으로 Job이 관리됨

JobBuilder

  • Job 구성 설정 조건에 따라 두 개의 하위 빌더 클래스를 생성하고 실제 Job생성을 위임함
  • SimpleJobBuilder
    • SimpleJob을 생성하는 Builder 클래스
  • FlowJobBuilder
    • FlowJob을 생성하는 Builder 클래스

2. SimpleJob

  • Step을 실행시키는 Job 구현체
  • SimpleJobBuilder에 의해 생성
  • 여러 단계의 Step으로 구성될 수 있으며, Step을 순차적으로 실행시킴
  • 모든 Step의 실행이 성공해야 Job이 성공적으로 완료된다.
  • 맨 마지막에 실행한 Step의 BatchStatus가 Job의 최종 BatchStatus가 된다.
fun job(): Job {
  return jobBuilderFactory.get("sampleJob") // JobBuilder 생성
    .start(step1()) // 처음 실행할 Step 설정, SimpleJobBuilder 반환
    .next(step2())
    .incrementor(jobParameterIncrementer)
    .validator(jobParameterValidator()) // JobParameter를 실행하기전 검증
    .listener(jobExecutionListener()) // Job 라이프사이클 콜백
    .build() // SimlpeJob 생성
}

validator()

  • Job 실행에 꼭 필요한 파라미터를 검증하는 용도
  • DefaultJobParameterValidator를 제공하며 복잡한 제약조건은 JobParameterValidator를 구현하여 사용
    • Job실행시점에 JobParameters를 매개변수로 받아 검증

메타테이블 접근 시점


3. StepBuilder

StepBuilderFactory

  • StepBuilder 생성하는 팩토리 클래스 - get(name: String)
  • StepBuilderFactory.get("stepName")
    • "stepName"으로 Step 생성

StepBuilder

  • Step 구성 설정 조건에 따라 다섯 개의 하위 빌더 클래스를 생성하고 실제 Step생성을 위임함
  • TaskletStepBuilder
    • Tasklet 생성 (Tasklet 구현체를 실행)
    • tasklet(taslket)
  • SimpleStepBuilder
    • Tasklet 생성, 내부적으로 청크기반의 작업을 처리하는 ChunkOrientedTasklet 생성
    • chunk(size)
  • PartitionStepBuilder
    • PartitionStep 생성, 멀티 스레드 방식으로 Job 실행
  • JobStepBuilder
    • JobStep 생성, Step안에서 Job을 실행
  • FlowStepBuilder
    • FlowStep 생성, Step안에서 Flow 실행

4. Tasklet

  • RepeatTemplate를 사용해서 Tasklet 구문을 트랜잭션 경계 내에서 반복해서 실행
  • Task 기반과 Chunk 기반으로 나누어서 Tasklet 실행
  • TaskletStep에 의해 반복적으로 수행되며 반환값에 따라 계속 수행 혹은 종료됨
    • RepeatStatus - Tasklet의 반복 여부 상태 값
      • RepeatStatus.FINISHED - Tasklet 종료, RepeatStatus null 로 반환하면 RepeatStatus.FINISHED로 해석
      • RepeatStatus.CONTINUABLE - Tasklet 반복
  • Step에 오직 하나의 Tasklet설정만 가능하며 두개 이상 설정 했을 경우 마지막 설정한 객체 실행

Task vs Chunk

  • Task
    • ItemReader, ItemWriter 같은 청크 기반의 작업보다 단일 작업 기반으로 처리되는 것이 더 효율적인 경우 사용
    • Tasklet을 구현하여 사용하며, 대량 처리하는 경우 적합하지 않음(복잡한 구현이 필요하므로)
  • Chunk
    • 하나의 큰 덩어리를 n개씩 나누어서 실행하다는 의미로 대량 처리에 적합함
    • ItemReader, ItemProcessor, ItemWriter를 사용하며 청크 기반 전용 Tasklet은 ChunkOrientedTasklet 구현체 제공

fun step(): Step {
  return stepBuilderFactory.get("simpleStep") // StepBuilder 반환
    .tasklet(tasklet()) // TaskletStepBuilder 반환
    .startLimit(10) // 실행 횟수를 설정
    .allowStartIfComplete(true) // Step 성공,실패와 상관없이 항상 Step을 실행하기 위한 설정
    .build
}

// Task 기반
stepBuilderFactory.get("simpleStep").tasklet(..).build()

// Chunk 기반
stepBuilderFactory.get("simpleStep").<String, String>chunk(100).reader(..).writer(..).build()

5. JobStep

  • Job에 속하는 Step 중 외부 Job을 포함하고 있는 Step
  • 외부의 Job이 실패하면 해당 Step이 실패하므로 최종 기본 Job도 실패함
  • 모든 메타데이터는 기본 Job / 외부 Job 별로 각각 저장된다.
    • Step에 포함되어 있는 Job이지만, 별도의 Job 처럼 메타 테이블에 저장된다
fun jobStep(launcher: JobLauncher): Step {
  return stepBuilderFactory.get("simpleStep")
    .job(job()) // jobStep 내 에서 실행될 Job 설정
    .launcher(launcher) // job을 실행할 JobLauncher 설정
    .parametersExctractor(jobParameterExtractor) // Step의 ExecutionContext를 Job이 실행되는 데 필요한 JobParameter로 변환
    .build()
}
728x90
반응형