이번글은 Spring Batch5에서 멀티데이터소스 설정에 대한 글입니다.
제가 원하는 상황은 spring batch에 대한 meta-table을 schema를 서비스 schema와 분리시키고 싶었습니다.
Spring Batch5 특징및 달라진점
들어가기전에 Spring Batch5로 바뀌면서 달라진점에 대해 간단히 알아보자
일단 Java17이 필수다
@EnableBatchProcessing을 사용 안해야한다. 사용하는 경우는 meta-table정보를 다른곳으로 지정하고 싶을때라고 한다.
또한 JobBuilderFactory는 Deprecated되었고 JobBuildeer와 StepBuilder를 사용해야한다.
제일 중요한것은 JobRepository
meta데이터에 관한 테이블을 저장하는것은 JobRepository입니다.
따라서 JobRepository에 대한 데이터소스를 meta스키마로 바꿔주면 됩니다.
방법
1. @EnableBatchProcessing에서 dataSourceRef, transactionManagerRef을 지정하면 JobRepository가 자동생성된다.
2. DefaultBatchConfiguration 직접 상속해서 오버라이드를 하든 새로 빈을 등록을 하는 방법이 있습니다.
그러나 1번의 방법은 원하는대로 동작하지 않았습니다. 조졸두님도 저랑 같은상황이었고 작동하지 않아 사용하지 않는다고했습니다.
2번째방법으로 해결한 부분을 코드로 보여드리겠습니다.
먼저 계속 빈이 dataSource라는 이름으로만 빈을 주입하길레 다음과같이 이름을 주고 Primary로 우선순위를 높여줍니다.
@Primary
@Bean("dataSource")
public DataSource springBatchDb() {
DataSourceBuilder builder = DataSourceBuilder.create();
builder.type(HikariDataSource.class);
builder.driverClassName("com.mysql.cj.jdbc.Driver");
builder.username("root");
builder.password("1234");
builder.url("jdbc:mysql://localhost:3306/choi");
return builder.build();
}
@Primary
@Bean("transactionManager")
protected PlatformTransactionManager getTransactionManager() {
return new DataSourceTransactionManager(springBatchDb());
}
@Configuration
@EnableConfigurationProperties(BatchProperties.class)
public class TestJobConfiguration extends DefaultBatchConfiguration {
private final int CHUNK_SIZE = 10;
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.batch.job", name = "enabled", havingValue = "true", matchIfMissing = true)
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobLauncher jobLauncher, JobExplorer jobExplorer,
JobRepository jobRepository, BatchProperties properties) {
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository);
String jobNames = properties.getJob().getName();
if (StringUtils.hasText(jobNames)) {
runner.setJobName(jobNames);
}
return runner;
}
위와같이 JobLauncherApplicationRunner도 추가해줍니다.
@Configuration
public class WorkDbConfig {
@Bean("workDb")
public DataSource workDb() {
DataSourceBuilder builder = DataSourceBuilder.create();
builder.type(HikariDataSource.class);
builder.driverClassName("com.mysql.cj.jdbc.Driver");
builder.username("root");
builder.password("1234");
builder.url("jdbc:mysql://localhost:3306/kusinsa");
return builder.build();
}
@Bean("workTr")
protected PlatformTransactionManager workTransactionManager() {
return new DataSourceTransactionManager(workDb());
}
}
위에서 편의상 DB정보를 넣었으나, db정보가 보이니 @Value를 사용하면 더 관리하기 편합니다
서비스 db빈 등록을 하면 끝입니다. 그리고 서비스 DB가 필요한 경우는 @Qualifier를 통해 명시적으로 사용합니다.
제가 설정한 코드
참고자료
https://docs.spring.io/spring-batch/docs/5.0.4/reference/html/whatsnew.html
https://lahuman.github.io/springboot_multi_datasource/
https://www.geeksforgeeks.org/configure-multiple-datasources-in-spring-boot/
https://stackoverflow.com/questions/78017514/multiple-datasources-in-spring-batch-5