Spring Batch 5에서 달라진 점

태규 최·2023년 4월 22일

What's new in Spring Batch 5.0?

주요 바뀐점

  • java 17 필요

  • 주요 의존성 변경

    • Spring Framework 6
    • Spring Integration 6
    • Spring Data 3
    • Spring AMQP 3
    • Spring for Apache Kafka 3
    • Micrometer 1.10
  • 데이터베이스 스키마 업데이트

    • BATCH_JOB_EXECUTION#JOB_CONFIGURATION_LOCATION 컬럼 삭제

      • 더이상 사용되지 않아서 필요가 없어짐

      • 일부 컬럼 삭제 및 추가

        CREATE TABLE BATCH_JOB_EXECUTION_PARAMS  (
        JOB_EXECUTION_ID BIGINT NOT NULL ,
        ---TYPE_CD VARCHAR(6) NOT NULL ,
        ---KEY_NAME VARCHAR(100) NOT NULL ,
        ---STRING_VAL VARCHAR(250) ,
        ---DATE_VAL DATETIME(6) DEFAULT NULL ,
        ---LONG_VAL BIGINT ,
        ---DOUBLE_VAL DOUBLE PRECISION ,
        +++PARAMETER_NAME VARCHAR(100) NOT NULL ,
        +++PARAMETER_TYPE VARCHAR(100) NOT NULL ,
        +++PARAMETER_VALUE VARCHAR(2500) ,
        IDENTIFYING CHAR(1) NOT NULL ,
        constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
        references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
        
  • @EnableBatchProcessing 변경점

    • Map - based Job Repository랑 explorer가 완전히 삭제 되었음

    • 따라서 @EnableBatchProcessing 어노테이션이 JDBC 기반 JobRepository를 설정함

    • DataSource랑 PlatformTransactionManager 빈을 어플리케이션 컨텍스트에서 찾음

    • 필요할 경우 @EnableBatchProcessing 어노테이션이나 DefaultBatchConfiguration#getTransactionManager()를 오버라이딩 해서 사용자 지정 TransactionManager를 재지정할수있다.

    • 새로운 annotaion 속성 추가

      @Configuration
      @EnableBatchProcessing(dataSourceRef = "batchDataSource", transactionManagerRef = "batchTransactionManager")
      public class MyJobConfiguration {
      
      @Bean
      public Job job(JobRepository jobRepository) {
      return new JobBuilder("myJob", jobRepository)
      //define job flow as needed
      .build();
      }
      
      }
```java
// Sample with v4
@Configuration
@EnableBatchProcessing
public class MyStepConfig {

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Step myStep() {
        return this.stepBuilderFactory.get("myStep")
                .tasklet(..) // or .chunk()
                .build();
    }

}
```

```java
// Sample with v5
@Configuration
@EnableBatchProcessing
public class MyStepConfig {

    @Bean
    public Tasklet myTasklet() {
       return new MyTasklet();
    }

    @Bean
    public Step myStep(JobRepository jobRepository, Tasklet myTasklet, PlatformTransactionManager transactionManager) {
        return new StepBuilder("myStep", jobRepository)
                .tasklet(myTasklet, transactionManager) // or .chunk(chunkSize, transactionManager)
                .build();
    }

}
```
  • chunk를 사용할때 TransactionManager를 명시적으로 지정해야 한다.

  • JobBuilderFactory랑 StepBuilderFactory Deprecated

    // Sample with v5
    @Configuration
    @EnableBatchProcessing
    public class MyJobConfig {
    
        @Bean
        public Job myJob(JobRepository jobRepository, Step step) {
            return new JobBuilder("myJob", jobRepository)
                    .start(step)
                    .build();
        }
    
    }
  • jobRepository를 명시적으로 선언해야함

  • 기존의 BuilderFactory가 아닌 Builder를 사용해야 하며 , Job이나 Step을 생성할때 JobRepository를 명시해야 한다.

새로운 설정 클래스 추가

  • @EnableBatchProcessing 어노테이션 대신 DefaultBatchCOnfiguration 클래스를 직접 사용할 수 있다.

  • getDataSource, getTransactionManager, getCharset등의 메소드를 오버라이딩 해서 새로운 값을 지정해서 사용 할 수 있다.

    @Configuration
    class MyJobConfiguration extends DefaultBatchConfiguration {
    
    @Bean
    public Job job(JobRepository jobRepository) {
    return new JobBuilder("job", jobRepository)
    // define job flow as needed
    .build();
    }
    
    @Override
    protected Charset getCharset() {
    return StandardCharsets.ISO_8859_1;
    }
    }
    

JobParameters 변경

  • 모든 타입을 매개 변수로 사용할수 있게 지원

  • 기존의 String ,long double ,date에서 변경

  • 파라미터 표기법이 변경 되었다.

  • parameterName=parameterValue,parameterType,identificationFlag 형식으로 변경

    parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'
  • json 형식으로도 가능하다

---public class JobParameter implements Serializable {
+++public class JobParameter<T> implements Serializable {

---   private Object parameter;
+++   private T value;

---   private ParameterType parameterType;
+++   private Class<T> type;

}
  • JobParameter에서 모든 타입이 허용 되어서 이제 제네릭으로 타입 지정이 가능하다

Execution Context 직렬화 변경

  • Base64로 직렬화를하고 역직렬화를 한다.
  • ExecutionContextSerializer는 @EnableBatchProcessing이나 DefaultBatchConfiguration에서 설정이 된다.
  • JacksonExecutionContextStringSerializer - > DefaultExecutionContextSerializer로 변경

Java Record 지원

  • 자바 버전이 17로 바뀌어서 Record 지원
  • 기존에는 Reflection을 이용해서 우회해서 지원했었음

GraalVM 네이티브 지원

  • GraalVM을 사용할 수 있음
  • 4.3에는 베타버전이었으나 이제 실질적으로 도입이 됌

Java 8 특징 업데이트

  • 인터페이스에 default 메소드 사용 , support 클래스들 deprecated
  • ItemProcessor, ItemReader, ItemWriter등 인터페이스에 @FunctionalInterface 어노테이션 추가

0개의 댓글