본문 바로가기
츄Log/기타 끄적

Spring Batch의 JobParameter 설정 우선순위

by 츄츄🦭 2024. 2. 3.
728x90

 

spring batch의 Job을 실행할 때 사용되는 JobParameter 객체가 있습니다.

이 객체는 Job을 실행할 때 필요한 모든 파라미터를 담고 있고, 이 파라미터는 Job을 실행할 때 주입해줄 수도 있고 내부에서 코드를 통해 생성할 수도 있습니다. 

 

외부와 내부에서 모두 같은 키에 대한 값을 생성할 때 어떤 것이 더 높은 우선순위를 가지는지 알아보겠습니다.

 

테스트를 위해 JobParametersIncrementer의 구현체를 하나 만들었습니다.

public class CustomIdIncrementer implements JobParametersIncrementer {

    @Override
    public JobParameters getNext(final JobParameters parameters) {

       return new JobParametersBuilder(parameters)
          .addString("run.id", LocalDateTime.now().toString())
          .toJobParameters();

    }
}

 

 

이 구현체는 아래처럼 incrementer로 지정해주었습니다. 

@Bean
public Job job() {
	return jobBuilderFactory.get("testJob")
		.incrementer(new CustomIdIncrementer())
		.start(step1())
		.build();
}

 

그리고 Job을 실행하면서 run.id=27 이라는 값을 주입해주겠습니다.

 

결과는 다음과 같습니다. 

 

외부에서 주입해준 값이 run.id의 값으로 사용되었습니다.

 

이러한 결과가 나타나는 이유를 한번 알아보겠습니다.

JobApplicationRunner.java의 launchJobFromProperties에서 시작합니다. 

 

컨버터에 의하여 properties의 값들을 파라미터로 설정해줍니다. 

 

 

그럼 job의 parameterMap에 properties값들이 설정되게 되고,

incrementer에 의하여 내부에서 같은 키에 대해 새로운 값이 생성되었을지라도 JobParametersBuilder.java에서 putAll에 의하여 초기값이 덮어씌워지게 됩니다.

 

 

결국 JobParameter 설정은 내부에서 생성하는 것보다 외부에서 주입해준 값이 더 높은 우선순위를 갖는다고 볼 수 있습니다. 

이는 외부에서 실행 환경에 따라 동적으로 파라미터를 설정할 수 있게 하여 유연성을 제공해줍니다.

 

 

728x90