Spring Batch 병렬 처리 시 “Scope ‘job’ is not active” 오류 해결 방법 (Spring Boot 3 + Batch 5)

Spring Batch 병렬 처리 시 발생하는 Scope 'job' is not active 오류와 해결 방법

Spring Boot 3 + Spring Batch 5 환경에서 병렬 Step 처리(TaskExecutorPartitionHandler)를 구현하던 중 다음과 같은 오류가 발생할 수 있습니다:

Scope 'job' is not active for the current thread
No context holder available for job scope

해당 오류는 Spring Batch에서 병렬 처리 시 @JobScope 혹은 @StepScope로 정의된 Bean이 Job Scope가 아닌 스레드에서 접근되었을 때 발생합니다.


📌 오류 발생 시나리오 예시

예를 들어 다음과 같이 PartitionHandler 설정을 하고 병렬로 특정 Step을 실행하는 구조에서 문제가 발생할 수 있습니다.

@Bean
public PartitionHandler samplePartitionHandler(
@Qualifier("sampleTaskExecutor") TaskExecutor taskExecutor,
@Qualifier("sampleWorkerStep") Step sampleWorkerStep) {

TaskExecutorPartitionHandler handler = new TaskExecutorPartitionHandler();
handler.setTaskExecutor(taskExecutor);
handler.setStep(sampleWorkerStep); // 여기서 오류 발생
handler.setGridSize(3);
return handler;
}

위 예제에서 sampleWorkerStep@JobScope 또는 @StepScope로 정의되어 있다면, PartitionHandler는 싱글톤 빈 생성 시점에 주입받으려고 하면서 Scope 오류가 발생하게 됩니다.


✅ 해결 방법

다음과 같은 방법으로 오류를 해결할 수 있습니다.


1. 지연 주입 (Lazy Injection)

ObjectProvider, ObjectFactory, javax.inject.Provider를 사용해 실행 시점에 Step을 주입되도록 처리하면 해결됩니다.

@Bean
public PartitionHandler samplePartitionHandler(
@Qualifier("sampleTaskExecutor") TaskExecutor taskExecutor,
@Qualifier("sampleWorkerStep") ObjectProvider<Step> stepProvider) {

TaskExecutorPartitionHandler handler = new TaskExecutorPartitionHandler();
handler.setTaskExecutor(taskExecutor);
handler.setStep(stepProvider.getObject());
handler.setGridSize(3);
return handler;
}

2. @JobScope / @StepScope 제거

sampleWorkerStep에서 동적으로 Job Parameter 등을 주입받을 필요가 없다면, 아예 Scope 어노테이션 없이 일반 @Bean으로 선언할 수도 있습니다.

@Bean
public Step sampleWorkerStep(StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get("sampleWorkerStep")
.<Input, Output>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}

🔄 정리

문제 원인해결 방법
병렬 처리 시 JobScope/StepScope Bean에 접근지연 주입으로 Scope 오류 회피
싱글톤 빈에서 Scope Bean 직접 주입ObjectProvider 등으로 지연 처리
Scope 제거 가능한 경우일반 @Bean으로 선언하여 단순화

Spring Batch에서 병렬 Step을 안전하게 구성하려면 Scope와 Bean 생성 시점에 대한 깊은 이해가 필요합니다. 위 내용을 참고해 구조를 개선하면 병렬 처리 시 발생하는 Scope 오류를 효과적으로 방지할 수 있습니다.

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다