본문 바로가기
Java & Kotlin/Spring Batch

[Spring Batch] 스프링 배치 도메인 - Step, 나머지

by heekng 2022. 5. 28.
반응형

스프링 배치의 도메인 - Step, 나머지

Step

  • 스프링 배치에서 Step이란 Job을 구성하는 하나의 단계로, 실제 배치가 실행되는 처리를 정의하고 컨트롤하는데 필요한 모든 정보를 가지고 있는 도메인 객체이다.
  • 배치 작업을 어떻게 구성하고 실행할 것인지 Job의 세부 작업을 Task 기반으로 설정하고 명세해 놓은 객체이다.
  • 단순한 단인 테스크부터 입력, 처리, 출력과 관련된 비즈니스 로직을 포함하는 모든 설정을 담고 있다.
  • 모든 Job은 하나 이상의 Step으로 구성된다.

Step의 기본 구현체

  • TaskletStep: 가장 기본이 되는 클래스, Tasklet 타입의 구현체들을 제어한다.
  • PartitionStep: 멀티 스레드 방식으로 Step을 여러 개로 분리해서 실행한다.
  • JobStep: Step 내에서 Job을 실행하도록 한다.
  • FlowStep: Step 내에서 Flow를 실행하도록 한다.

StepExecution

  • Step에 대한 한번의 시도를 의미한다.
  • Step 실행 중에 발생한 정보들을 저장하고 있는 객체이다.
    • 시작시간, 종료시간, 상태, commit count, rollback count 등
  • Step이 매번 시도될 때마다 생성되고, 각 Step별로 생성된다.
  • Job이 재시작 하더라도 이미 성공적으로 완료된 Step은 재 실행되지 않고 실패한 Step만 실행된다.
  • 이전 단계의 Step이 실패하였다면 다음 단계의 StepExecution은 생성되지 않는다. 즉, 실제로 실행된 Step만 StepExecution이 생성된다.

StepContribution

  • 청크 프로세스의 변경 사항을 버퍼링 한 후 StepExecution상태를 업데이트하는 도메인 객체
  • 청크 커밋 직전에 StepExecution의 apply 메서드를 호출해 상태를 업데이트 한다.
  • ExitStatus의 기본 종료코드 외 사용자 정의 종료코드를 생성해서 적용할 수 있다.

ExecutionContext

  • 프레임워크에서 유지, 관리하는 키/값으로 된 컬렉션으로 StepExecution 또는 JobExecution 객체의 상태를 젖아하는 공유 객체
  • JOB_EXECUTION, STEP_EXECUTION
  • DB에 직렬화 한 값으로 저장된다.
    • {"key", "value"}
  • 공유범위
    • Step 범위: 각 Step의 StepExecution에 저장되며 Step간 서로 공유되지 않는다.
    • Job 범위: 각 Jbo의 JobExecution에 저장되며 Job간 서로 공유되지 않으며 해당 Job의 Step간 서로 공유된다.
  • Job 재 시작시 이미 처리된 Row 데이터는 건너뛰고 이후로 수행하도록 할 때 상태 정보를 활용한다.

JobRepository

  • 배치 작업 중에 생성된 정보를 저장하는 저장소 역할을 한다.
  • Job이 언제 수행되었고, 언제 끝나고, 몇 번 실행되었는지, 실행에 대한 결과 등의 배치 작업의 수행과 관련된 모든 데이터를 저장한다.
    • JobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리한다.

JobRepository 설정

  • @EnableBatchProcessing 어노테이션 선언 시 JobRepository가 자동으로 빈으로 생성된다.
  • BatchConfigurer 인터페이스를 구현하거나 BasicBatchConfigurer를 상속해서 JobRepository 설정을 커스터마이징 할 수 있다.
  • JDBC 방식: JobRepositoryFactoryBean
    • 내부적으로 AOP 기술을 통해 트랜잭션 처리르 해준다.
    • 트랜잭션 isolation의 기본값은 SERIALIZEBLE로 최고 수준이며, 다른 레벨로 지정할 수 있다.
    • 메타테이블의 Table Prefix를 변경할 수 있다. (기본값 BATCH_)
  • In Memory 방식: MapJobRepositoryFactoryBean
    • 성능 등의 이유로 도메인 오브젝트를 굳이 데이터베이스에 저장하고 싶지 않을 때 사용
    • 보통 Test나 프로토타입의 빠른 개발이 필요할 때 사용한다.

JobLauncher

  • 배치 Job을 실행시키는 역할을 한다.
  • JobJob Parameters를 인자로 받으며 요청된 배치 작업을 수행한 후 최종 client에게 JobExecution을 반환한다.
  • 스프링 부트 배치가 구동되면 JobLauncher 빈이 자동 생성된다.
  • 스프링 부트 배치에서는 JobLauncherApplicationRunner가 자동적으로 JobLauncher을 실행시킨다.

JobLauncher 동기적 실행

  • taskExecutor를 SyncTaskExecutor로 설정할 경우 (기본값: SyncTaskExecutor)
  • JobExecution을 획득하고 배치 처리를 최종 완료한 이후 Client에게 JobExecution을 반환한다.
  • 스케줄러에 의한 배치처리에 적합하다. (배치처리시간이 상관 없는 경우)

JobLauncher 비동기적 실행

  • taskExecutor가 SimpleAsyncTaskExecutor로 설정할 경우
  • JobExecution을 획득한 후 Client에게 바로 JobExecution을 반환하고 배치처리를 완료한다.
  • HTTP 요청에 의한 배치처리에 적합하다.
    • 요청시 배치처리가 완료되기 전에 응답할 수 있다.
반응형