2023. 2. 8. 15:50ㆍBackEnd(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} 옵션을 통해 꼭 명시해야 한다.
참고자료
'BackEnd(Java) > Spring Batch' 카테고리의 다른 글
3. Job (0) | 2023.02.14 |
---|---|
2. 배치 메타 데이터 분석 (0) | 2023.02.06 |
1.스프링 배치 소개 및 프로젝트 구성 (0) | 2022.09.27 |