도움이 됐던 자료들
JobBuilderFactory, StepBuilderFactory deprecated
이제는 Job이나 Step을 생성하면서 JobRepository와 TransactionManager를 넣어줘야 한다. JobRepository 자동 생성을 위해서는 Job 관리에 사용될 DataSource와 TransactionManager를 넣어줘야 하는데, SpringBootBatchConfiguration
에서 받아올 수 있도록 @Primary
를 붙여줘야 한다.
구조적으로 개선이 됐다고 생각되는데, 트랙잭션 매니저가 하나로 고정돼있어 소스와 타겟 DB가 다르면 별도의 작업을 해줘야 한다던가 하는 부분이 개선돼었다고 본다. 다만 이렇게 되면 청크단위로 가져올때 중단 지점을 어떻게 파악하고 트랜잭션을 되돌릴건지의 구현이 중요할 것 같은데 이건 따로 찾아봐야 할듯.
BatchAutoConfiguration
조건 변경 (이제는 @EnableBatchProcessing
를 제거해줘야 자동 설정이 된다.)
@ConditionalOnMissingBean(
value = {DefaultBatchConfiguration.class},
annotation = {EnableBatchProcessing.class} // 이제는 @EnableBatchProcessing를 빼야 자동설정이 된다.
)
JobLauncherApplicationRunner
를 직접 만들어서 해결한 사람도 있던데, 현재는 이렇게 까지 할 필요가 없어 @EnableBatchProcessing
를 빼주는 식으로 작업했다.job parameter 포멧 변경
parameterName=parameterValue,parameterType,identificationFlag
혹은 parameterName='{"value": "parameterValue", "type":"parameterType(default: String)", "identifying": "booleanValue(default: true)"}'
와 같은 형식으로 변경됐다.$ --job.name=myJob param1=one param2=2024-05-31T00:00:00,java.time.LocalDateTime
위 예시에서 param2는 LocalDateTime으로 바로 받을 수 있다. JobParameter(value: T, class<T>)
사용ItemWriteListener 의 메소드들의 타입 변경
// void beforeWrite(java.util.List<? extends S> items)
default void beforeWrite(Chunk<? extends S> items)
// void afterWrite(java.util.List<? extends S> items)
default void afterWrite(Chunk<? extends S> items)
//void onWriteError(java.lang.Exception exception, java.util.List<? extends S> items)
default void onWriteError(Exception exception, Chunk<? extends S> items)
Chunk는 이렇게 생겼다
public class Chunk<W> implements Iterable<W>, Serializable {
// ...
@SafeVarargs
public Chunk(W... items) {
this(Arrays.asList(items));
}
@SafeVarargs
public static <W> Chunk<W> of(W... items) {
return new Chunk(items);
}
public Chunk(List<? extends W> items) {
this(items, (List)null);
}
public Chunk(List<? extends W> items, List<SkipWrapper<W>> skips) {
// ...
}
public void add(W item) {
this.items.add(item);
}
public void addAll(List<W> items) {
this.items.addAll(items);
}
public void clear() {
this.items.clear();
this.skips.clear();
this.userData = null;
}
// ...