Spring Batch ‐ 스프링 배치 도메인 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 Job

  • 기본 개념

    • 배치 계층 구조에서 가장 상위에 있는 개념으로서 하나의 배치작업 자체를 의미한다.
    • Job Configuration을 통해 생성되는 객체 단위로서 배치 작업을 어떻게 구성하고 실행할 것인지를 전체적으로 설정하고 명세해 놓는 객체이다.
    • 배치 Job을 구성하기 위한 최상위 인터페이스로 스프링 배치가 기본 구현체를 제공한다.
    • 여러 Step을 포함하고 있는 컨테이너로서 반드시 한 개 이상의 Step으로 구성해야 한다.
  • 기본 구현체

- SimpleJob : 순차적으로 Step을 실행시키는 Job, 모든 Job에서 유용하게 사용할 수 있는 표준 기능을 가진다.
- FlowJob : 특정한 조건과 흐름에 따라 Step을 구성하여 실행시키는 Job, Flow 객체를 실행시켜서 작업을 진행한다.

스크린샷 2025-01-11 오전 1 06 15

📚 JobInstance

  • Job이 실행될 때, 생성되는 Job의 논리적 실행 단위 객체로서 고유하게 식별 가능한 작업 실행을 나타낸다.
  • Job의 설정과 구성은 동일하지만, Job이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job 실행은 구분해야 한다.
  • JobInstance 생성 및 실행
    • 처음 시작하는 Job + JobParameter = 새로운 JobInstance를 생성한다.
    • 이전과 동일한 Job + JobParameter = 이미 존재하는 JobInstance를 리턴한다.
  • Job과는 1 : N 관계이다.
  • JOB_NAME + JOB_KEY가 중복으로 저장될 수 없다.

📚 JobParameter

  • Job을 실행할 때 함께 포함되어 사용되는 파라미터를 가진 도메인 객체
  • 하나의 Job에 존재할 수 있는 여러 개의 JobInstance를 구분하기 위한 용도
  • JobParameters와 JobInstance는 1 : 1 관계이다.
@Component
@RequiredArgsConstructor
public class JobRunner implements ApplicationRunner {

	private final JobLauncher jobLauncher;
	private final Job job;

	@Override
	public void run(ApplicationArguments args) throws Exception {

		JobParametersBuilder builder = new JobParametersBuilder();
		JobParameters jobParameters = builder
				.addString("name", "user1")
				.addDate("date", new Date())
				.addLong("id", 1L)
				.addDouble("age", 16.5)
				.toJobParameters();

		jobLauncher.run(job, jobParameters);
	}
}
@Bean
public Step step2() {
	return new StepBuilder("step1", jobRepository)
			.tasklet(new Tasklet() {
				@Override
				public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

					JobParameters jobParameters = contribution.getStepExecution().getJobExecution().getJobParameters();

					String name = jobParameters.getString("name");
					Date date = jobParameters.getDate("date");
					Long id = jobParameters.getLong("id");
					Double age = jobParameters.getDouble("age");

					log.info("name: {}, date: {}, id: {}, age: {}", name, date, id, age);
					return RepeatStatus.FINISHED;
				}
			}, platformTransactionManager)
			.build();
}

실행 결과

2025-01-11T11:34:24.421+09:00  INFO 7085 --- [           main] com.jwj.modulebatch.JobConfiguration     : name: user1, date: Sat Jan 11 11:34:24 KST 2025, id: 1, age: 16.5

📚 JobExecution

  • JobInstance에 대한 한 번의 시도를 의미하는 객체로서 Job 실행 중에 발생한 정보들을 저장하고 있는 객체이다.
  • 실행 상태 결과가 주어지는데 상태 값은 BatchStatus에서 관리한다.
public enum BatchStatus {

	/*
	 * The order of the status values is significant because it can be used to aggregate a
	 * set of status values. The result should be the maximum value. Since {@code
	 * COMPLETED} is first in the order, only if all elements of an execution are {@code
	 * COMPLETED} can the aggregate status be COMPLETED. A running execution is expected
	 * to move from {@code STARTING} to {@code STARTED} to {@code COMPLETED} (through the
	 * order defined by {@link #upgradeTo(BatchStatus)}). Higher values than {@code
	 * STARTED} signify more serious failures. {@code ABANDONED} is used for steps that
	 * have finished processing but were not successful and where they should be skipped
	 * on a restart (so {@code FAILED} is the wrong status).
	 */

