Spring Batch - 14. 배치 초기화 설정 (application.properties)

출처

목차

BatchAutoConfiguration

BatchAutoConfiguration 에서는 ApplicationRunner 의 일종인 JobLauncherApplicationRunner 를 생성한다.

BatchAutoConfiguration은 @EnableBatchProcessing 어노테이션을 사용하여 활성화됩니다.

BatchAutoConfiguration.java

public class BatchAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.batch.job", name = "enabled", havingValue = "true", matchIfMissing = true)
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobLauncher jobLauncher, JobExplorer jobExplorer,
JobRepository jobRepository, BatchProperties properties) {

// JobLauncher 객체와 JobExplorer 객체와 JobRepository 객체를 이용해 JobLauncherApplicationRunner 객체를 생성한다.
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository);

// Application Properties 에 등록된 Job 이름들을 가져온다.
String jobNames = properties.getJob().getNames();
if (StringUtils.hasText(jobNames)) {
runner.setJobNames(jobNames);
}
return runner;
}
... 이하 생략 ...
}

JobLauncherApplicationRunner

Spring boot 에서 제공하는 ApplicationRunner 의 구현체 로 어플리케이션이 구동되자마자 실행되며 Bean 으로 등록된 모든 Job 을 실행시킨다.

JobLauncherApplicationRunner 는 JobLauncher 클래스를 이용해 JobRegistry 에 등록된 모든 Job을 실행시킵니다. 이러한 실행은 ApplicationContext 가 완전히 로드되고 실행된 후에 시작됩니다. 실행 시점에서 등록된 모든 Job을 가져와 실행하므로 Job 이름이 고유해야 합니다.

JobLauncherApplicationRunner 를 사용하려면 애플리케이션에서 @EnableBatchProcessing 을 사용하여 Spring Batch를 활성화하고, JobLauncherApplicationRunner 를 Bean 으로 등록해야 합니다. 그러면 Spring Boot 애플리케이션이 시작될 때 JobLauncherApplicationRunner가 실행되어 등록된 모든 Job을 자동으로 실행시키게 됩니다.

JobLauncherApplicationRunner는 Spring Batch Job 을 자동으로 실행하는 간단한 방법을 제공합니다. 그러나 Job 을 실행할 때 매개변수를 지정해야 하는 경우나, 실행 조건이나 Job 실행 전/후 처리를 추가해야 하는 경우에는 보다 유연한 방법으로 JobLauncher 를 직접 사용해야 합니다.

JobLauncherApplicationRunner 객체는 execute 라는 메소드를 이용해 내부에 가지고 있는 JobLauncher 객체를 이용해 Job 을 수행한다.

JobLauncherApplicationRunner.java

