
데이터 대용량 일괄처리 위해 사용한다.
-> 초기 데이터 csv에서 불러와야해서 사용
SpringBatch 그 자체로는 일을 수행하지 못한다. Configuration Bean을 통해 해당 Job이 실행될 경우에 어떤 일을 처리할 지 세팅할 뿐 실행을 위해선 Batch Scheduler가 필요하다.
batch 수행하는데 필요한 전반적인 객체를 가진다. 일의 상태 유지/관리, batch와 관련된 crud를 처리한다.
배치 처리과정을 하나의 단위로 만들어놓은 객체이다.
배치 처리 과정에 있어서 최상단 객체이다.
job 실행시키는 역할이다.
job과 jobparameters를 param으로 받고 JobExecution을 반환한다.
우리가 직접 컨트롤할 일은 없다.
job을 구성하는 독립적인 작업 단위이다. 실제 배치가 실행되는 처리를 정의하고 제어하는데 필요한 모든 정보를 가지고 있는 object이다.
Step은 Tasklet과 Chunk 기반으로 수행되며 이는 유저가 선택할 수 있다.
Tasklet : 한가지 이상 CRUD가 발생하는 task에 대해 일괄적으로 처리하는 경우 채택한다.Chunk : Chunk 단위로 처리할 모든 데이터를 읽어들인 후 모두 읽어들이는데에 성공했으면 한번에 write 하는 방식으로, 대용량 데이터에 대해 단순 처리할 경우 채택한다.대상이되는 데이터를 읽어들인다. db에서 읽어오거나 file I/O 통해 불러오기도 한다.
read와 write 중간 단계에서 가공 역할을 한다.
batch 마지막 단계이다. 가공된 데이터 출력하는 역할을 한다.
ItemWriter를 사용해 DB에 내용을 다시 저장할 수도 있고 해당 데이터를 다른 프로젝트로 호출 시킬수도 있다.
먼저 build.gradle에 의존성을 주입해주고 관련 설정을 추가해준다.
implementation 'org.springframework.boot:spring-boot-starter-batch'
spring:
batch:
jdbc:
initialize-schema: always
job:
name: testJob # job 이름 설정
datasource:
hikari:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/${DB_NAME}?serverTimezone=Asia/Seoul
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
프로젝트 생성 시 최초 메인 Application 클래스 위에 @EnableBatchProcessing 애노테이션을 적어준다.
@SpringBootApplication
@EnableBatchProcessing
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(JobPracticeApplication.class, args);
}
}
특정 Job을 수행하기 위한 클래스 파일을 만든다.
@Slf4j
@Configuration
@RequiredArgsConstructor
public class JobConfiguration {
...
}
Job은 단일 Step으로 구성했다.
...
@Bean
public Job FirstJob(JobRepository jobRepository){
return new JobBuilder("FirstJob", jobRepository)
.start(FirstStep(jobRepository))
.build();
}
...
Job에 포함되는 Step을 생성해야 한다.
...
@Bean
public Step FirstStep(JobRepository jobRepository){
return new StepBuilder("FirstStep",jobRepository)
.<String, String>chunk(1000,transactionManager) // chunk 기반으로 동작, chunk size는 1000으로 설정
.reader(itemReader())
.writer(itemWriter())
.build();
}
...
Batch를 통해 처리하고자 하는 데이터를 읽어들이는 ItemReader 부분이다.
...
@Bean
public ItemReader<String> itemReader(){
return new ItemReader<String>() {
@Override
public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
return "Read OK";
}
};
}
...
배치를 통해 처리된 데이터에 대한 출력을 담당하는 ItemWriter 부분이다.
...
@Bean
public ItemWriter<String> itemWriter(){
return strList -> {
strList.forEach(
str -> log.info("str: {}", str) // ItemReader에서 처리한 데이터가 String List 형태로 담겨서 로그 출력
);
};
}
...
참고1 : https://velog.io/@cho876/Spring-Batch-job-%EC%83%9D%EC%84%B1
참고2 : https://spring.io/batch