	/**
	 * The batch job has successfully completed its execution.
	 */
	COMPLETED,
	/**
	 * Status of a batch job prior to its execution.
	 */
	STARTING,
	/**
	 * Status of a batch job that is running.
	 */
	STARTED,
	/**
	 * Status of batch job waiting for a step to complete before stopping the batch job.
	 */
	STOPPING,
	/**
	 * Status of a batch job that has been stopped by request.
	 */
	STOPPED,
	/**
	 * Status of a batch job that has failed during its execution.
	 */
	FAILED,
	/**
	 * Status of a batch job that did not stop properly and can not be restarted.
	 */
	ABANDONED,
	/**
	 * Status of a batch job that is in an uncertain state.
	 */
	UNKNOWN;

        // ..
}

📚 Step

  • 기본 개념
    • Batch Job을 구성하는 독립적인 하나의 단계로서 실제 배치 처리를 정의하고 컨트롤하는 데 필요한 모든 정보를 가지고 있는 도메인 객체이다.
    • 단순한 단일 테스크 뿐만 아니라 입력과 처리, 그리고 출력과 관련된 복잡한 비즈니스 로직을 포함하는 모든 설정들을 담고 있다.
    • 배치 작업을 어떻게 구성하고 실행할 것인지 Job의 세부 작업을 Task 기반으로 설정하고 명세해놓은 객체이다.
    • 모든 Job은 하나 이상의 Step으로 구성된다.
  • 기본 구현체 정리
- TaskletStep : 가장 기본이 되는 클래스로서 Tasklet 타입의 구현체들을 제어한다.
- PartitionStep : 멀티 쓰레드 방식으로 Step을 여러 개로 분리해서 실행한다.
- JobStep : Step 내에서 Job을 실행하도록 한다.
- FlowStep : Step 내에서 Flow를 실행하도록 한다.

📚 StepExecution

  • Step에 대한 한 번의 시도를 의미하는 객체로서 Step 실행 중에 발생한 정보들을 저장하고 있는 객체이다.
  • Step이 매번 시도될 때마다 생성되어 각 Step별로 생성된다.
  • Job이 재시작하더라도 이미 성공적으로 완료된 Step은 재실행되지 않고 실패한 Step만 실행된다.
  • 이전 단계 Step이 실패해서 현재 Step을 실행하지 않았다면 StepExecution을 생성하지 않는다. Step이 실제로 시작됐을때만 StepExecution을 생성한다.
  • 하나의 Job은 여러 Step으로 구성된다. 따라서, JobExecutin과 StepExecution 역시 1 : N의 관계가 된다.

📚 StepContribution

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

스크린샷 2025-01-11 오후 3 47 24

📚 ExecutionContext

  • 프레임워크에서 유지 및 관리하는 키/값으로 된 컬렉션으로 StepExecution 또는 JobExecution 객체의 상태를 저장하는 공유 객체이다.
  • DB에 직렬화된 값(key - value)으로 저장된다.
  • 공유 범위
    • Step 범위 : 각 Step의 StepExecution에 저장되며 Step 간 서로 공유 불가
    • Job 범위 : 각 Job의 JobExecution에 저장되며 Job 간 서로 공유 불가, 해당 Job을 구성하는 Step 간 서로 공유 가능
  • Job 재시작시, 이미 처리한 Row는 건너뛰고 이후로 수행하도록 할 때 해당 상태 정보를 활용한다.

스크린샷 2025-01-11 오후 4 03 04

스크린샷 2025-01-11 오후 4 03 22

📚 JobRepository

  • 배치 작업 중의 정보를 저장하는 저장소 역할
  • Job이 언제 수행되었고, 언제 끝났으며, 몇 번 실행되었고, 실행에 대한 결과 등의 배치 작업 수행과 관련된 모든 Meta Data를 저장한다.

스크린샷 2025-01-11 오후 4 42 30

📚 JobLauncher

  • 기본 개념
    • 배치 Job을 실행시키는 역할을 한다.
    • Job과 JobParameter를 파라미터로 받으며 요청된 배치 작업을 수행한 후 최종 Client에게 JobExecution을 반환한다.
    • 스프링 부트 배치가 구동이 되면 JobLauncher 빈이 자동 생성된다.
    • Job의 동기적 실행과 비동기적 실행
* 동기적 실행
- taskExecutor를 SyncTaskExecutor로 설정한 경우
- JobExecution을 획득하고 배치 처리 최종 완료 후 클라이언트에게 JobExecution을 반환
- 스케줄러에 의한 배치 처리(배치 처리 시간이 길어도 문제없는 경우)

* 비동기적 실행
- taskExecutor가 SimpleAsyncTaskExecutor로 설정한 경우
- JobExecution을 획득하고 Client에게 JobExecution을 반환하고 배치 처리를 완료
- HTTP 요청에 의한 배치 처리(배치 처리 시간이 길 경우 응답이 늦어지지 않도록 하기 위함)

스크린샷 2025-01-11 오후 10 25 30