public class JobLauncherApplicationRunner implements ApplicationRunner, Ordered, ApplicationEventPublisherAware {

... 생략 ...
private final JobLauncher jobLauncher;

// Spring Boot 가 Job 을 Scan 한 후에 JobLauncherApplicationRunner 에 전달해준다.
// JobLauncherApplicationRunner 는 여러개의 Job 을 가지고 있을 수 있게 된다.

@Autowired(required = false)
public void setJobs(Collection<Job> jobs) {
this.jobs = jobs;
}

protected void execute(Job job, JobParameters jobParameters)
throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException,
JobParametersInvalidException, JobParametersNotFoundException {
JobParameters parameters = getNextJobParameters(job, jobParameters);

// JobLauncher 를 이용해 Job 을 수행하는 역할을 한다.
JobExecution execution = this.jobLauncher.run(job, parameters);
if (this.publisher != null) {
this.publisher.publishEvent(new JobExecutionEvent(execution));
}
}

//
@Override
public void run(ApplicationArguments args) throws Exception {
String[] jobArguments = args.getNonOptionArgs().toArray(new String[0]);
run(jobArguments);
}

public void run(String... args) throws JobExecutionException {
logger.info("Running default command line with: " + Arrays.asList(args));
launchJobFromProperties(StringUtils.splitArrayElementsIntoProperties(args, "="));
}

protected void launchJobFromProperties(Properties properties) throws JobExecutionException {
// Argument 들을 JobParameters 객체로 변환해 저장한다.
JobParameters jobParameters = this.converter.getJobParameters(properties);
executeLocalJobs(jobParameters);
executeRegisteredJobs(jobParameters);
}

// Batch Properties 로 등록된 Job 들이 있을 경우 실행한다.
private void executeLocalJobs(JobParameters jobParameters) throws JobExecutionException {

for (Job job : this.jobs) {
// spring.batch.job.names 에 등록된 Job 이 있는지 확인한다.
// 특정한 Job 만을 실행하고 싶을 경우 사용한다.
if (StringUtils.hasText(this.jobNames)) {
String[] jobsToRun = this.jobNames.split(",");
if (!PatternMatchUtils.simpleMatch(jobsToRun, job.getName())) {
logger.debug(LogMessage.format("Skipped job: %s", job.getName()));
continue;
}
}

// Job 을 실행한다.
execute(job, jobParameters);
}
}

// JobRegistry 에 등록된 모든 Job을 실행합니다
private void executeRegisteredJobs(JobParameters jobParameters) throws JobExecutionException {
if (this.jobRegistry != null && StringUtils.hasText(this.jobNames)) {
String[] jobsToRun = this.jobNames.split(",");
for (String jobName : jobsToRun) {
try {
Job job = this.jobRegistry.getJob(jobName);
if (this.jobs.contains(job)) {
continue;
}
execute(job, jobParameters);
}
catch (NoSuchJobException ex) {
logger.debug(LogMessage.format("No job found in registry for job name: %s", jobName));
}
}
}
}
... 생략 ...
}

BatchProperties

BatchProperties는 Spring Batch 의 설정을 담당하는 클래스

  • Job 이름, 스키마 초기화 설정, 테이블 Prefix 등의 값을 설정할 수 있다.
  • application.properties 또는 application.yml 파일에 설정한다.

BatchProperties.java

// application.properties or application.yml 에서 spring.batch 가 Spring Batch 의 Prefix 다. 
@ConfigurationProperties(prefix = "spring.batch")
public class BatchProperties {
... 생략 ...
}

application.properties

배치 잡의 실행 여부를 설정

# Spring Boot 가 자동으로 실행시키는 Batch Job 을 실행시키도록 한다.
spring.batch.job.enabled: true # default
# Spring Boot 가 자동으로 실행시키는 Batch Job 을 실행하지 않도록 한다.
spring.batch.job.enabled: false

배치 잡의 재시작 여부를 설정

# 기본이 true, 재시작을 허용한다.
spring.batch.job.restartable: true
# 재시작을 허용g하지 않는다
spring.batch.job.restartable: false

실행할 배치 잡의 이름을 지정

  • 지정한 Job 만 실행하도록 설정한다.
  • spring.batch.job.names: ${job.name.NONE}
# Hard Coding 방식
spring.batch.job.names: springJob1
# Binding 을 사용한 방식
# Default 는 NONE 으로 아무 Job 도 실행시키지 않는다.
spring.batch.job.names: ${job.name:NONE}
  • 어플리케이션 실행시 Program arguments 로 job 이름 입력한다.
    • --job.name=helloJob
    • --job.name=helloJob.simpleJob 하나 이상의 job 을 실행할 경우 쉼표로 구분해서 입력 한다.

어플리케이션 실행시점에 Argument 로 넘겨서 Binding 되도록 한다.

배치 잡에서 허용하는 실패 횟수를 설정

# 배치 잡에서 허용하는 실패 횟수를 설정한다. default: 3
spring.batch.job.failures-allowed: 3

배치 잡에서 생성되는 메타 데이터 테이블 스키마 생성여부를 설정

spring.batch.jdbc.initialize-schema: always
spring.batch.jdbc.initialize-schema: embedded
spring.batch.jdbc.initialize-schema: never

배치 잡에서 생성되는 메타 데이터 테이블 Prefix 를 설정한다.

spring.batch.jdbc.table-prefix:  

Job 실행 옵션

Share