티스토리 뷰
Spring Framework 6, Spring Boot 3 등 2022년 11월 새로운 Major 버전이 릴리즈가 됐다. Java version 17 이상을 기본으로 사용하면 Spring Native 를 공식적으로 지원한다. 이와 더불어 Spring Batch 도 5 Version 이 출시 됐다. 오늘 Spring Batch 5를 이용한 간단한 샘플코드와 새로운 부분을 알아 보겠다.
Required Java 17+
스프링 6 부터 Java 최소 사양이 최신 LTS Version 인 17이다. 그에 따라서 Spring Batch 5 역시 Java 17 이상이 필요하다. 지난 포스팅(https://warpgate3.tistory.com/entry/Java-8-to-17) 에 언급 했던 것 처럼 자바의 개선된 기능을 사용할 수 있다. 아래는 Java block 과 동적 type인 var를 이용한 샘플 코드의 일부이다. 높은 가독성을 보인다.
@Bean("sampleChunkItemReader")
public ItemReader<Map<String, Object>> sampleChunkitemReader(@Qualifier(value = "sourceDb") DataSource sourceDb) {
var sql = """
select
user_id, user_email, user_name
from
src_user
""";
/* as-is
String sql = " select \n"
+ " user_id, user_email, user_name \n"
+ " from\n"
+ " src_user \n";
*/
return new JdbcCursorItemReaderBuilder<Map<String, Object>>()
.name("sampleChunkItemReader")
.dataSource(sourceDb)
.rowMapper((rs, idx) -> {
var userId = rs.getString("user_id");
var userEmail = rs.getString("user_email");
var userName = rs.getString("user_name");
return Map.of(
"userId", userId,
"userEmail", userEmail,
"userName", userName
);
})
.sql(sql)
.build();
}
EnableBatchProcessing 새로운 속성
Batch 프로그램에서 일반적으로 source db 와 target db 또는 설정 db 또한 다른 경우가 많다. 이 경우 @Primary 를 이용해 우선순위를 강제 하거나 아래와 같이 DefaultBatchConfigurer 을 상속받고 재정의를 해줘야 했다.
@Configuration
public class BatchConfiguration extends DefaultBatchConfigurer {
@Override
protected JobRepository createJobRepository(@Qualifier("testDatasource") DataSource dataSource, @Qualifier("testTranjactionManager") PlatformTransactionManager platformTransactionManager) {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setTransactionManager(platformTransactionManager);
factory.setDataSource(dataSource);
factory.setTablePrefix("test_");
return factory.getObject();
}
@Override
protected JobExplorer createJobExplorer(@Qualifier("testDatasource") DataSource dataSource) {
JobExplorerFactoryBean factory = new JobExplorerFactoryBean();
factory.setDataSource(dataSource);
factory.afterPropertiesSet();
factory.setTablePrefix("test_");
return factory.getObject();
}
Spring Batch 5 부터는 아래와 같이 @EnableBatchProcessing 의 추가된 속성 dataSourceRef, transactionManagerRef 로 정의할 수 있다.
@Configuration
@EnableBatchProcessing(dataSourceRef = "testDataSource", transactionManagerRef = "testTransactionManager")
public class BatchConfiguration {
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("myJob", jobRepository)
.build();
}
}
DefaultBatchConfigurer 클래스에 추가된 override 항목
기존의 테이블 prefix 나 인코딩 변경을 위해서 JobRepositoryFactoryBean 을 통해서 지정했으나 Spring Batch 5 부터는 DefaultBatchConfigurer 에 override 할 수 있는 메서드로 제공한다.
@Configuration
public class BatchConfiguration extends DefaultBatchConfigurer {
//as-is
@Override
protected JobRepository createJobRepository(@Qualifier("testDatasource") DataSource dataSource, @Qualifier("testTranjactionManager") PlatformTransactionManager platformTransactionManager) {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setTransactionManager(platformTransactionManager);
factory.setDataSource(dataSource);
factory.setTablePrefix("test_"); //메타 테이블의 prefix 를 지정함
return factory.getObject();
}
//to-be : spring batch 5 이전에 아래 메서드들이 존재하지 않는다.
@Override
protected String getTablePrefix() {
return "test_"
}
@Override
protected Charset getCharset() {
return StandardCharsets.UTF_8;
}
Default job parameter conversion
스프링배치는 Runtime 시에 외부에서 로직에서 사용하는 파라미터를 주입받을 수 있다. jobParameter 라고 하는데 외부에서 입력할때 타입을 지정해 줄 수 있는데 그 방식이 아래와 같이 변경됐다. identificationFlag 값을 추가해 식별자 여부를 지정할 수 있다. 식별자 여부는 스프링 배치 메타 테이블 job_execution_params 의 identifying 컬럼에 들어가면 배치 재실행 가능 여부의 구분 값이 된다.
//AS-IS
parameterName(parameterType)=value
//e.g
today(LocalDate)=2021-02-15
//TO-BE
parameterName=parameterValue,parameterType,identificationFlag
//e.g
today=2021-02-15,LocalDate,true
또한 아래와 같이 json 형태로 값을 전달할 수 있다. 전달 될 value 값에 comma 가 포함될 경우 유용하다.
parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'
Spring Batch 5의 변경된 부분을 알아 봤다. 기타 좀 더 많은 변경된 내용은 아래 스프링 공식 문서를 참고하면 된다.
References
https://docs.spring.io/spring-batch/docs/current/reference/html/whatsnew.html
'Spring' 카테고리의 다른 글
Spring Security Class Diagram (1) | 2022.11.24 |
---|---|
Spring Batch Sample Code (2) (0) | 2022.10.07 |
Spring Batch Sample Code (1) (4) | 2022.09.20 |
Spring Boot Reactive + Postgresql(r2dbc) (0) | 2020.09.23 |
Async method with Spring boot (0) | 2020.08.06 |
- Total
- Today
- Yesterday