개발일기/Spring

Spring batch 5.0 Migration Guide - 국문 번역

ignuy 2024. 10. 31.

본문은 Spring-project의 spring-batch에서 소개하는 Spring Batch 5.0 Migration Guide를 국문 번역 해놓은 글이다. v4와 v5가 정말 많이 바뀌었다. v5로 migration 하는 개발자들에게 조금이나마 도움이 되기를 바라는 마음으로 국문으로 옮겨본다.

최대한 github Wiki 작성자의 의도를 옮기기 위해서 형식도 그대로 가져왔다. 혹여나 해소되지 않은 의문이 있다면 영어 본문(아래 링크)을 참고하자.

https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide


본 문서는 Spring Batch 5.0으로 애플리케이션을 마이그레이션하는 개발자를 돕기 위해 작성되었다.

Major Changes

JDK 17 baseline

Spring Batch 5버전은 Java 17보다 상위 버전을 요구하는 Spring Framework 6을 기반으로 설계되었다. 따라서 Spring Batch 5 버전을 사용하기 위해서는 Java 17보다 상위 버전의 JDK가 필요하다.

Dependencies Upgrade

Spring Batch 5는 하기 버전의 Spring 종속성을 업데이트하고 있다.

  • Spring Framework 6
  • Spring Intergration 6
  • Spring Data 3
  • Spring AMQP 3
  • Spring for Apache Kafka 3
  • Micrometer 1.10

또한, Spring Batch 5를 사용하기 위해서 하기에 해당하는 마이그레이션은 반드시 유의할 점을 서술해 두었다.

  • Jakarta EE 9 : 사용하고 있는 모든 EE APIS의 import 문의 path를 Javax.*에서 jakarta.*로 수정해야 한다.
  • Hibernate 6 : Hibernate의 (cursor/paging) item reader와 writer는 기존에 사용하던 Hibernate 5.6 APIs에서 Hibernate 6.1 APIs를 사용하는 것으로 수정되었다.

추가로 아래 항목들도 유의하자.

  • org.springframework:spring-jdbc패키지는 spring-batch-core의 동작을 위한 필수적인 의존성이다.
  • spring-batch-test는 더 이상 junit:junit에 의존성을 갖지 않는다.
  • com.fasterxml.jackson.core:jackson-core는 spring-batch-core 동작에 선택적인 의존성을 가진다.

Database schema updates

Oracle

v5에서 오라클 Sequnce는 순서가 보장되는 방식으로 생성되고 관리된다. Sequence 생성 스크립트가 v5에서 새롭게 업데이트되었다. 이전 버전의 애플리케이션은 org/springframework/batch/core/migration/5.0/migration-oracle.sql에 존재하는 migration 스크립트를 사용하여 기존에 존재하던 sequence 들을 변경할 수 있다.

 

게다가, Oracle의 DDL script도 새롭게 이름이 변경되었으니 아래를 참고하자.

변경 전 변경 후
org/springframework/batch/core/schema-drop-oracle10g.sql org/springframework/batch/core/schema-drop-oracle.sql
org/springframework/batch/core/schema-oracle10g.sql org/springframework/batch/core/schema-oracle.sql

MS SQLServer

v4까지 MS SQLServer의 DDL 스크립트는 테이블을 사용하여 Sequence를 에뮬레이트했다. 그러나 v5에 와서는 이러한 사용법은 실제 sequences를 사용하도록 업데이트되었다.

CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE;
CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE;

새로운 패치 버전을 사용하는 Batch Application은 수정 없이 제공된 스크립트를 활용하면 된다. 패치 이전 버전을 사용하던 v4 Batch Application은 사용하던 sequence 테이블의 마지막 값에서 시퀀스를 시작하도록 위 스니펫을 수정하는 것을 권장한다.

모든 플랫폼 대상

BATCH_JOB_EXECUTION#JOB_CONFIGURATION_LOCATION 칼럼 제거

BATCH_JOB_EXECUTION 테이블의 JOB_CONFIGURATION_LOCATION 칼럼은 더 이상 사용되지 않으며 필요에 따라 제거하거나 사용하지 않도록 설정할 수 있습니다.

ALTER TABLE BATCH_JOB_EXECUTION DROP COLUMN JOB_CONFIGURATION_LOCATION;

