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