인프런 커뮤니티 질문&답변

구준형님의 프로필 이미지

작성한 질문수

스프링 배치

스프링 배치 5 변경점 정리

작성

·

896

·

수정됨

9

5버전으로 강의 따라가면서 정리하고 있습니다(현재진행중). 공유하고자 올려봅니다.

혹여나 틀린점 있으면 지적해주세용.

Execution context serialization Updates

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

  • ExecutionContext에 Base64로 인코딩된 데이터가 저장됩니다.

  • @Configuration public class BatchConfig { @Bean public ExecutionContextSerializer jacksonSerializer() { return new Jackson2ExecutionContextStringSerializer(); } }

  • 강의처럼 데이터를 json으로 저장하고 싶으면, jackson-core의존성을 추가한 후, 위 설정클래스를 정의합니다.

섹션2~3

@EnableBatchProcessing 을 쓰게되면 BatchAutoConfiguration이 적용되지 않는다.

  • https://umbum.dev/1320/

  • 자동 구성과 수동 구성 요소가 동시에 존재할 때 발생할 수 있는 모호성과 충돌을 피하기 위해

BuilderFactory대신 JobBuilder, StepBuilder 직접 사용

  • 팩토리 클래스들은 종종 불필요한 복잡성을 추가하고, Spring Batch 구성의 일관성을 떨어뜨림.

  • 직접 사용해서 더 많은 제어 권한 획득

Tasklet 사용시 , PlatformTransactionManager 함께사용 (단일 사용 deprecated)

배치 설정 클래스 BasicBatchConfigurer DefaultBatchConfiguration으로 변경

 

섹션 3 - JobLauncher

주입받은 JobLauncher가 프록시객체가 아닌 실제 객체라서 DefaultBatchConfiguration 에서 JobLauncher를 얻어올 필요없이 바로 타입캐스팅 가능

섹션 4 - 배치 초기화 설정

spring:batch:job: names(x) -> name

실행 할 job을 찾지 못하면 예외가 발생합니다.

 

인텔리제이에 환경설정으로 프로그램 인수를 한개만 할당할 수 있게 변경되었습니다.

  • 파라미터 관련해서는 코드로 할당해줘야 합니다.

  • multiple jobs 실행 불가능.

    • JobLauncherApplicationRunner 의 executeLocalJobs 메서드에서 split으로 job 이름을 구분하는 코드가 삭제되었습니다.

섹션 7 - 스프링 배치 청크 프로세스 이해

  • chunk사용시 , PlatformTransactionManager 함께사용 (단일 사용 deprecated)

  • ItemWriter의 write(List<? extends String> items ) -> write(Chunk<? extends String> chunk)

    • Items에 접근하려면 getItems로 꺼내야합니다.

답변 3

1

spring batch 5.0.0~5.1.x 버전 사용 시 BeanPostProcessor Warning Log 해결법 공유합니다.

 


문제점

image.png

현재 spring boot 3.3.x (spring batch 5.1) 버전 코드를 실행만 해도 위처럼 BeanPostProcessor 관련 Warning Log 가 나옵니다. 큰 문제를 일으키지는 않지만 굉장히 성가십니다.


해결법

이 로그가 보기 싫으면 2개의 Bean 을 등록하면 됩니다.
(spring batch 5.0 ~ 5.1 버전 일 때만 하시면 됩니다, 5.2 에서는 고쳐질 예정입니다.)

 

package coding.toast.springbatch;

import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.configuration.support.JobRegistrySmartInitializingSingleton;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringBatchAppApplication {
	
	public static void main(String[] args) {
		SpringApplication.run(SpringBatchAppApplication.class, args);
	}
	
	// https://github.com/spring-projects/spring-batch/issues/4519
	// https://docs.spring.io/spring-batch/reference/5.2-SNAPSHOT/job/advanced-meta-data.html#jobregistrysmartinitializingsingleton
	@Bean
	public static BeanDefinitionRegistryPostProcessor jobRegistryBeanPostProcessorRemover() {
		return registry -> registry.removeBeanDefinition("jobRegistryBeanPostProcessor");
	}
	
	@Bean
	public JobRegistrySmartInitializingSingleton jobRegistrySmartInitializingSingleton(JobRegistry jobRegistry) {
		return new JobRegistrySmartInitializingSingleton(jobRegistry);
	}
}


- BeanDefinitionRegistryPostProcessor : 문제가 되는 JobRegistryBeanPostProcessor 제거
- JobRegistrySmartInitializingSingleton : JobRegistryBeanPostProcessor 을 대체함

 


참고

참고로 이 문제는 Spring batch 5.2 (=> Spring Boot 3.4.x 적용 예정) 에서 고쳐질 예정입니다.

1

세세하게 정리해주셔서 감사합니다. 덕분에 무리없이 따라가고 있습니다!

1

정수원님의 프로필 이미지
정수원
지식공유자

감사합니다^^