개념이 너무 크기에, 여기서는 간단한 용어들과 개념을 살펴봅니다.
사용법은 추후 포스팅에 작성합니다.
Job
기본 개념
- JobBuilderFactory 를 통해 생성할 수 있다.
- 최상위 개념, 하나의 배치작업 그 자체
- Spring Batch가 기본 구현체(SimpleJob, FlowJob 등) 를 제공한다.
- 여러 Step 을 포함하고 있는 컨테이너로, 반드시 한개 이상의 Step으로 구성해야 한다.
기본 구현체
- SimpleJob
- 순차적으로 Step을 실행하는 Job
- 모든 Job에서 유용하게 사용할 수 있는 표준 기능을 제공한다.
- FlowJob
- 특정한 조건에 따라 Step을 실행할지 말지 구성하여 실행시키는 Job
- Flow 객체를 사용하여 작업을 진행한다.
동작 순서

- BatchAutoConfiguration이 JobLauncherApplicationRunner를 생성
- JobLauncherApplicationRunner 가 execute(Job, JobParameters) 를 실행함
- execute(...) 내부에서 JobLauncher 의 run(Job, JobParameters) 를 실행하여 최종 Job이 실행됨.
JobInstance
기본 개념
- Job이 실행될 때 생성되는 Job의 논리적 실행 단위.
- Job의 설정과 구성은 동일하지만, Job이 실행될 때마다 수행하는 내용은 다르기 때문에 Job 의 실행을 구분하기 위해 필요하다.
- JobParameter 를 해싱하여 Job Key를 만들고, Job(JobName) + Job Key를 통해 실행된 Job을 고유하게 식별할 수 있다.
- 하나의 Job에 대해 동일한 JobParameter 가 사용됐다면, 기존의 JobInstance를 재활용 한다.
- 다른 JobParameter 가 사용됐다면, 새로운 JobInstance를 생성하여 사용한다.
- Job 과는 1:N 관계를 가진다. (Job이 실행될 때마다 생성된다.)
BATCH_JOB_INSTANCE 테이블과 매핑
JobInstance 는 BATCH_JOB_INSTANCE 테이블과 매핑되어 관리된다.
CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY ,
VERSION BIGINT ,
JOB_NAME VARCHAR(100) NOT NULL,
JOB_KEY VARCHAR(32) NOT NULL,
constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) ENGINE=InnoDB;
schema-mysql.sql
파일을 참조하면, BATCH_JOB_INSTANCE 테이블은 위와 같은 쿼리로 만들어지는걸 볼 수 있는데, 그 중 constraint을 보면 알 수 있듯
JOB_NAME(Job)과 JOB_KEY (JobParameter 해시값)가 동일한 데이터는 중복해서 저장할 수 없음을 확인할 수 있다.
JobParameters
기본 개념
- Job 을 실행할 때 매개변수를 넘기기 위한 도메인 객체
- 1 개의 Job에 존재하는 여러개의 JobInstance를 구분한다.
- JobParameters와 JobInstance는 1:1 관계
생성 및 바인딩
- 어플리케이션 실행 시 주입
- Java -jar LogBatch.jar requestDate=20210101
- 코드로 생성
- JobParameterBuilder, DefaultJobParametersConverter
- SpEL 이용
- @Value(“#{jobParameter[requestDate]}”)
- @JobScope, @StepScope 선언 필수
BATCH_JOB_EXECUTION_PARAM 테이블과 매핑
- JOB_EXECUTION 과 1:M 의 관계
-> 1 개의 Job을 실행할 때 여러개의 JobParameter 를 설정할 수 있다.
JobExecution
기본 개념
- JobInstance 가 실행될 때마다 생성. (1회의 실행을 의미)
- Job 실행 중에 발생한 정보 (시작시각, 종료시각, 상태 등) 를 가짐.
- JobInstance 과의 관계
- JobExecution은 'FAILED' 또는 'COMPLETED‘ 등의 Job의 실행 결과 상태를 가지고 있음
- JobExecution - 'COMPLETED' : JobInstance 실행이 완료됨, 재실행 불가
- JobExecution - 'FAILED' : JobInstance 실행이 완료되지 않음, 재실행 가능
- 동일한 JobParameter 를 사용하더라도, JobExecution의 상태가 COMPLETED 가 될 때까지 동일한 JobInstance 계속 실행 가능
BATCH_JOB_EXECUTION 테이블과 매핑
• JobInstance 와 JobExecution 는 1:M 의 관계로서 JobInstance 에 대한 성공/실패의 내역을 가지고 있음
JobLauncher
기본 개념
- 배치 Job 을 실행시키는 역할
- Job, JobParameters를 인자로 받고, JobExecution을 반환
- 스프링 배치가 구동될 때, JobLauncher 빈이 자동 생성 된다.
- JobLauncherApplicationRunner 가 자동적으로 JobLauncher 을 실행시킨다.
- JobLanucher.run(Job, JobParameters)
동작 과정

- 동기적 실행 (taskExecutor 가 SyncTaskExecutor 로 설정되는경우, 기본값임)
- JobExecution 을 획득하고 배치 처리를 최종 완료한 이후 Client 에게 JobExecution 을 반환
- 스케줄러에 의한 배치처리에 적합 - 배치처리시간이 길어도 상관없는 경우
- 비 동기적 실행 (taskExecutor 가 SimpleAsyncTaskExecutor 로 설정되는 경우)
- JobExecution 을 획득하고, 즉시 JobExecution.UNKNOWN 을 응답하여 배치처리를 완료한다.
- HTTP 요청에 의한 배치처리에 적합 - 배치처리 시간이 길 경우 응답이 늦어지지 않도록 함