인프런 커뮤니티 질문&답변
배치 실행시 파라미터 (파일 이름)받기 및 (csv) 검증 5.0버전 공유
작성
·
18
·
수정됨
0
6분대 까지의 기록 입니다.
5.0 버전에 맞게 ValidatedPramJobConig 구현 내용입니다 참고하세용
package com.example.SpringBatchTutorial.job.ValidatedParam;
import lombok.RequiredArgsConstructor;
import org.jspecify.annotations.Nullable;
import org.springframework.batch.core.configuration.annotation.JobScope;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.job.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.job.parameters.CompositeJobParametersValidator;
import org.springframework.batch.core.job.parameters.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.Step;
import org.springframework.batch.core.step.StepContribution;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.infrastructure.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import java.util.Arrays;
/**
* desc: 파일 이름 파라미터 전달 그리고 검증
* run: --spring.batch.job.name=validateParamJob -fileName=test.csv
*/
@Configuration
@RequiredArgsConstructor
public class ValidatedParamJobConfig {
/*
* [Spring Batch 5.0 변경점]
* JobBuilderFactory, StepBuilderFactory가 Deprecated(삭제)되었습니다.
* 대신 JobRepository와 PlatformTransactionManager를 직접 주입받아 사용합니다.
*/
private final JobRepository jobRepository;
private final PlatformTransactionManager platformTransactionManager;
@Bean
public Job validateParamJob() {
/*
* [변경] new JobBuilder("Job이름", jobRepository) 형태로 생성합니다.
*/
return new JobBuilder("validateParamJob", jobRepository)
.incrementer(new RunIdIncrementer()) // 실행할 때마다 JobParameter에 run.id를 증가시켜 재실행 가능하게 함
.validator(new FileParamValidator()) // 검증 로직이 필요하면 여기에 validator를 추가합니다.
.start(validateParamJobStep()) // 첫 번째 Step 시작
.build();
}
private CompositeJobParametersValidator multipleValidator(){
CompositeJobParametersValidator validator = new CompositeJobParametersValidator();
validator.setValidators(Arrays.asList(new FileParamValidator())); // 여러개의 검증 클래스를 변수로 할당가능
return validator;
}
@Bean
@JobScope // Job 실행 시점에 Bean이 생성되도록 설정
public Step validateParamJobStep() {
/*
* [변경] new StepBuilder("Step이름", jobRepository) 형태로 생성합니다.
*/
return new StepBuilder("validateParamStep", jobRepository)
/*
* [변경] tasklet이나 chunk를 설정할 때 TransactionManager를 반드시 인자로 넘겨야 합니다.
*/
.tasklet(validateParamTasklet(), platformTransactionManager)
.build();
}
@Bean
@StepScope // Step 실행 시점에 Bean이 생성되도록 설정
public Tasklet validateParamTasklet() {
return (contribution, chunkContext) -> {
// 비즈니스 로직 영역
System.out.println("validateParamTasklet 호출됐나요~");
// Tasklet 종료 상태 반환
return RepeatStatus.FINISHED;
};
}
}
/*
[Spring Boot 2.x ~ Batch 4.x 버전 기록용]
당시 특징: JobBuilderFactory와 StepBuilderFactory를 사용하여 간편하게 생성.
현재(5.0+)는 삭제된 방식임.
@Configuration
@RequiredArgsConstructor
public class ValidatedParamJobConfig {
[과거 방식의 핵심]
이 당시에는 @EnableBatchProcessing이 선언되어 있으면
스프링이 자동으로 JobBuilderFactory, StepBuilderFactory를 빈으로 등록해줬음.
-> 개발자가 JobRepository나 TransactionManager를 신경 쓸 필요 없이 Factory만 주입받으면 됐음.
[코드가 왜 방식을 바꾼이유에 대한 고찰]
과거에는 Factory 방식이 유행했다면 요즘은 Builder 방식으로 전환하려는것 같음.
추가로 PlatformTransactionManager 을 과거에는 써서 DB에 접근을 하였는데 이 방식이 DB를 하나를 바라보게끔 되어있었다고함
그래서 Step 마다 트랜잭션을 사용하려면 설정이 까다로웠다고(Bean을 재정의 하거나 Factory를 커스텀)
현재는 Step을 만들때 트랜잭션을 인자로 직접 넘겨주기에 Step A는 metaTransactionManager Step B 는 serviceTransactionManager
로 설정하는것으로 쉬워졌다고함
https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide
공식 깃헛 사이트에서 Transaction manager bean exposure/configuration 을 컨트롤 F 해서 보면 상세히 나와있음
아래 슬로건을 미는 느낌인거같음
개발자가 코드를 짤 때 귀찮더라도, '누가(Repository)', '어떻게(TransactionManager)' 일하는지 명시적으로 적어라. 그래야 나중에 사고가 덜 난다
5.0있는데 왜 2.x ~ 4.x 를 기록함 이라할수있는데 프로젝트를 뛰다보면 3.0버전대가 너무 많음 5.0으로 신규로 구현할 수도 있으니
과거와 현재 방식을 기록하는거에 초점 두는게 좋다생각함
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job validateParamJob() {
[Job 생성]
factory.get("이름")을 호출하면 내부적으로 JobRepository가 자동 주입된 빌더가 반환됨.
-> 5.0부터는 new JobBuilder("이름", jobRepository)로 직접 주입해야 함.
return jobBuilderFactory.get("validateParamJob")
.incrementer(new RunIdIncrementer())
//.validator(new FileParamValidator()) // 여기서 정의해줘도 되지만 재활용성을 위해 별도의 클래스로 제작 job.ValidatedParam.FileParamValidator
.validator(multipleValidator)
.start(validateParamJobStep())
.build();
}
private CompositeJobParametersValidator multipleValidator(){
CompositeJobParametersValidator validator = new CompositeJobParametersValidator();
validator.setValidators(Arrays.asList(new FileParamValidator()));
return validator;
}
@JobScope
@Bean
public Step validateParamJobStep() {
[Step 생성]
factory.get("이름") 사용.
특징: .tasklet() 설정 시 TransactionManager를 넣지 않아도
Factory가 내부적으로 가지고 있는 기본 TransactionManager를 사용함.
-> 이 '암시적(Implicit) 구성'이 편하긴 했으나, 명확성이 떨어져 5.0에서 제거됨.
return stepBuilderFactory.get("validateParamStep")
.tasklet(validateParamTasklet()) 트랜잭션 매니저 생략 가능했음
.build();
}
@StepScope
@Bean
public Tasklet validateParamTasklet(@Value("#{jobParameters['fileName']} String fileName) {
//System.out.println(fileName);
// 여기서 파일명을 받아 작업할 수 있지만
// Tasklet 까지 오기 전 Job이 실행할 때 검증할 수 있도록 Validator 를 제공을 함 위쪽의 validateParamJob 메서드로 이동
[Tasklet 구현]
익명 클래스 방식으로 구현.
단순 출력 후 FINISHED를 반환하여 스텝을 종료함.
return (contribution, chunkContext) -> {
System.out.println("validateParamTasklet");
return RepeatStatus.FINISHED;
};
}
}
*/
job.ValidatedParam.Validtor 시작
package com.example.SpringBatchTutorial.job.ValidatedParam.Validator;
import org.springframework.batch.core.job.parameters.InvalidJobParametersException;
import org.springframework.batch.core.job.parameters.JobParameters;
import org.springframework.batch.core.job.parameters.JobParametersValidator;
import org.springframework.util.StringUtils;
public class FileParamValidator implements JobParametersValidator {
// thorws 저거밖에 못찾겠어서 저걸로 했는데 문제없이 됐습니다.
@Override
public void validate(JobParameters parameters) throws InvalidJobParametersException {
String fileName = parameters.getString("fileName");
if (!StringUtils.endsWithIgnoreCase(fileName,"csv")){
throw new InvalidJobParametersException("This is CSV");
}
}
}job.ValidatedParam.Validtor 끝
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
질문해 주신 내용을 보니 Spring Batch 5.0 버전에서의 Job과 Step 구현 방식에 대한 문제가 있었던 것 같습니다. 해당 코드는 Spring Batch 5.0에서 JobBuilder와 StepBuilder를 사용하여 Job 및 Step을 정의하는 방법을 설명합니다. 새로운 버전에서는 JobBuilderFactory, StepBuilderFactory가 제거되고, 대신 JobRepository와 PlatformTransactionManager를 사용하는 방식으로 변경되었습니다. 이로 인해 생성 시 직접적으로 주입 받아야 하는 변경점이 있습니다.
관련된 질문과 답변이 포함된 몇 가지 자료들을 추천드립니다:
오류 확인 부탁드려요 ㅠㅠ.. 오류 확인 관련 질문: Spring Batch에서 여러 Step으로 인해 발생하는 빈 오류에 대한 예시입니다.
잡 이름이 겹치지 않는데 왜 이럴까요…? 잡 이름 관련 질문: 빈 주입과 관련된 문제를 다룬 질문입니다.
이 질문들이 도움이 되길 바랍니다. Spring Batch 업데이트 시 많은 부분이 변할 수 있으므로, 현재 프로젝트에서 사용하는 Spring Batch 버전에 맞는 문서를 참고하는 것이 중요합니다. 특히, 공식 migration guide를 확인하시는 것을 추천드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





