한 줄 요약 > 데이터의 반복 처리, 가공, 시간 기반 이벤트 처리를 위해 사용
활용 범위 확장 > logging/tracing, 트랜잭션 관리, 잡 프로세싱 통계, 잡 재시작, 스킵, 리소스 관리 등
발췌 : Spring Batch Introduction -https://docs.spring.io/spring-batch/docs/current/reference/html/spring-batch-intro.html#spring-batch-intro
What You Need About 15 minutes
💻 JDK 1.8 or later / Gradle 4+ or Maven 3.2+
IDE: Spring Tool Suite (STS) /IntelliJ IDEA
Download and unzip the source repository for this guide, or clone it using Git: git clone
"https://github.com/spring-guides/gs-batch-processing.git"
@BatchProcessingApplication.java
Apply Spring Boot's Application Exit support
package com.example.batchprocessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BatchProcessingApplication {
public static void main(String[] args) throws Exception {
System.exit(SpringApplication
.exit(SpringApplication
.run(BatchProcessingApplication.class, args)));
}
}
@BatchConfiguration.java
Switch to tabs, and adjust tabsizing in asciidoctor.
// tag::setup[]
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
// end::setup[]
// tag::readerwriterprocessor[]
@Bean
public FlatFileItemReader<Person> reader() {
return new FlatFileItemReaderBuilder<Person>()
.name("personItemReader")
.resource(new ClassPathResource("sample-data.csv"))
.delimited()
.names(new String[]{"firstName", "lastName"})
.fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}})
.build();
}
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
@Bean
public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
.dataSource(dataSource)
.build();
}
// end::readerwriterprocessor[]
// tag::jobstep[]
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(step1)
.end()
.build();
}
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) {
return stepBuilderFactory.get("step1")
.<Person, Person> chunk(10)
.reader(reader())
.processor(processor())
.writer(writer)
.build();
}
// end::jobstep[]
}
@JobCompletionNotificationListener.java
Use the Spring Initializr
@Component
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
private final JdbcTemplate jdbcTemplate;
@Autowired
public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void afterJob(JobExecution jobExecution) {
if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("!!! JOB FINISHED! Time to verify the results");
jdbcTemplate.query("SELECT first_name, last_name FROM people",
(rs, row) -> new Person(
rs.getString(1),
rs.getString(2))
).forEach(person -> log.info("Found <" + person + "> in the database."));
}
}
}
배포 관리를 통해 job실행 / jobLauncher를 실행> jobRespository > @Scheduled 어노테이션으로 예약된 Quartz cron 시간 이벤트 발생 > 해당하는 job /Configuration Step 에 따라 순차 처리
Cron Job list는 프로퍼티로 세팅, 배포 없이 사용유무 관리를 위해서 DB 유효성 체크 서비스를 추가하는 것이 보편적인 비지니스 모델인 것 같다
1차 요청 : 스프링 배치 프로젝트 init 구성 > 푸쉬 메시지 관리 sample job
220208~220209
ㄴ 스프링 배치 프로젝트 init 구성
ㄴ Cron job 실행 완료 (DB 연결/확장 제외)
220211
ㄴ AWS ec2 설치된 DB로 ssh 세션 터널링 연결
ㄴ MyslqDbConfig 설정 추가
왜 스프링 배치를 사용하는지 / 어떠한 문제를 해결할 수 있는지
멱등성은 어떻게 유지하는가? 데이터 전후 처리를 어떻게 판단하고 관리하였는가
중간 과정에서 에러, 실패 처리는 어떻게 하였는가
multi Thread <> partioning 처리 / 운영 방식
트랜지션 Chunk 단위로 관리하는 이유?
tasket model vs model /processor / writer ?
curson <> page 기반 클래스
배치 실행 / 구동은 어떻게 하였는지
배치 잡 모니터링 관리는 어떻게 하였는지 / 지연관리
https://okdevtv.com/mib/spring/batch
https://spring.io/guides/gs/batch-processing/
https://docs.spring.io/spring-batch/docs/current/reference/html/spring-batch-intro.html#spring-batch-intro