배치 실행 시 잡파라미터 null 바인딩 현상

2023. 2. 8. 15:50BackEnd(Java)/Spring Batch

환경

배치를 로컬에 구성 후 테스트를 하였고 스케쥴링을 통해  특정 잡을 JobLauncher로 실행, JobParameter를 생성하여 전달하였음

 

현상

스프링 부트 Run을 하여 Reader 부분 확인해 보니 잡 파라미터 값이 null로 들어오고 있다.

처음에 @StepScope를 잘못 썼나? 아니면 파라미터명을 잘못 입력했나? 여러가지 문제를 생각해서 이때부터 삽질의 시간이 시작되었다..

 

 

Parameters:[{}] 로 값이 바인딩이 안 되는 로그가 보인다.

 

그런데 스케쥴링으로 실행되는 부분에서는 잡 파라미터가 잘 들어온다(??)

 

아래 로그값에도 parameters: [{startDate=2023-02-07, endDate=2023-02-08, timestamp=1675838930004}] 

값으로 잘 들어오는 게 보인다.

 

 

어디서부터 잘못된 걸까... 스케쥴링 부분? 아니면 잡 부분? 슬슬 머리가 아파오기 시작하면서 디버깅을 해도 해결이 안 되었다. 멘붕 ㅠ

 

팀원들에게 도움을 요청하였고 pr 리뷰를 통해 원인 파악이 되었다!

 

원인

 원인은 .yml 파일에 spring.batch.job:names: ${job.name:NONE}이 주석이 되어있었고 이 옵션값이 설정이 되어 있지 않아서 부트 Run시 잡 파라미터 바인딩이 잘되지 않았던 것이다.

 

그래서 해당 옵션을 찾아보았고 향로님의 글을 참고하여 정리하자면 spring.batch.job:names: ${job.name:NONE} 옵션값은

스프링 배치 실행 시 Program arguments로 job.name값이 넘어오면 해당 값과 일치하는 Job만 실행시키는 옵션이다.

 

여기서 중요한 것은 spring.batch.job.names에 NONE이 할당되면 어떤 배치(Job)도 실행하지 않겠다는 의미이다.(혹시라도 값이 없을 때 모든 배치가 실행되지 않도록 막는 역할)

 

결국 원인은, 스프링 부트 Run시 모든 잡이 다 실행되었고  그때 JobParamter가 없으므로 null값이 바인딩되었던 것이다!

(스케쥴링에서는 JobLauncher로 실행하여 JobParameter를 생성해서 넘겨주므로 바인딩이 잘되었던 것이다)

 

해결

 그래서 해결방법은 해당 옵션값을 줘서 배치 실행 시 모든 Job을 실행 안되도록 막고 스케쥴링을 통해서만 Job이 실행되도록 하여 정상작동하도록 하였음.

 

번외

 스프링 부트 3.0 이전에는 모든 Job을 다 실행했다면 3.0 이후부터는 Multiple batch jobs를 실행하는 것이 더 이상 지원되지 않게 된다. AutoConfiguration에서 단일 Job만 감지되면 시작 시 바로 실행되며, 콘텍스트에 여러 Job이 있는 경우 시작 시 실행할 JobName을 spring.batch.job:names: ${job.name:NONE} 옵션을 통해 꼭 명시해야 한다.

 

 

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.html


참고자료

반응형

'BackEnd(Java) > Spring Batch' 카테고리의 다른 글

3. Job  (0) 2023.02.14
2. 배치 메타 데이터 분석  (0) 2023.02.06
1.스프링 배치 소개 및 프로젝트 구성  (0) 2022.09.27