작업제목 : 스프링(부트 포함) 배치 프로그램(SELECT 후 INSERT DB) 작업순서 : 1. 스프링 부트 pom.xml 설정 2. BatchVO.class, BatchConfiguration.class, BatchJob.class, BatchApplication.class 생성 3. BatchConfiguration.class 작성 4. BatchVO.class 작성 5. BatchJob.class 작성 6. BatchApplication.class 작성 7. 기타 설정 확인 8. 정상 작동되는지 테스트 및 확인 9. jar 파일로 생성 10. bat 파일 생성 후 bat 파일로 실행 11. 윈도우 스케줄러에 등록하여 특정 시간에 bat 파일이 작동되도록 구성
작업제목 : 스프링(부트 포함) 배치 프로그램(SELECT 후 INSERT DB) 작업순서 : 1. 스프링 부트 pom.xml 설정 2. BatchVO.class, BatchConfiguration.class, BatchJob.class, BatchApplication.class 생성 3. BatchConfiguration.class 작성 4. BatchVO.class 작성 5. BatchJob.class 작성 6. BatchApplication.class 작성 7. 기타 설정 확인 8. 정상 작동되는지 테스트 및 확인 9. jar 파일로 생성 10. bat 파일 생성 후 bat 파일로 실행 11. 윈도우 스케줄러에 등록하여 특정 시간에 bat 파일이 작동되도록 구성
프로젝트가 정상 작동되는지 확인해보도록하자. 해당 배치 프로그램의 순서는 다음과 같다.
1. TOTAL_COUNT 테이블에서 COUNT 칼럼의 값을 reading한다. 2. INSERT_COUNT 테블에 reading한 값을 wrting한다.
작업제목 : 스프링(부트 포함) 배치 프로그램(SELECT 후 INSERT DB) 작업순서 : 1. 스프링 부트 pom.xml 설정 2. BatchVO.class, BatchConfiguration.class, BatchJob.class, BatchApplication.class 생성 3. BatchConfiguration.class 작성 4. BatchVO.class 작성 5. BatchJob.class 작성 6. BatchApplication.class 작성 7. 기타 설정 확인 8. 정상 작동되는지 테스트 및 확인 9. jar 파일로 생성 10. bat 파일 생성 후 bat 파일로 실행 11. 윈도우 스케줄러에 등록하여 특정 시간에 bat 파일이 작동되도록 구성
작업제목 : 스프링(부트 포함) 배치 프로그램(SELECT 후 INSERT DB) 작업순서 : 1. 스프링 부트 pom.xml 설정 2. BatchVO.class, BatchConfiguration.class, BatchJob.class, BatchApplication.class 생성 3. BatchConfiguration.class 작성 4. BatchVO.class 작성 5. BatchJob.class 작성 6. BatchApplication.class 작성 7. 정상 작동되는지 테스트 및 확인 8. jar 파일로 생성 9. bat 파일 생성 후 bat 파일로 실행 10. 윈도우 스케줄러에 등록하여 특정 시간에 bat 파일이 작동되도록 구성
프로젝트를 실행하기 위해서는 메인 클래스를 작성해야 한다.
package com.bootbatch.main;
import java.util.Date;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;
import com.bootbatch.job.BatchConfiguration;
import com.bootbatch.job.UserJob;
@SpringBootApplication
//@Component 어노테이션은 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.
@Component
public class SpringBootBatch05Application {
public static void main(String[] args) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException, InterruptedException {
SpringApplication.run(SpringBootBatch05Application.class, args);
//ApplicationContext는 오브젝트 생성, 관계설정, 만들어지는 방식, 자동생성, 후처리 등 여러가지 일을한다.
ApplicationContext context = new AnnotationConfigApplicationContext(BatchConfiguration.class);
//JobLauncher 인터페이스를 보면 Job과 Job Parameter를 이용하여 요청된 Job을 수행한 후 JobExecution을 반환되는 run메소드가 정의되어 있다.
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
//Job Bean을 얻어와 관계를 설정한다.
Job job = context.getBean(Job.class);
JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
jobParametersBuilder.addDate("date", new Date());
JobParameters jobParameters = jobParametersBuilder.toJobParameters();
//JobExecution은 작업 실행을 위한 단일 시도에 대한 기술적인 컨셉이다.
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
BatchStatus batchStatus = jobExecution.getStatus();
while (batchStatus.isRunning()) {
System.out.println("Still running...");
Thread.sleep(1000);
}
System.out.println("Exit status: " + jobExecution.getExitStatus().getExitCode());
JobInstance jobInstance = jobExecution.getJobInstance();
System.out.println("job instance Id: " + jobInstance.getId());
}
}
작업제목 : 스프링(부트 포함) 배치 프로그램(SELECT 후 INSERT DB) 작업순서 : 1. 스프링 부트 pom.xml 설정 2. BatchVO.class, BatchConfiguration.class, BatchJob.class, BatchApplication.class 생성 3. BatchConfiguration.class 작성 4. BatchVO.class 작성 5. BatchJob.class 작성 6. BatchApplication.class 작성 7. 정상 작동되는지 테스트 및 확인 8. jar 파일로 생성 9. bat 파일 생성 후 bat 파일로 실행 10. 윈도우 스케줄러에 등록하여 특정 시간에 bat 파일이 작동되도록 구성
원하는 기능을 수행하는 Job 파일을 만들어야 한다.
package com.bootbatch.job;
import javax.sql.DataSource;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.database.JdbcCursorItemReader;
import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.transaction.PlatformTransactionManager;
import com.bootbatch.main.UserVO;
import lombok.RequiredArgsConstructor;
//@Bean 어노테이션들을 Bean 처리 하기 위해 사용
@Configuration
//final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어 준다.
@RequiredArgsConstructor
public class UserJob {
// DI 처리
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactoy;
// DI 처리
@Autowired
private DataSource dataSource;
// DI 처리
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
@Bean
//step을 실행하는 Job 영역
public Job jdbcCursorItemReaderJob() {
return jobBuilderFactory.get("jdbcCursorItemReaderJob")
.start(jdbcCursorItemReaderStep())
.build();
}
@Bean
//reader, writer를 실행하는 step 영역
public Step jdbcCursorItemReaderStep() {
return stepBuilderFactoy.get("jdbcCursorItemReaderStep")
.<UserVO, UserVO>chunk(10)
//reader에서 받아서
.reader(jdbcCursorItemReader())
//writer에 넣는다.
.writer(jdbcCursorItemWriter())
.build();
}
@Bean
public JdbcCursorItemReader<UserVO> jdbcCursorItemReader(){
System.out.println("===>jdbcCursorItemReader 접속!!");
//다음과 같이 ReaderBuilder로 객체를 반환한다.
return new JdbcCursorItemReaderBuilder<UserVO>()
.fetchSize(10)
.dataSource(dataSource)
.rowMapper(new BeanPropertyRowMapper<>(UserVO.class))
.sql("SELECT COUNT FROM TOTAL_COUNT")
.name("jdbcCursorItemWriter")
.build();
}
@Bean
JdbcBatchItemWriter<UserVO> jdbcCursorItemWriter(){
JdbcBatchItemWriter<UserVO> itemWriter = new JdbcBatchItemWriter<UserVO>();
itemWriter.setDataSource(dataSource);
itemWriter.setSql("insert into insert_count values(:count)");
itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<UserVO>());
//다음과 같이 itemWriter를 반환한다.
return itemWriter;
}
}