3. 일단 실행하기 - Hello, World
3.0.0 부터는 java 11을 사용하지 않으면 build시 에러가 나서
2.7.6 버전으로 했
Dependencies로
- Spring Batch
- JDBC API
- MySQL Driver
- JPA
- Spring Configuration Processor
- Lombok
- 를 사용한다.
resourse 파일 yaml로 확장자 변경
spring:
batch:
job:
names: ${job.name:NONE}
jdbc:
initialize-schema: ALWAYS
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring_batch
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: password1234
jpa:
show-sql: true
names를 저렇게 설정한 이유는 job실행시 job이름을 파라미터로 넘기기 위해서.
Batch를 사용하기 위해 main에 EnableBatchProcessing 어노테이션을 추가해준다.
EnableBatchProcessing은 배치 인프라스트럭처를 사용할 수 있게 해준다.
아래의 컴포넌트를 직접 포함시키지 않아도 된다.
- JobRepository : 실행중인 잡의 상태를 기록하는데 사용
- JobLauncher : 잡을 구동하는데 사용
- JobExplorer : JobRepository를 사용해 읽기 전용 작업을 수행하는데 사용
- JobRegistry : 특정한 런처 구현체를 사용할때 잡을 찾는 용도로 사용
- PlaformTransactionManager : 잡 진행 과정에서 트랜잭션을 다루는데 사용
- JobBuilderFactory : 잡을 생성하는 빌더
- StepBuilderFactory : 스텝을 생성하는 빌더
출차 : https://devfunny.tistory.com/470
package com.example.SpringBatchTutorial.job;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
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.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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@RequiredArgsConstructor
public class HelloWorldJobConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job helloWorldJob() { //job 생성
return jobBuilderFactory.get("helloWorldJob")//이름을 정해주는 코드
.incrementer(new RunIdIncrementer())//아이디 부여시 시퀀스를 순차적으로 부여할 수 있도록 명시
.start(helloWorldStep())
.build();
}
@JobScope
@Bean
public Step helloWorldStep() {
return stepBuilderFactory.get("helloWorldStep")
.tasklet(helloWorldTasklet()) // step안에는 itemreader, processer, writer가 있는데, 읽고 쓰기를 하지 않는 단순한 배치를 만들 때 사용
.build();
}
@StepScope
@Bean
public Tasklet helloWorldTasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Hello World Spring Batch");
return RepeatStatus.FINISHED;// 끝났음을 명시하는 status
}
};
}
}
순차적으로 Job, step, step내부를 구현했다.
@Configuration은 스프링 설정 클래스를 명시하는데 사용하는 어노테이션.
@RequiredArgsConstructor는 생성자 주입을 자동으로 설정해주는 어노테이션.
Job과 step을 사용하기 위해서 BuilderFactory를 주입을 받았다.
그 후 Job과 Step 생성.
Tasklet 사용으로 읽고 쓰기 없는 단순한 배치 프로그램을 만들었다.
발생했던 오류
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
-> mysql 미설치로 발생했어서 설치진행.
+ workbench에서 spring_batch 이름으로 스키마를 생성했다.
현재 application.yml에서
spring:
batch:
job:
names: ${job.name:NONE}
jdbc:
initialize-schema: ALWAYS
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring_batch
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: password1234
jpa:
show-sql: true
names를 넘겨받기로 했기 때문에
이렇게 configuration으로 설정해야
아래와 같이 배치가 작동하는 것을 확인할 수 있다.
yaml 파일에 그대로 job이름을 사용해도 동일하게 동작한다.