위 칼럼을 drop 하는 DDL script는 애플리케이션이 사용하는 DB server의 버전에 따라 달라질 수 있으므로 해당 버전의 문법을 확인하여 사용하면 된다. 또한, 일부 플랫폼에서는 테이블을 재구성해야 할 수 있다.

⚠️ 주의 ⚠️ 이 변경은 JSR-352 구현 취소와 연관 있다. JSR-352 기능은 Spring-batch 프레임워크를 통틀어 해당 칼럼을 사용하는 유일한 기능이었기 때문에 JobExecution#jobConfigurationName 필드와 이를 사용하는 모든 API(예: JobExecution 도메인 객체의 생성자와 getter, JobRepositoryJobRepository#createJobExecution(JobInstance, JobParameters, String); 메서드)가 제거되었다.

 

BATCH_JOB_EXECUTION_PARAMS칼럼 변경

BATCH_JOB_EXECUTION_PARAMS 테이블이 아래와 같이 업데이트되었다.

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)
);

이 변경은 Job parameters의 저장 방식을 개선하기 위해 적용되었다. 관련 내용은 https://github.com/spring-projects/spring-batch/issues/3960에서 확인할 수 있으며, 마이그레이션 스크립트는 org/springframework/batch/core/migration/5.0에 있다.

 

BATCH_STEP_EXECUTION의 칼럼 변경

v5에서 새로운 칼럼 CREATE_TIME이 추가되었다. 사용하고 있는 데이터베이스 서버에 맞게 커스텀하여 다음과 같이 테이블을 변경하는 Script를 반영해주어야 한다.

ALTER TABLE BATCH_STEP_EXECUTION ADD CREATE_TIME TIMESTAMP NOT NULL DEFAULT '1970-01-01 00:00:00';

또한, START_TIME 칼럼의 NOT NULL 제약 조건이 제거되었다. 이도 마찬가지로 데이터베이스 서버에 맞게 커스텀하여 Script를 반영해주어야 한다.

ALTER TABLE BATCH_STEP_EXECUTION ALTER COLUMN START_TIME DROP NOT NULL;

@EnableBatchProcessing를 사용한 Infrastructure Bean 설정

Job Repository/Explorer 설정 업데이트

v4에서 deprecated 되었던 Map 기반의 Job Repository/explorer구현은 v5에서 완전히 제거되었다. 따라서, v5부터는 Jdbc 기반의 구현을 사용해야 한다. @EnableBatchProcessing 애노테이션을 사용하는 경우, DataSource bean이 애플리케이션 컨텍스트에 존재하면 자동으로 Jdbc 기반의 JobRepository가 구성된다. 이 DataSource bean은 H2나 HSQL과 같은 임베디드 데이터베이스를 참조하여 메모리 상의 Job repository와 함께 사용할 수 있다.

Transaction manager bean 노출 및 설정

v4.3까지는 @EnableBatchProcessing 애노테이션이 애플리케이션 컨텍스트에 transaction manager bean을 노출시켰다. 이 방법은 많은 상황에서 유용하게 작용되었지만 반면, 의도치 않게 transaction manager가 사용자가 직접 정의한 transaction manager와 충돌하는 일이 있었다. 이번 릴리스부터는 @EnableBatchProcessing이 더 이상 transaction manager 빈을 애플리케이션 컨텍스트에 노출하지 않는다. 이 변경은 아래 이슈와 관련 있다.

 

PlatformTransactionManager bean is exposed unconditionally [BATCH-2788] · Issue #816 · spring-projects/spring-batch

Stéphane Nicoll opened BATCH-2788 and commented While this can't be changed easily as it will break backward compatibility, Spring Batch should not expose a PlatformTransactionManager unconditional...

github.com

앞서 말한 변경으로 인하여, transaction manager 설정에 관련된 XML과 Java Config 설정 스타일 간의 불일치 문제를 해결한 아래 이슈와 더불어, 이제는 모든 Tasklet 스텝 정의에서 transaction manager를 수동으로 설정해야 한다. 이에 따라 StepBuilderHelper#transactionManager(PlatformTransactionManager) 메서드는 더 하위 레벨인 AbstractTaskletStepBuilder로 이동했다.

이번 변경으로 인해 v4에서 v5의 일반적인 마이그레이션 방식은 아래와 같다.

// 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();
    }

}
// 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();
    }

}

