https://github.com/spring-projects/spring-batch/issues/4252
[Spring] Batch 5.0 변경 사항 & initialize-schema 에러
spring.batch.jdbc.initialize-schema 설정이 동작하지 않는 이슈가 발생하여 이유를 알아보니 Spring Batch 5.0부터 기존과 다른 변경이 생겼으며 간단히 정리해보면,
- SpringBoot 3.0부터 @EnableBatchProcessing 권장되지 않음
- DefaultBatchConfigration 클래스 추가
@EnableBatchProcessing을 사용할 경우 기존 Spring Batch가 제공하는 자동 설정들을 사용할 수 없다고 한다.
❗문제는 @EnableBatchProcessing 이나 DefaultBatchConfigration 를 사용할 경우 BatchAutoConfiguration 클래스에 달려있는 "@ConditionalOnMissingBean(value = DefaultBatchConfiguration.class, annotation = EnableBatchProcessing.class)" 에 의해 JobLauncherApplicationRunner 및 빈이 등록되지 않는다.
결국 @EnableBatchProcessing 이나 DefaultBatchConfigration을 사용할 경우 자동 설정을 밀어내고 애플리케이션의 설정을 커스텀하는 용도로 사용된다고 한다.
위와 같은 이유로 spring.batch.jdbc.initialize-schema 같은 설정 또한 동작하지 않는 것이였다.
정리
- 스프링 부트(yml 설정값들 통해 빈 등록) 와 스프링 배치 사이에서 이 방향으로 가는게 이미 스프링 팀 내부 전체 회의에서 논의된 사항 인듯!
- 스프링 팀 전체 회의 에서 스프링 내의 많은 레포들 사이에서 이런 부분들 계속 논의해서 업그레이드 함

- 따라서 빈 등록 관련 로직을 스프링 배치로 가져오는건 스프링전체 에서 권장하는 방법이 아닐듯 합니다! 실제로 스프링 빈 관련 로직은 부트/프레임워크 에서만 하고 스프링 배치는 최대한 배치 로직만 다룹니다ㅎ
- 그러므로 위의 flag를 스프링 배치에서 직접 지원하는건 물론 좋은 아이디어 지만, 스프링 전체로 보면 지향하는 방향은 아닐거 같아요!
- 스프링에서 권장하는건 @EnableBatchProcessing 를 지우는것

- 하지만, 이 부분은 합리적인것 같습니다! 현재 스프링 부트의 sql문을 실행하는 방법이 EmbddedDataSourceBuilder.addScript()뿐인데 여기서 string으로 파일 path를 받고 있어서 오타가 나기 쉬운 구조네요.
- 이부분에서 스프링 배치에서 sql문 파일 이름들을 static variable로 미리 선언해두면 좋을거 같아요!
- e.g. new EmbeddedDataSourceBuilder().addScript(Resource.SCHEMA_H2);
- 이러면 오타 날 일이 없을거 같네요!
- 스프링 배치에서 sql문들 이름 사용하는거 검색해보니, 전부 스트링으로 쓰고있어서 좋은 개선 사항일거 같습니다ㅎ