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

백엔드공부화이팅님의 프로필 이미지

작성한 질문수

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

일단 실행 - Hello, World (스프링 배치 구조 익히기)

똑같이 실행하는데 출력이 안돼요

23.07.29 00:02 작성

·

754

0

@Configuration
@RequiredArgsConstructor
@Slf4j
public class HelloWorldJdbcConfig {

    private final JobBuilderFactory jobBuilderFactory;  //이걸 통해 JOb을 생성
    private final StepBuilderFactory stepBuilderFactory;  //Step 생성을 위해
    /**
     * 두 객체를 활용하여 Job과 Step을 생성할꺼야
     Job은 JobBuilderFactory로 만들고
     Step은 StepBuilderFactory로 만들자.
     */

    @Bean
    public Job helloWorldJob() {
        Job helloWorldJob = jobBuilderFactory.get("helloWorldJob")  //이름을 정해주고
                .incrementer(new RunIdIncrementer())  //Job을 실행할 때 id를 부여하는데, Sequence를 순차적으로 부여할 수 있도록 RunIdIncrementer를 해주자.
                .start(helloWorldStep())   //Job안에는 Step이 존재해야해.
                .build();
        return helloWorldJob;
    }

    @JobScope
    @Bean
    public Step helloWorldStep() {

        TaskletStep helloWorldStep = stepBuilderFactory.get("helloWorldStep")  //역시 똑같이 get을 통해 이름 명시
                .tasklet(helloWorldTasklet())     //일단 간단하게 taskLet으로 해보자.
                .build();
        return helloWorldStep;
    }

    @StepScope   //step 하위에서 실행되기 때문에 @StepScope를 등록하자.
    @Bean
    public Tasklet helloWorldTasklet() {
        //Tasklet은 그냥 만들면 돼
        Tasklet tasklet = new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                //내가 원하는 작업 부분
                System.out.println("Hello World Spring Batch");
                log.info("asdasdasd");
                log.info("batch start!!");
                //원하는 작업이 끝난 이후 어떻게 할 것인가 ?에 대한 Status를 명시해야함.
                return RepeatStatus.FINISHED; // FINISHED를 명시함으로써 이 Step을 끝낸다는 뜻.
            }
        };
        return tasklet;
    }

    /**
     * 위 과정을 모두 다 했다면
     * HelloWorld를 보기 위한 하나의 Job이 완성이 된 것이다 !
     * 스프링을 실행해서 출력이 되는지 확인하자 !!
     * Job을 실행시킬 때는 properties에서 설정한 batch.job.names를 파라미터로 넘겨주어야 Job이 실행이 된다.
     * 위에서 Job 이름은 helloWorldJob이기 때문에 파라미터로 넣어주자 !
     *Edit Configurations > Program Parameters에 --spring.batch.job.names=helloWorldJob을 넣어주자.
     * 그러고 실행하면 돼  !
     */

    /**
     * 또한 Job을 실행할 때는
     * apllication.properties에 설정한
     * spring.batch.job.names에 파라미터로 넘겨주어야 job이 실행이 된다.
     * --spring.batch.job.names={이름} 이런 식으로 넘겨줘야해
     * 내가 현재 설정한 job의 이름은 helloWorldJob이기 때문에 해당 값을 넣어서 파라미터 등록하자.
     */
}

위 코드를 작성한 후에 main에서 @EnableBatchProcessing 어노테이션을 추가해주고 실행하였습니다.

또한 application.properties에 spring.batch.job.names=${job.name:NONE}
넣어준 후 parameter 까지 제대로 넣어주었는데 실행하면 해당 출력문이 나오지 않습니다.. 뭐가 문제인지 몰라서 질문드립니다.. !

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

답변 2

0

MJ코딩님의 프로필 이미지
MJ코딩
지식공유자

2023. 07. 30. 21:44

해당 코드를 내려 받고 로컬에서 실행을 해보았습니다 :)

아래 코드[0]를 주석처리나 삭제를 하신 다음에 실행을 하시면 정상적으로 동작을 하겠습니다.

spring.batch.job.enabled=false

위의 코드는 주로 스케쥴링을 통해서 구동을 할 때 사용을 하게 되겠습니다. 현재 학습 앞부분에서의 스프링 배치를 구동할 때는 위의 코드를 세팅하지 않는데요. 위의 코드는 스케쥴링 부분 강의에서 세팅을 하겠습니다.

내용 참고 부탁드리겠습니다.

감사합니다 :)

[0]

https://github.com/HyunSoo730/spring-batch-tutorials/blob/main/src/main/resources/application.properties#L20

백엔드공부화이팅님의 프로필 이미지

2023. 07. 31. 14:53

와 정말 감사합니다.. ㅠㅠ 왜 안되나 했는데 드디어 해결했습니다. 열심히 강의 수강하겠습니다 !!

0

MJ코딩님의 프로필 이미지
MJ코딩
지식공유자

2023. 07. 29. 01:00

안녕하세요 :)
해당 코드 스니펫으로는 확인하기가 어려움이 있습니다 😢 혹시 전체 코드를 돌려 볼 수 있도록 github 링크를 받아 볼 수 있을까요?

백엔드공부화이팅님의 프로필 이미지

2023. 07. 29. 23:28

https://github.com/HyunSoo730/spring-batch-tutorials
https://github.com/HyunSoo730/spring-batch-tutorials.git

여기 깃허브 주소입니다.. !! 혹시 스프링부트 5.x 버전이라 그런건지... 잘 모르겠습니다 ㅠㅠ 바쁘신 와중에 빠르게 답변 주셔서 감사합니다 !!

백엔드공부화이팅님의 프로필 이미지

2023. 07. 30. 12:16

아 그리고 제 버전은

plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.14'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '11'
}

이렇게 실행했는데 되지 않습니다...