이 설정은 Tasklet 스텝에만 필요하며, 다른 유형의 스텝은 설계상 transaction manager를 필요로 하지 않는다.

 

게다가, transaction manager는 BatchConfigurer#getTransactionManager 메서드를 구현하여 설정할 수 있었습니다. transaction manager는 JobRepository의 구현 세부 사항이므로 JobRepository와 같은 수준(즉, 같은 인터페이스)에서 설정 가능한 것은 적절하지 않았다. 따라서, 이번 릴리스부터 BatchConfigurer 인터페이스가 삭제되었다. 필요시, 커스텀 transaction manager는 @EnableBatchProcessing의 속성으로 선언적(declaratively)으로 제공하거나, DefaultBatchConfiguration#getTransactionManager()를 재정의하여 프로그래밍 방식으로 제공할 수 있다. 이 변경에 대한 자세한 내용은 아래 관련 이슈에서 확인할 수 있다.

 

Revisit the configuration of infrastructure beans with @EnableBatchProcessing · Issue #3942 · spring-projects/spring-batch

Compared to the XML configuration style where infrastructure beans (JobRepository, JobLauncher, etc) should be defined manually, @EnableBatchProcessing does a good job in configuring those beans au...

github.com

JobBuilderFactoryStepBuilderFactory 빈 노출 및 설정

JobBuilderFactoryStepBuilderFactory는 이제 더 이상 애플리케이션 컨텍스트에 빈으로 노출되지 않으며, 각각의 빌더 사용을 권장하기 위해 v5.2에서 제거되었다.

 

v4에서 v5로 마이그레이션 하는 일반적인 방법은 다음과 같다.

// Sample with v4
@Configuration
@EnableBatchProcessing
public class MyJobConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Bean
    public Job myJob(Step step) {
        return this.jobBuilderFactory.get("myJob")
                .start(step)
                .build();
    }

}
// Sample with v5
@Configuration
@EnableBatchProcessing
public class MyJobConfig {

    @Bean
    public Job myJob(JobRepository jobRepository, Step step) {
        return new JobBuilder("myJob", jobRepository)
                .start(step)
                .build();
    }

}

동일한 패턴을 사용하고 있는 StepBuilderFactory 또한 삭제될 예정이다. 이 변경에 대한 자세한 내용은 아래 이슈에서 확인할 수 있습니다.

 

Deprecate Job/Step builder factories · Issue #4188 · spring-projects/spring-batch

JobBuilderFactory was reported to be of no real added value compared to JobBuilder. In fact, it only sets a single property on the builder it creates, which is the job repository. While this is not...

github.com

데이터 타입 업데이트

  1. org.springframework.batch.core.StepExecutionorg.springframework.batch.core.StepContribution에서의 메트릭 카운터(readCount, writeCount 등)는 int에서 long으로 변경되었다. 모든 getter와 setter도 이에 맞게 업데이트되었다.
  2. org.springframework.batch.core.step.skip.SkipPolicy#shouldSkipskipCount 매개변수도 int에서 long으로 변경되었다. 이는 1번의 변경 사항과 관련 있다.
  3. JobExecutionStepExecution의 startTime, endTime, createTime, lastUpdated 필드 타입이 java.util.Date에서 java.time.LocalDateTime으로 변경되었다.

가시성(Observability) 업데이트

  1. Micrometer가 버전 1.10으로 업데이트되었다.
  2. 모든 태그는 이제 미터 이름으로 접두사가 붙는다. 예를 들어, v4.x에서는 spring.batch.job 타이머의 태그 이름이 namestatus였지만, v5에서는 spring.batch.job.namespring.batch.job.status로 변경되었다.
  3. BatchMetrics 클래스(내부 사용 전용)는 org.springframework.batch.core.metrics에서 org.springframework.batch.core.observability 패키지로 이동되었다.

Execution Context 직렬화 업데이트

v5부터 기본 ExecutionContextSerializerJacksonExecutionContextStringSerializer에서 DefaultExecutionContextSerializer로 변경되었다. 이제 기본 직렬화는 ExecutionContext를 Base64로 직렬화/역직렬화한다.

이에 따라 Jackson은 이제 선택적 의존성으로 변경되었다. JacksonExecutionContextStringSerializer를 사용하려면 jackson-core를 클래스 경로에 추가해야 한다.

