개발놀이터

스프링 배치 키워드 정리 본문

Spring/Spring Batch

스프링 배치 키워드 정리

마늘냄새폴폴 2022. 10. 3. 16:40

이제까지 올렸던 키워드들을 바탕으로 정리해보는 시간을 가져보도록 하겠습니다. 

 

 

스프링 배치 키워드

Job

  • Job의 최상위 단위
  • 여러개의 Step을 포함하는 컨테이너
  • JobBuilderFactory를 이용해 생성 가능
  • 여러개의 Job 구현체가 있지만 우리는 그 중 SimpleJob을 메인으로 사용

 

Step

  • tasklet, ItemReader, ItemProcessor, ItemWriter를 포함하는 Job 하나하나의 실행 단위
  • StepBuilderFactory를  이용해 생성 가능
  • 여러개의 Step 구현체가 있지만 기본적으로 사용되는 것은 tasklet을 사용할 때 생성되는 TaskletStep이 있고 TaskletStep을 상속한 Chunk 지향 처리를 사용할 때 생성되는 ChunkOrientedTasklet이 있다. 

 

JobInstance

  • Job이 한번 실행 될 때 생성되고 Job에 대한 정보를 가지고 있는 도메인
  • 같은 JobParameter는 같은 JobInstance를 반환, 같은 JobInstance로 두번 이상 실행 시 오류 발생
  • job_name과 job_parameter를 합친 해시값으로 같은 JobInstance인지 확인할 수 있음
  • BATCH_JOB_INSTANCE 메타 테이블과 매핑

 

JobExecution

  • Job이 실행될 때마다 생성되는 Job의 실행 단위
  • 기본적으로는 같은 JobInstance는 실행이 불가능 하지만 실패한 JobExecution 이력이 있는 경우는 같은 JobInstance를 사용할 수 있다. 
  • BATCH_JOB_EXECUTION 메타 테이블과 매핑

 

JobParameter

  • JobInstance를 구별해주는 인자 값
  • JobParameter의 값에 따라 JobInstance가 달라짐 
  • JobParameter에는 String, Date, Integer, Double 이 네가지 타입만 저장 가능
  • BATCH_JOB_EXECUTION_PARAMS 메타테이블과 매핑

 

StepExecution

  • Step이 실행될 때마다 생성되는 Step의 실행 단위
  • Step이 실패한다면 BATCH_STEP_EXECUTION 테이블에 실패 이력이 저장 StepExecution이 FAILED가 되고 이어서 JobExecution도 FAILED가 된다. 그래서 최종적으로 Job이 실패로 저장
  • BATCH_STEP_EXECUTION 메타테이블과 매핑

 

ExecutionContext

  • 스프링 배치에서 HTTP Session과 같은 역할을 하는 객체
  • JobExecution에서 꺼내는 방법 : Step간 공유 가능, Commit시 데이터가 저장되는데 그 때의 값을 꺼내오는 것
  • StepExecution에서 꺼내는 방법 : Step간 공유 불가능, Job이 실행시 데이터가 저장되는데 그 때의 값을 꺼내오는 것
  • 사용하는 방법이 여러가지인데 tasklet에서 JobExecution, StepExecution을 꺼내 사용하는 방법, Chunk 지향 처리에서 Super클래스를 사용하는 방법, 리스너와 SpEL을 이용해 사용하는 방법 등이 있다.
  • DB에 직렬화 된 값으로 저장됨
  • DB에 저장할 때 2500자의 제한이 있음

 

JobRepository

  • Job에 대한 실행이력, 실행했을 때의 상태 값을 각종 도메인들의 DB와 매핑해주는 객체
  • Job이 언제 수행되었고, 언제 끝났으며, 몇 번이 실행되었고 실행에 대한 결과 등의 배치 작업의 수행과 관련된 모든 meta data를 저장함

 

JobLauncher

  • Job을 실행시키기 위해서만 존재하는 객체
  • 구현체인 SimpleJobLauncher를 통해 Job이 run됨
  • Job과 JobParameter를 인자값으로 받으며 JobExecution을 반환함
  • 동기적 실행 : Job이 전부 완료 되고 JobExecution을 반환함, 스케줄러에 의한 배치 잡에 유용 (배치 처리시간이 길어도 상관 없는 경우)
  • 비동기적 실행 : Job이 실행되자마자 JobExecution을 반환함, HTTP 요청에 의한 배치 잡에 유용 (배치 처리시간이 길어지면 안되는 경우)

 

@JobScope, @StepScope

  • 빈 생성주기인 singleton, prototype, request, application 등과 같은 빈 생성과 실행에 관여하는 Scope
  • @JobScope는 Step에 선언, @StepScope는 tasklet, ItemReader, ItemProcessor, ItemWriter에 선언
  • @Value를 이용해 값을 바인딩
  • 해당 어노테이션이 달려있는 빈은 Proxy 객체로 생성되어 @Value의 값을 Lazy Binding 해줌

 

Chunk

  • Chunk는 트랜잭션의 원자성을 보장해주는 데이터 처리 단위
  • Chunk<I>와 Chunk<O>를 이용해 값을 전달
  • Chunk<I> : ItemReader를 이용해 값을 하나씩 담아놓는 공간
  • Chunk<O> : ItemReader를 이용해 담아온 데이터를 ItemProcessor에 넘겨 데이터를 가공하는데에 쓰이는 공간

 

ChunkProvider

  • ItemReader를 이용해 Chunk Size만큼 반복해 Chunk<I>에 데이터를 쌓는 작업을 하는 객체
  • ChunkProvider가 호출될 때마다 새로운 Chunk가 생성됨

 

ChunkProcessor

  • ChunkProvider가 생성한 Chunk<I>를 가지고 ItemProcessor와 ItemWriter를 이용해 데이터를 가공하고 저장하는 작업을 하는 객체
  • Chunk Size만큼 반복하면서 ItemProcessor로 작업 수행
  • ItemReader, ItemProcessor에서는 Chunk Size만큼 반복하며 하나씩 실행하는 반면 ItemWriter는 Chunk Size만큼 일괄 처리