인프런 커뮤니티 질문&답변

김태희님의 프로필 이미지
김태희

작성한 질문수

스프링 배치

JobInstance

JobInstance 생성 및 실행에 대해서 질문이 있습니다.

작성

·

581

0

안녕하세요. 7:32초 쯤에부터 말씀을 해주신 내용에 질문이 있습니다. 다음 강의인 JobParameter의 내용까지 모두 수강하고 해당 질문을 드리게 되었는데요.

"이전과 동일한 Job, 그 다음에 똑같은 JobParameter의 값으로 실행이 되면 이미 존재하는 JobInstance를 리턴하고, 결국엔 수행이 실패합니다"

"똑같은 Job과 똑같은 JobParameter의 내용으로 다시 수행할 필요가 없는거죠. 그럼 내용까지 똑같아 지니까"

위와 같이 말씀을 해주셨는데 해당 말씀을 듣고, 똑같은 Parameter의 "값"을 가진다고 해도 Job이 수행이 되어야하는게 아닌가? 왜 실패처리를 하게 Spring Batch에서 구현을 해놓은거지?라는 의문이 들었습니다.

그리고 이러한 의문을 가졌을때는 JobParameter에 대한 실습을 진행하지 않았던 상태여서 JobParameter를 넘기지 않는것을 토대로 Job을 실행시켜보았는데 강사님의 말씀대로 최초 한번만 실행되고 그 이후로는 Job이 실행되지 않고 Database에 이미 완료되었다는 Error Message와 함께 데이터가 쌓이더군요.

그래서 아 정말 그렇구나 JobParameter가 같으면("JobParameter가 없다"라는게 같음, 동일한 Job + Empty JobParameter) 실패처리를 하는구나라고 생각을 하고 강의 수강을 이어갔습니다.

그리고 다음 강의에서 JobParameter에 총 4개의 Parameter를 가지고 Job을 실행하시는 것을 보여주셨습니다.

name=user1

seq=2

date=2021/01/01

age=16.5

JobInstance 강의에서 배운 내용을 가진채로, 저는 해당 Parameter의 값으로 여러번 실행하면 에러가 날줄 알았는데 예상과는 다르게 저의 처음 예상(똑같은 Parameter의 "값"을 가진다고 해도 수행이 되어야하는게 아닌가?)대로 정상적으로 모두 실행이 되었습니다.

또한 JobParameter 강의에서 강사님께서도 같은 Parameter를 가지고 여러번 수행했을때(jar, InteliJ Configuration으로 실행 방법은 달랐지만 넘기는 Parameter는 같은) 정상적으로 해당 Job이 성공을 하는 Flow가 강의에 담겨있었습니다.

배운것과 조금 다른것 같아서 아래 코드를 다시 살펴보았고,

동일한 Job + JobParameter의 "값"의 동일함이 아닌,
동일한 Job + JobParameter "객체"의 동일 여부를 가지고 JobInstance의 생성 및 실행을 구분하는것이 아닌가라는 결론을 내게 되었습니다.

@Override
public void run(ApplicationArguments args) throws Exception {
  JobParameters jobParameters = new JobParametersBuilder()
                                   .addString("name", "user1")
                                   .addLong("seq", 2L)
                                   .addDate("date", new Date())
                                   .addDouble("age", 16.5)
                                   .toJobParameters();
  jobLauncher.run(job, jobParameters);

위의 제 결론에 확신을 더 얻고자, 말도 안되는 코드인것 같지만 아래와 같이 수행을 해봤을때 IllegalStateException: Failed to execute ApplicationRunner 에러가 발생하였습니다.

아래 코드의 의도는 동일한 jobParameters라는 객체를 가지고 같은 Job을 실행시켰을때 오류가 날것이다라는 가정이였고, 오류가 났으니 제 가정이 맞는것 같습니다.

@Override
public void run(ApplicationArguments args) throws Exception {
  JobParameters jobParameters = new JobParametersBuilder()
                                   .addString("name", "user1")
                                   .addLong("seq", 2L)
                                   .addDate("date", new Date())
                                   .addDouble("age", 16.5)
                                   .toJobParameters();
  jobLauncher.run(job, jobParameters);
  // 같은 jobParameters 객체를 가지고 한번 더 실행
  jobLauncher.run(job, jobParameters);

정리하자면,
동일한 Job + JobParameter의 "값"의 동일함이 아닌,
동일한 Job + JobParameter "객체"의 동일 여부를 가지고 JobInstance의 생성 및 실행을 구분하는것이 맞는것 같다인데, 혹시 제 생각이 맞을까요?

실제로 BATCH_JOB_EXECUTION_PARAMS 테이블에서 Parameter값들은 계속 같은게 들어오지만 BATCH_JOB_INSTANCE 테이블의 JOB_KEY값은 계속 다르게 저장이되네요.

 

답변 3

3

.addDate("date", new Date())에서 값이 이전과 다를거 같은데요?

0

정수원님의 프로필 이미지
정수원
지식공유자

정확하게 실행하신 소스를 봐야겠지만 강의에서 설명하는 중복실패의 의미는 동일한 Job 과 JobParameter 의 값을 기준으로 설명한 것이 맞습니다

JobParameter 객체의 동일을 얘기한 것이 아닙니다

JobParameter 객체는 실행할 때마다 새롭게 생성되기 때문에 오히려 객체의 동일성을 비교하지 않습니다

Job 과 모든 Step 이 성공했다면 동일한 Job 과 JobParameter 의 재실행은 오류를 내뱉고 Job 이 실패한 경우라면 재실행이 가능하도록 되어 있습니다

다만 성공한 경우에도 재실행이 가능하도록 강제로 하는 방법은 allowStartIfComplete(true) 옵션을 주게 되면 가능합니다

소스 공유해 주시면 제가 테스트 해 볼 수 있습니다

0

안녕하세요, 인프런 AI 인턴입니다.

Spring Batch에서 JobParameter는 Job 내에서 변수처럼 사용되며, 이를 통해 새로운 JobInstance를 생성하거나 작업을 구분할 수 있습니다. JobParameter가 같다면 이미 존재하는 JobInstance를 리턴하기 때문에, 새로운 JobInstance를 생성하지 않고 수행을 실패처리합니다.

이와 같은 방식으로 진행하는 이유는, 같은 JobParameter의 경우 이전에 이미 해당 작업을 완료했으므로 추가적으로 실행할 필요가 없기 때문입니다. 따라서 과거에 완료한 JobInstance를 재사용하는 것이 효율적입니다.

JobParameter에 대한 실습을 수행하지 않았을 때는 JobParameter를 넘기지 않는 경우, JobInstance를 구분할 것이 없으므로 최초 한번만 실행되며 그 이후로는 수행되지 않는 것이 일반적입니다.

이상입니다. 추가적인 질문이나 궁금하신 점이 있다면 언제든지 문의해주세요. 감사합니다.

김태희님의 프로필 이미지
김태희

작성한 질문수

질문하기