티스토리 뷰

Spring

Spring Batch 5 GA

§무명소졸§ 2022. 12. 23. 19:08

https://spring.io/batch

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
링크