인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

skyjoon2님의 프로필 이미지

작성한 질문수

[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch

배치 실행 시 파라미터 (파일 이름) 받기 및 (csv)검증

질문입니다.

작성

·

29

0

Program Arguments가 없어서 VM options에

-Dspring.batch.job.names=helloWorldJob

이와같이 설정하여 실행하였고 test파일의 경우 -Dspring.batch.job.names=helloWorldJob -DfileName=test.csv

 

이렇게 설정하였는데

fileName의 경우 null이 나오는데

 

현재 저의 코드는 package com.example.SpringBatchTutorial.job.ValidatedParam; import lombok.RequiredArgsConstructor; import org.junit.Test; import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.JobScope; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /* desc : 파일 이름 파라미터 전달 그리고 검증 run : --spring.batch.job.names=helloWorldJob - fileName=test.csv * */ @Configuration @RequiredArgsConstructor public class ValidatorParamJobConfig { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Autowired private JobLauncher jobLauncher; @Autowired private Job validatedParamJob; @Test public void testJob() throws Exception { // JobParameters에 fileName을 명시적으로 추가 JobParameters jobParameters = new JobParametersBuilder() .addString("fileName", "test.csv") // fileName 전달 .toJobParameters(); // Job 실행 jobLauncher.run(validatedParamJob, jobParameters); } @Bean public Job ValidatedParamJob(Step ValidatedParamStep){ return jobBuilderFactory.get("ValidatedParamJob") .incrementer(new RunIdIncrementer()) .start(ValidatedParamStep) .build(); } @JobScope @Bean public Step ValidatedParamStep(Tasklet ValidatedParamTasklet){ return stepBuilderFactory.get("ValidatedParamStep") .tasklet(ValidatedParamTasklet) .build(); } @Bean @StepScope public Tasklet ValidatedParamTasklet(@Value("#{jobParameters['fileName']}") String fileName){ return new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println(fileName); System.out.println("Validated Param Tasklet"); return RepeatStatus.FINISHED; } }; } }이렇게 되어있습니다.

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. skyjoon2님. 질문해주신 내용을 살펴보니 파라미터 전달 방식에서 발생하는 문제 같습니다. @Value("#{jobParameters['fileName']}")를 통해 파라미터를 전달하고 있지만, 전달되지 않은 이유는 여러 가지가 있을 수 있습니다. 이와 관련하여 몇 가지 자료를 참고하시면 문제 해결에 도움이 될 것입니다.

  1. 프로그램 인자와 VM 인자 차이: -Dspring.batch.job.names=helloWorldJob은 VM 옵션으로 설정되어 있어 job 이름은 잘 전달되지만, 일반적으로 --spring.batch.job.names=helloWorldJob 와 같이 프로그램 인자로 전달해야 하는 경우도 있습니다. 이 부분을 먼저 확인해주세요.

  2. 파일 이름 파라미터 설정: -DfileName=test.csv와 같이 VM 옵션에 설정했지만, 배치 잡에서는 VM 옵션 대신 스트링 인자 형식으로 받는 것이 일반적입니다. Program Arguments 부분에 --spring.batch.job.names=helloWorldJob --fileName=test.csv 형식으로 전달을 시도해 보세요.

  3. 관련 질문 링크:

  4. 추가적 코드 확인 및 설정 확인: @Test 메소드에서의 수행이므로, 일반적으로 IDE에서 테스트 수행 시에는 환경 인자를 정확히 설정했는지 확인하는 것이 중요합니다. 보통 테스트를 수행할 때 jobParameters를 명시적으로 전달하는 것이 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

skyjoon2님의 프로필 이미지

작성한 질문수

질문하기