그 외 공부/트러블 슈팅

Spring Batch - Caused by: java.lang.IllegalArgumentException: Job name must be specified in case of multiple jobs 오류

SeongOnion 2024. 1. 8. 20:00
728x90

문제 상황

Spring Batch를 공부하며 이것저것 시험해보던 중, 처음 보는 예외가 발생했다.

Caused by: java.lang.IllegalArgumentException: Job name must be specified in case of multiple jobs

여러 개의 Job이 있을 때, Job name이 명시되어있어야한다는 메시지를 뿜었다.

 

처음엔 이게 Job 객체를 생성할 때 입력하는 name 파라미터에 관한 것이라고 생각하고, 뭔가 명시가 되지 않았거나 중복된 게 있는 것인지 확인했지만 그런 것은 없었다.

 

원인

원인은 구글링을 통해 쉽게 확인할 수 있었다.

 

해당 문제는 Spring Boot 3 버전에서부터 Spring Batch 사용 시 업데이트 된 내용 때문이었다.

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#multiple-batch-jobs

해당 내용을 정리하자면 다음과 같다.

 

기존에는 스프링 부트가 구동될 때 모든 Job 빈들을 읽어 실행하는 구조였다면, 새로운 버전에서부터는 복수 개의 Job이 컨텍스트 내에 정의되어 있다면 부트 구동 시점에 가동시킬 Job을 프로프티에 명시해야한다. (하나만 등록 가능)

 

만약 컨텍스트 내에 하나의 Job만 존재한다면, 해당 Job은 별도의 명시 없이 부트 구동 시점에 실행된다.

 

해당 수정이 일어난 배경은 깃헙 이슈에서 확인할 수 있었다.

 

대략적으로 정리하자면, 아래와 같았다.

 

1. CLI 등을 통해 JobParameter를 전달할 때, 정의된 모든 Job에게 동일한 JobParameter가 전달되는 문제가 있다.

 

2. Job 구동 순서가 불분명해지고, 각 Job들이 실행되는 로그가 섞이게 된다. 

 

3. 그 밖에도 여러가지 이유로 부트 구동 시점에 여러 개의 Job을 실행시키는 것은 이점보단 단점이 더 크다.

 

해결

해결방법은 간단하다. 부트 구동 시 실행시킬 Job을 yml에 명시하면 된다.

# application.yml

spring:
  batch:
    job:
      name: myJob

 

이렇게 설정한 값은 org.springframework.boot.autoconfigure.batch.BatchProperties.Job의 필드에 세팅된다.

 

이후, BatchAutoConfiguration 에선 해당 Job Name을 가져와 JobLauncherApplicationRunner에 등록하게 된다.