SystemCommandTasklet 업데이트

이번 릴리스부터 SystemCommandTasklet이 다음과 같이 개선되었다.

  • 명령 실행을 Tasklet 실행과 분리하기 위해 새로운 전략 인터페이스 CommandRunner가 도입되었다. 기본 구현체는 JvmCommandRunner이며, java.lang.Runtime#exec를 사용해 시스템 명령을 실행한다. 이 인터페이스를 구현하면 다른 API를 사용하여 시스템 명령을 실행할 수 있다.
  • 명령을 실행하는 메서드는 이제 명령과 그 인수를 나타내는 String 배열을 받아들인다. 이제 더 이상 명령을 토큰화하거나 사전 처리할 필요가 없어졌다. 이번 변경으로 API가 보다 직관적이고 오류 발생 가능성이 줄어들었습니다.

Job parameters handling 업데이트

모든 유형의 Job parameter 지원

이번 변경은 이전 버전(v4)가 지원하는 4가지 사전 정의 타입(long, double, string, date) 외에도 모든 유형의 파라미터를 Job 파라미터로 사용할 수 있도록 지원한다. 주요 변경 사항은 아래 코드로 확인할 수 있다.

---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가 어떤 타입이든 가능할 수 있게 변경되었다. 이번 변경으로 getType() 메서드의 반환 유형 변경과 ParameterType 열거형 제거 등 많은 API를 수정해야 했다. 이 업데이트와 관련된 모든 변경 사항은 후술 할 "[Deprecated|Moved|Removed] APIs" 섹션에서 확인할 수 있다.

 

이 변경으로 인해 Job parameter가 데이터베이스에 저장되는 방식에도 영향을 미쳤다. 이제 각각의 사전 정의된 유형에 대한 4가지 칼럼이 필요하지 않다. DDL의 변화를 확인하고 싶다면 아래 링크를 확인하자. Column change in BATCH_JOB_EXECUTION_PARAMS

이제는 파라미터 유형의 완전한 이름과 파라미터 값이 String으로 저장되며 표준 Spring 변환 서비스가 문자열을 파라미터 유형으로 변환해 준다. 표준 변환 서비스는 사용자 지정 유형을 문자열로 변환하거나 역변환하는 데 필요한 컨버터를 추가하여 확장할 수 있다.

기본 Job parameter 변환

v4의 기본 Job paramter 표기법은 아래와 같았다.

[+|-]parameterName(parameterType)=value

이때, paramterType은 [string, long, double, date] 중 하나였으며 이 표기법은 제한적인 사용법으로 여러 문제를 일으켰다. 관련된 이슈를 아래 첨부한다.

 

Revisit the default behaviour of job parameters conversion · Issue #3960 · spring-projects/spring-batch

The current behaviour of the DefaultJobParametersConverter has been confusing in many situations: The way to specify parameter types with the parameter(type)=value notation is not friendly to comma...

github.com

따라서 v5에서는 두 가지 방식으로 Job paramter를 지정할 수 있다.

 

기본 표기법

기본 표기법은 아래와 같이 지정된다.

parameterName=parameterValue,parameterType,identificationFlag

여기서 parameterType은 파라미터 타입과 완전히 동일한 이름(fully qualified name)이다. Spring Batch는 이 표기법을 지원하기 위해 DefaultJobParametersConverter를 제공한다.

 

확장 표기법

기본 표기법은 대부분의 경우에는 잘 맞아떨어지지만, 값에 쉼표가 포함된 경우 등 특수한 상황에는 불편할 수 있다. 이 경우 확장 표기법을 사용할 수 있으며, Spring Boot의 JSON 애플리케이션 프로퍼티를 참고하여 아래와 같이 지정할 수 있다.

parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'

여기서 parameterType은 기본표기법과 마찬가지로 파라미터 타입과 완전히 동일한 이름(fully qualified name)이다. Spring Batch는 이 표기법을 지원하기 위해 JsonJobParametersConverter를 제공한다.

 

이전 데이터 접근에 대한 영향

Job parameter 처리 방식에 대한 급격한 변경 때문에 일부 배치 메타데이터 탐색을 위해 설계된 API는 v4로 실행된 Job instance에 사용하지 않는 것이 좋다. 아래 예시를 참고해서 유의하길 바란다.

  • JobExplorer#getJobInstances는 v4와 v5의 이전 데이터를 혼합해 가져올 수 있으며, v4의 Job 파라미터를 로드하는 데 실패할 수 있다(#4352). 이 경우 v5로 실행된 첫 번째 인스턴스의 인덱스에서 시작하는 것이 좋다.
  • JobExplorer#getJobExecution은 전달된 Job execution ID가 v4로 실행된 Job execution ID인 경우 Job parameter를 검색하는 데 실패할 수 있다.

이번 변경으로 job paramter를 로딩하는데 실패한 경우들은 job instance를 재시작하는데 실패할 수 있다. 따라서 모든 실패한 v4 job instance가 재실행되거나 폐기되기 전에 v5로 마이그레이션하는 것이 권장된다.

Deprecated APIs

하기 API들은 v5에서 deprecated 되었다.

  • org.springframework.batch.core.listener.ChunkListenerSupport
  • org.springframework.batch.core.listener.StepExecutionListenerSupport
  • org.springframework.batch.repeat.listener.RepeatListenerSupport
  • org.springframework.batch.core.listener.JobExecutionListenerSupport
  • org.springframework.batch.core.listener.SkipListenerSupport
  • org.springframework.batch.item.data.Neo4jItemReader
  • org.springframework.batch.item.data.builder.Neo4jItemWriterBuilder
  • org.springframework.batch.item.data.Neo4jItemWriter
  • org.springframework.batch.item.data.builder.Neo4jItemWriterBuilder
  • org.springframework.batch.item.database.support.SqlPagingQueryUtils#generateLimitGroupedSqlQuery(org.springframework.batch.item.database.support.AbstractSqlPagingQueryProvider, boolean, java.lang.String)
  • org.springframework.batch.core.repository.dao.JdbcJobInstanceDao#setJobIncrementer(DataFieldMaxValueIncrementer jobIncrementer)
  • org.springframework.batch.core.launch.support.SimpleJobLauncher
  • org.springframework.batch.core.configuration.annotation.JobBuilderFactory
  • org.springframework.batch.core.configuration.annotation.StepBuilderFactory
  • The constructor org.springframework.batch.core.job.builder.JobBuilder#JobBuilder(java.lang.String)
  • The constructor org.springframework.batch.core.step.builder.StepBuilder#StepBuilder(java.lang.String)
  • The method org.springframework.batch.core.step.builder.StepBuilder#tasklet(org.springframework.batch.core.step.tasklet.Tasklet)
  • The method org.springframework.batch.core.step.builder.StepBuilder#chunk(int)
  • The method org.springframework.batch.core.step.builder.StepBuilder#chunk(org.springframework.batch.repeat.CompletionPolicy)
  • The method org.springframework.batch.core.step.builder.TaskletStepBuilder#tasklet(org.springframework.batch.core.step.tasklet.Tasklet)
  • The constructor org.springframework.batch.integration.chunk.RemoteChunkingManagerStepBuilder#RemoteChunkingManagerStepBuilder(java.lang.String)
  • The constructor org.springframework.batch.integration.partition.RemotePartitioningManagerStepBuilder#RemotePartitioningManagerStepBuilder(java.lang.String)
  • The constructor org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilder#RemotePartitioningWorkerStepBuilder(java.lang.String)
  • The method org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilder#tasklet(org.springframework.batch.core.step.tasklet.Tasklet)
  • The method org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilder#chunk(int)
  • The method org.springframework.batch.integration.partition.RemotePartitioningWorkerStepBuilder#chunk(org.springframework.batch.repeat.CompletionPolicy)
  • The method org.springframework.batch.core.JobParameters#toProperties
  • The method org.springframework.batch.core.JobParametersBuilder#addParameter
  • The class org.springframework.batch.core.launch.support.JobRegistryBackgroundJobRunner
  • The class org.springframework.batch.test.DataSourceInitializer
  • The class org.springframework.batch.integration.step.DelegateStep
  • The annotation org.springframework.batch.support.annotation.Classifier
  • The class org.springframework.batch.item.ItemStreamSupport
  • The method org.springframework.batch.core.step.builder.AbstractTaskletStepBuilder#throttleLimit
  • The method org.springframework.batch.repeat.support.TaskExecutorRepeatTemplate#setThrottleLimit
  • The interface org.springframework.batch.repeat.support.ResultHolder
  • The interface org.springframework.batch.repeat.support.ResultQueue
  • The class org.springframework.batch.repeat.support.ResultHolderResultQueue
  • The class org.springframework.batch.repeat.support.ThrottleLimitResultQueue

더 자세한 사항은 각각의 해당 API의 javadoc을 참고하길 바란다.

이동된 APIs

변경 대상 변경 전 변경 후
BatchMetrics org.springframework.batch.core.metrics org.springframework.batch.core.observability
Chunk org.springframework.batch.core.step.item(spring-batch-core module) org.springframework.batch.item(spring-batch-infrastructure module)
ScopeConfiguration org.springframework.batch.core.configuration.annotation org.springframework.batch.core.configuration.support

삭제된 APIs

하기 API들은 이전 버전에서 derprecated되어 v5에서 삭제되었다.

  • Class org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean
  • Class org.springframework.batch.core.repository.dao.MapExecutionContextDao
  • Class org.springframework.batch.core.repository.dao.MapJobExecutionDao
  • Class org.springframework.batch.core.repository.dao.MapJobInstanceDao
  • Class org.springframework.batch.core.repository.dao.MapStepExecutionDao
  • Class org.springframework.batch.core.explore.support.MapJobExplorerFactoryBean
  • Class org.springframework.batch.core.repository.dao.XStreamExecutionContextStringSerializer
  • Class org.springframework.batch.core.configuration.support.ClassPathXmlJobRegistry
  • Class org.springframework.batch.core.configuration.support.ClassPathXmlApplicationContextFactory
  • Class org.springframework.batch.core.launch.support.ScheduledJobParametersFactory
  • Class org.springframework.batch.item.data.AbstractNeo4jItemReader
  • Class org.springframework.batch.item.database.support.ListPreparedStatementSetter
  • Class org.springframework.batch.integration.chunk.RemoteChunkingMasterStepBuilder
  • Class org.springframework.batch.integration.chunk.RemoteChunkingMasterStepBuilderFactory
  • Class org.springframework.batch.integration.partition.RemotePartitioningMasterStepBuilder
  • Class org.springframework.batch.integration.partition.RemotePartitioningMasterStepBuilderFactory
  • Class org.springframework.batch.test.AbstractJobTests
  • Class org.springframework.batch.item.xml.StaxUtils
  • Enum org.springframework.batch.item.file.transform.Alignment
  • Enum org.springframework.batch.core.JobParameter#ParameterType
  • Method org.springframework.batch.core.JobExecution#stop()
  • Method org.springframework.batch.core.JobParameters#getDouble(String key, double defaultValue)
  • Method org.springframework.batch.core.JobParameters#getLong(String key, long defaultValue)
  • Method org.springframework.batch.core.partition.support.SimpleStepExecutionSplitter(JobRepository jobRepository, Step step, Partitioner partitioner)
  • Method org.springframework.batch.core.partition.support.SimpleStepExecutionSplitter#getStartable(StepExecution stepExecution, ExecutionContext context)
  • Method org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean#getJobRepository()
  • Method org.springframework.batch.item.database.AbstractCursorItemReader#cleanupOnClose()
  • Method org.springframework.batch.item.database.HibernateItemWriter#doWrite(HibernateOperations hibernateTemplate, List<? extends T> items)
  • Method org.springframework.batch.item.database.JdbcCursorItemReader#cleanupOnClose()
  • Method org.springframework.batch.item.database.StoredProcedureItemReader#cleanupOnClose()
  • Method org.springframework.batch.item.database.builder.HibernatePagingItemReaderBuilder#useSatelessSession(boolean useStatelessSession)
  • Method org.springframework.batch.item.file.MultiResourceItemReader#getCurrentResource()
  • Method org.springframework.batch.integration.config.annotation.BatchIntegrationConfiguration#remoteChunkingMasterStepBuilderFactory()
  • Method org.springframework.batch.integration.config.annotation.BatchIntegrationConfiguration#remotePartitioningMasterStepBuilderFactory()
  • Method org.springframework.batch.item.util.FileUtils#setUpOutputFile(File file, boolean restarted, boolean overwriteOutputFile)

또한, 하기 API들은 deprecation 없이 바로 v5에서 삭제되었다.

  • The interface org.springframework.batch.core.configuration.annotation.BatchConfigurer was removed. See https://github.com/spring-projects/spring-batch/issues/3942
  • The class org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer was removed. See https://github.com/spring-projects/spring-batch/issues/3942
  • The method org.springframework.batch.core.step.builder.SimpleStepBuilder#processor(Function) has been removed to allow lambdas to be passed as item processors. See https://github.com/spring-projects/spring-batch/issues/4061 for more details about the rationale behind this removal. If you use an actual Function as argument for SimpleStepBuilder::processor, then you can change that to .processor(function::apply) to migrate to v5.
  • org.springframework.batch.item.file.builder.FlatFileItemWriterBuilder#resource, org.springframework.batch.item.file.ResourceAwareItemWriterItemStream#setResource, org.springframework.batch.item.json.builder.JsonFileItemWriterBuilder#resource, org.springframework.batch.item.json.JsonFileItemWriter#JsonFileItemWriter, org.springframework.batch.item.support.AbstractFileItemWriter#setResource, org.springframework.batch.item.xml.builder.StaxEventItemWriterBuilder#resource and org.springframework.batch.item.xml.StaxEventItemWriter#setResource have been updated to accept a org.springframework.core.io.WritableResource instead of a org.springframework.core.io.Resource. For more details about this change, please check https://github.com/spring-projects/spring-batch/issues/756
  • The static type org.springframework.batch.item.data.builder.RepositoryItemReaderBuilder.RepositoryMethodReference along with the method org.springframework.batch.item.data.builder.RepositoryItemReaderBuilder#repository(RepositoryMethodReference<?>) have been removed.
  • The signature of the method ItemWriter#write(List) was changed to ItemWriter#write(Chunk)
  • All implementations of ItemWriter were updated to use the Chunk API instead of List
  • All methods in the ItemWriteListener interface were updated to use the Chunk API instead of List
  • All implementations of ItemWriteListener were updated to use the Chunk API instead of List
  • The constructor of ChunkRequest was changed to accept a Chunk instead of a Collection of items
  • The return type of ChunkRequest#getItems() was changed from List to Chunk
  • The JobRepositoryTestUtils was changed to work against the JobRepository interface without depending on a datasource bean. For this change, the constructor that takes a DataSource as a parameter (JobRepositoryTestUtils(JobRepository jobRepository, DataSource dataSource)) as well as the public DataSource setter were removed. This is related to issue #4070.
  • The method StepBuilderHelper#transactionManager(PlatformTransactionManager) was moved to AbstractTaskletStepBuilder. This is related to issue https://github.com/spring-projects/spring-batch/issues/4130.
  • The methods RemotePartitioningManagerStepBuilder#transactionManager(PlatformTransactionManager) and RemotePartitioningWorkerStepBuilder#transactionManager(PlatformTransactionManager) were removed. A transaction manager is not required for those type of steps. This is related to issue https://github.com/spring-projects/spring-batch/issues/4130.
  • The method JobParameter#getType now returns T instead of Object
  • The constructors in JobParameter that took the 4 pre-defined job parameter types (date, string, long, double) where removed.
  • The constructor SkipWrapper(Throwable e) was removed
  • The setter setIsolationLevelForCreate(Isolation) in AbstractJobRepositoryFactoryBean was renamed to setIsolationLevelForCreateEnum
  • The return type of JobExplorer#getJobInstanceCount and JobInstanceDao#getJobInstanceCount has been changed from int to long
  • The return type of JobRepository#getStepExecutionCount and StepExecutionDao#countStepExecutions has been changed from int to long

지원 중단(Pruning)

SQLFire 지원 제거

SQLFire는 2014년 11월 1일에 EOL(End of Life)로 공지되었다. SQLFire를 Job Repository로 지원하는 기능은 4.3 버전에서 deprecated되었으며, v5에 올라와 제거되었다.

JSR-352 구현 제거

채택이 부족하여, 이번 릴리스에서 JSR-352의 구현이 중단되었다.

Gemfire 지원 제거

Apache Geode에 대한 Spring Data 지원을 중단하기로 결정함에 따라, Spring Batch에서 Geode에 대한 지원이 제거하였다. 이 코드는 커뮤니티 주도로 진행되는 spring-batch-extensions 저장소로 이동되었다.

댓글