Spring Batch Posted on 2021-04-09 | In Spring | 1schema-mysql.sql 통해서 테이블 생성한뒤 123456<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-batch --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> <version>2.3.5.RELEASE</version> </dependency> 라이브러리 추가한다 메인 어플리케이션에 어노테이션 추가해준 후 12345678910@EnableScheduling @EnableBatchProcessing @SpringBootApplication public class SchedulerApplication { public static void main(String[] args) { SpringApplication.run(SchedulerApplication.class, args); } } 작동 로직 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556@Slf4j @Configuration public class SampleJobConfig { private final SampleRepository sampleRepository; private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; public SampleJobConfig(SampleRepository sampleRepository, JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) { this.SampleRepository = sampleRepository; this.jobBuilderFactory = jobBuilderFactory; this.stepBuilderFactory = stepBuilderFactory; } @Value("${chunkSize:1000}") private int getChunkSize; @Bean public Job sampleJob() { return jobBuilderFactory.get("SampleJob") .start(sendStep()) .build(); } @Bean @JobScope public Step sampleStep() { return stepBuilderFactory.get("SampleStep") .<SampleDto, SampleDto>chunk(getChunkSize) .reader(sampleReader()) .writer(sampleWriter()) .build(); } @Bean @StepScope public ListItemReader<SampleDto> sampleReader() { final List<SampleDto> sampleList = this.sampleRepository.findAll(); return new ListItemReader<>(sampleList); } @Bean @StepScope public ItemWriter<SampleDto> sampleWriter() { return this::write; } private void write(List<? extends SampleDto> list) { for (SampleDto sampleDto : list) { sampleDto.change(); this.storeSmsRepository.save(sampleDto); } } } 스케쥴러 로직 12345678910111213141516171819202122232425262728293031@Slf4j @Component public class JobScheduler { private final JobLauncher jobLauncher; private final SampleJobConfig sampleJobConfig; public JobScheduler(JobLauncher jobLauncher, SampleJobConfig sampleJobConfig) { this.jobLauncher = jobLauncher; this.sampleJobConfig = sampleJobConfig; } @Scheduled(cron = "0 0 7 * * *", zone = "Asia/Seoul") public void runSampleJob() { schedulerRun(sampleJobConfig.sampleJob()); } private void schedulerRun(Job job) { Map<String, JobParameter> stringJobParameterMap = new HashMap<>(); stringJobParameterMap.put("time", new JobParameter(System.currentTimeMillis())); JobParameters jobParameters = new JobParameters(stringJobParameterMap); try { jobLauncher.run(job, jobParameters); } catch (JobExecutionAlreadyRunningException | JobInstanceAlreadyCompleteException | JobParametersInvalidException | org.springframework.batch.core.repository.JobRestartException e) { log.error(e.getMessage()); } } }