본문 바로가기
프로그래밍/SpringBatch

[SpringBatch] 스프링 배치 도메인 간단 정리

by 노잼인간이라불립니다 2022. 6. 26.

Job

 스프링 배치에서 실행되는 작업. / 하나의 배치 작업 그 자체를 의미한다. job과 jobInstance는 1:N 관계

 

JobInstance 

 job은 실행 될때 마다 하나의 잡 인스턴스를 생성함. 인스턴스는 job(jobname)과 jobkey (jobparameter의 해시값)를 통해 식별됨. jobInstance와 jobExecution과의 관계는 1:N이다.

 

Jobparameter 

 잡 인스턴스를 식별하기 위해 사용. jobLauncher가 job을 실행할때 job과 jobparameter를 보내주게됨. 이때 보내진 jobparameter는 Map형식으로 이 jobparameter를 활용하여 jobInstance를 식별하게 됨.

 jobparameter의 타입 종류는 4가지 : String, Date, Long Double 타입을 저장할 수 있다.

 jobInstance와 jobparameter는 1:1관계로 바인딩됨. / jobExecution과 jobparameter의 관계는 1:N

 

JobExecution 

 jobInstance가 실행 될 때마다 생기는 객체로 job 실행 중에 발생한 여러가지 정보를 포함하는 객체(시작시간, 종료시간, 상태(완료, 실패, 시작))

 

Step

 Job을 구성하는 독립적인 하나의 단계. Job은 하나이상의 Step으로 이루어진다.

 chunk 기반의 step과 tasklet기반의 step으로 나누어짐.

    - 구현체

    1. TaskletStep : 가장 기본이 되는 객체, Tasklet 타입이 구현체를 제어한다.

    2. PartitionStep : 멀티스레드 방식으로 Step을 여러개로 분리해서 실행.

    3. JobStep : Step 내부에서 또 job을 실행하는 Step

    4. FlowStep : Step 내부에서 Flow를 실행하는 Step

 

StepExecution

 step이 실행 될 때마다 생성되는 객체. / step 실행 중에 발생한 정보를 저장하고 있다. (시작시간, 종료시간, 상태(시작,완료, 실패)), commit count, rollback count 등의 속성을 가지고 있음.

 step이 실패하면 다음 step은 실행되지 않아 다음 stepExecution객체를 생성하지 않는다.

 job이 재 실행 되면 이미 작업이 완료된 step은 다시 실행하지 않고, 실패했던 step부터 다시 실행된다. 

 jobExecution과 stepExecution은 1:N의 관계. / 하나의 job이 여러개의 Step으로 구성되어 있을 경우에 각 StepExecution은 하나의 jobExecution을 부모로 가진다.

 

StepContribution

 청크의 프로세스 변경사항(ItemReader, ItemProcessor, ItemWriter 과정에서 이루어지는 것들)을 버퍼링 한 후에 StepExecution의 상태를 업데이트(readCount, filterCount, writeCount 등등)하는 도메인 객체 

 말 그대로 stepExecution에 대해 상태정보를 전달하고 업데이트하기 위해 사용하는 객체라고 사용하면 될듯.(청크로 나누어서 실행 됨에 따라서 계속해서 데이터가 execution 객체에 업데이트 되어야 함.)

 

ExecutionContext

키와 값으로 이루어진 객체로 JobExecution 또는 StepExcution 의 객체의 상태를 저장하는 공유 객체이다.

job 재 시작시 이미 처리한 데이터는 건너 뛰고 이후로 수행할 때 상태정보를 활용.

ExecutionContext는 JobExecutionContext와 StepExecutionContext가 있다.

 

- JobExecutionContext

  각 job의 jobExecution에 저장 됨.

  step간에 공유 가능


- StepExecutionContext

  각 step의 stepExecution에 저장됨.

  step간에 공유 불가

 

JobRepository

 배치 작업 중 정보(job에 대한 메타 데이터)를 저장하는 저장소 역할을 한다. (job의 startTime, endTime, 실행 횟수, 실행결과 등.)

 jobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리한다.(db에 저장하는 역할을 모두 담당.)

 

JobLauncher

 배치 job을 실행시키는 역할을 함. job과 jobParameter을 인자로 받으며 배치 작업이 끝나면 최종 client에게 JobExecution을 반환한다.

 springboot batch가 구동 되면 jobLauncher 빈이 자동 생성된다.

 

- job 실행

 jobLauncher.run(Job,JobParameters) 로 실행한다.

 JobLauncherApplicationRunner가 자동으로 jobLauncher를 실행시킴.

 

- job은 동기, 비동기로 처리할 수 있다.

동기실행(스케줄러에 의한 실행 배치처리시간 상관없음.)

jobLauncher의 디폴트 실행 규칙은 동기로 되어있음.

 

- 비동기실행(http요청에 의한 배치처리 (응답이 늦어지지 않게 함.)

비동기 실행하기 위해서는 jobLauncher의 taskExecutor를 아래와 같이 설정해주어야 한다.

jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor())