작업제목 : 스프링(부트 포함) 배치 프로그램(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 파일이 작동되도록 구성

jar 파일로 배포는 필자의 이전 포스팅으로 대체하고자한다.

이전 포스팅을 참고하여 진행하도록하자.

 

[스프링 부트 개념] 스프링 부트 jar로 배포하기(maven, spring boot)

 

[스프링 부트 개념] 스프링 부트 jar로 배포하기(maven, spring boot)

개념주제 : 스프링 부트 jar로 배포하기(maven, spring boot) 처리과정 : 1. 프로젝트를 Run as > Maven Build로 한다. 2. goals에 package라고 제목을 입력한다. 3. 저장된 jar 파일을 cmd에서 빌드하여 정상 빌..

namubada.net

jar 파일이 생성되면 다음과 같은 파일을 확인할 수 있다.

작업제목 : 스프링(부트 포함) 배치 프로그램(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한다.

그럼 확인해보도록하자.

현재 INSERT_COUNT의 레코드 갯수는 7개로 확인된다.

배치 프로그램을 실행하여 추가되는지 확인해보도록하자.

다음과 같이 정상적으로 추가된 것을 확인할 수 있다.

작업제목 : 스프링(부트 포함) 배치 프로그램(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 파일이 작동되도록 구성
배치 프로그램이 정상 실행되기 위한 기타 설정 파일들을 살펴보도록하자.

기본적으로 세팅되어야 할 application.properties
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@//localhost:1522/xe
spring.datasource.username=system
spring.datasource.password=1234
DB에서 값을 reading, writing 해야 할 database.properties
jdbc.driverClassName=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@//localhost:1522/xe
jdbc.username=system
jdbc.password=1234
프로젝트 시작전 DB 설정을 위한 sql 파일
drop table total_count;
create table total_count(
create_date date,
count int);
insert into total_count(create_date, count) values(sysdate,(select count(num) from user_registration));
작업제목 : 스프링(부트 포함) 배치 프로그램(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;
    }
    

 
}

 

+ Recent posts