JobParameters란 무엇인가?
JobParameters는 배치 작업에 전달되는 입력 값이다.
이 값은 배치가 어떤 조건에서, 어떤 데이터를 다룰지를 결정하는 데 핵심적인 역할을 한다.
프로퍼티와 JobParameters의 결정적 차이
1. 입력값 동적 변경
./gradlew bootRun --args='--spring.batch.job.name=systemTerminationSimulationJob'2. 메타데이터
여기서 JobParameters의 진짜 강점이 드러난다. Spring Batch는 JobParameters의 모든 값을 메타데이터 저장소에 기록하며, 이를 통해 다음과 같은 중요한 기능을 제공한다.
- Job 인스턴스 식별 및 재시작 처리
- Job 실행 이력 추적
JobParameters 전달하기
1. 커맨드라인에서 잡 파라미터 전달하기
./gradlew bootRun --args='--spring.batch.job.name=dataProcessingJob inputFilePath=/data/input/users.csv,java.lang.String'
JobParameters 기본 표기법
parameterName=parameterValue,parameterType,identificationFlagparameterName:
배치 Job에서 파라미터를 찾을 때 사용할 key 값이다. 이 이름으로 Job 내에서 파라미터에 접근할 수 있다.
parameterValue:
파라미터의 실제 값
parameterType:
파라미터의 타입(java.lang.String, java.lang.Integer와 같은 fully qualified name 사용). 이 파라미터 타입을 명시하지 않을 경우 Spring Batch는 해당 파라미터를 String 타입으로 가정한다.
identificationFlag:
Spring Batch에게 해당 파라미터가 JobInstance 식별(identification)에 사용될 파라미터인지 여부를 전달하는 값으로 true이면 식별에 사용된다는 의미이다. 이 플래그는 생략 가능하며 생략할 경우 true로 설정된다.
JobParametersValidator
JobParametersValidator를 사용하면 잘못된 파라미터가 들어오는 순간 즉시 차단할 수 있다. 시스템을 무너뜨리기 전에 파라미터가 제대로 된 것인지 확인하는 과정이라고 보면 된다.
@Component
public class ParameterValidator implements JobParametersValidator {
@Override
public void validate(@Nullable JobParameters parameters) throws JobParametersInvalidException {
if (parameters == null) {
throw new JobParametersInvalidException("파라미터가 NULL입니다");
}
Long somethingValue = parameters.getLong("somethingValue");
if (somethingValue == null) {
throw new JobParametersInvalidException("somethingValue 파라미터는 필수값입니다");
}
if (somethingValue > 9) {
throw new JobParametersInvalidException(
"파라미터 허용치를 초과했습니다: " + somethingValue + " (최대 허용치: 9)");
}
}
}
JobParametersValidator 구현체(ParameterValidator)는 JobBuilder의 validator() 메서드를 통해 구성해준다. Job 구성에서 이 JobParametersValidator를 주입받아 사용하면 된다.
@Bean
public Job systemJob(
JobRepository jobRepository,
Step systemStep,
ParameterValidator validator
) {
return new JobBuilder("systemJob", jobRepository)
.validator(validator)
.start(systemStep)
.build();
}이렇게 JobBuilder에 구성한 JobParametersValidator는 Job 실행 시점에 호출되어 파라미터 검증을 진행한다.
잘못된 파라미터로 실행하면? 다음과 같은 결과를 볼 수 있다.
./gradlew bootRun --args='--spring.batch.job.name=systemDestructionJob sometinhValue=10,java.lang.Long'
...
Caused by: org.springframework.batch.core.JobParametersInvalidException: 파라미터 허용치를 초과했습니다: " + somethingValue + " (최대 허용치: 9)
...
Job과 Step의 Scope 이해하기
JobScope와 StepScope가 선언된 빈은 애플리케이션 구동 시점에는 우선 프록시 객체로만 존재한다. 그 후 Job이나 Step이 실행된 후에 프록시 객체에 접근을 시도하면 그 때 실제 빈이 생성된다.
Job과 Step 실행 시점에 생성되어 종료할 때 함께 소멸 된다.
@JobScope
@JobScope는 Job이 실행될 때 실제 빈이 생성되고, Job이 종료될 때 함께 제거되는 스코프다. 즉, JobExecution과 생명주기를 같이 한다.
지연된 빈 생성 (Lazy Bean Creation):
@JobScope가 적용된 빈은 애플리케이션 구동 시점에는 프록시 객체만 생성된다. 예제의 systemDestructionStep 빈의 실제 인스턴스는 Job이 실행될 때 생성되어 Job이 종료하면 소멸된다.Job 파라미터와의 연동:
이렇게 지연된 빈 생성이 가능하다 보니 어플리케이션 실행 중에 전달되는 JobParameters를 Job 실행 시점에 생성되는 systemDestructionStep 빈에 주입해줄 수 있다.@StepScope
@StepScope는 @JobScope와 동일한 방식으로 동작하지만 적용 범위에서 차이가 있다. @JobScope가 Job의 실행 범위에서 빈을 관리한다면, @StepScope는 Step의 실행 범위에서 빈을 관리한다.
'Spring > batch' 카테고리의 다른 글
| 4. Batch Listener (0) | 2026.03.23 |
|---|---|
| 1. 배치 정의 (0) | 2026.03.23 |