IT/Live Coding

[springBoot] spring batch scheduler jpaRead/Writer (ํ…Œ์ŠคํŠธ ์˜์ƒ & ์†Œ์Šค์ฝ”๋“œ ํฌํ•จ)

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2023. 11. 12.

์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ ์ด์–ด์ง„ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

[springBoot] spring scheduler simpleBatch (feat. scheduler)

๋ชฉ์ฐจ Batch1 ๐Ÿ™‚ package com.dev.lsy.springbatchlog.batch; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.co

yaga.tistory.com


์ผ์ •์‹œ๊ฐ„์— A ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๊ฐ€๊ณต ํ›„ B ํ…Œ์ด๋ธ”์— insertํ•˜๋Š” ๋ฐฐ์น˜ ์˜ˆ์ œ

JpaBatch1 ๐Ÿ˜„

package com.test.lsy.springbatchtest2.batch;

import com.test.lsy.springbatchtest2.domain.Dept;
import com.test.lsy.springbatchtest2.domain.Dept2;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.ItemProcessor;
import org.springframework.batch.item.database.JpaItemWriter;
import org.springframework.batch.item.database.JpaPagingItemReader;
import org.springframework.batch.item.database.builder.JpaPagingItemReaderBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManagerFactory;

@Slf4j
@RequiredArgsConstructor
@Configuration
public class JpaBatch1 {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;
    private final EntityManagerFactory entityManagerFactory;

    private int chunkSize = 100;

    //step์„ ํ˜ธ์ถœํ•˜๋Š” job ์ƒ์„ฑ
    @Bean
    public Job jpaJob() {
        return jobBuilderFactory.get("jpaPageJob2")
                .start(jpaStep())
                .build();
    }

    //๋ฐฐ์น˜์˜ ๋‹จ์œ„๊ฐ€ ๋˜๋Š” step ์ž‘์„ฑ
    @Bean
    public Step jpaStep() {
        return stepBuilderFactory.get("jpaStep")
                .<Dept, Dept2>chunk(chunkSize)
                .reader(jpaReader())
                .processor(jpaPageJob2_processor())
                .writer(jpaWriter())
                .build();
    }

    //reader
    @Bean
    public JpaPagingItemReader<Dept> jpaReader() {
        return new JpaPagingItemReaderBuilder<Dept>()
                .name("jpaReader")
                .entityManagerFactory(entityManagerFactory)
                .pageSize(chunkSize)
                .queryString("SELECT d FROM Dept d order by dept_no asc")
                .build();
    }

    //๊ฐ€๊ณต
    private ItemProcessor<Dept, Dept2> jpaPageJob2_processor() {
        return dept -> {
            // ๊ฐ€๊ณตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธ(์ ‘๋‘์–ด๋กœ "NEW_"๋ฅผ ๋ถ™์ž„)
            return new Dept2(dept.getDeptNo(), "NEW_" + dept.getDName(), "NEW_" + dept.getLoc());
        };
    }

    //writer
    //dept2 ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋Š” ์—ญํ• 
    @Bean
    public JpaItemWriter<Dept2> jpaWriter() {
        JpaItemWriter<Dept2> jpaItemWriter = new JpaItemWriter<>();
        jpaItemWriter.setEntityManagerFactory(entityManagerFactory);
        return jpaItemWriter;
    }
}

Dept ๐Ÿ™‚

package com.test.lsy.springbatchtest2.domain;

import lombok.*;

import javax.persistence.Entity;
import javax.persistence.Id;

//์ด๊ฑด ์—”ํ‹ฐํ‹ฐ
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Dept {

    @Id
    Integer deptNo;
    String dName;
    String loc;
}

DeptRepository ๐Ÿค—

package com.test.lsy.springbatchtest2.repository;

import com.test.lsy.springbatchtest2.domain.Dept;
import org.springframework.data.repository.CrudRepository;

public interface DeptRepository extends CrudRepository<Dept, Long> {
}

Scheduler ๐Ÿ˜

package com.test.lsy.springbatchtest2.scheduler;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
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.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@RequiredArgsConstructor
@EnableScheduling
@Slf4j
public class Scheduler {

    private final JobLauncher jobLauncher;
    private final Job jpaJob;
	//์Šค์ผ€์ค„์€ ์›ํ•˜๋Š”๋ฐ๋กœ ์ˆ˜์ •
    @Scheduled(cron = "0 10 19 * * *")
    public void schedule() throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
        jobLauncher.run(jpaJob, new JobParametersBuilder()
                .addString("date", LocalDateTime.now().toString())
                .toJobParameters()
        );
    }
}

๊ฐœ์ธ ์Šคํ„ฐ๋”” ๊ธฐ๋ก์„ ๋ฉ”๋ชจํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ ํ‹€๋ฆฐ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‹€๋ฆฐ ์  ์žˆ์„ ๊ฒฝ์šฐ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


๋‹ค์Œ ๋‚ด์šฉ

 

[springBoot] spring batch scheduler modularization (feat. DB)

๋ชฉ์ฐจ ์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ ์ด์–ด์ง„ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. [springBoot] spring batch scheduler jpaRead/Writer (feat. DB) ๋ชฉ์ฐจ ์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ ์ด์–ด์ง„ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. [springBoot] spring scheduler simpleBatch (feat. scheduler) ๋ชฉ์ฐจ Batch1 ๐Ÿ™‚ p

yaga.tistory.com

๋Œ“๊ธ€