728x90
problem
저번 글에 addBatch에 대한 글을 적었는데 기초에 대한 정리 글이 없어서 적어본다.
https://soobysu.tistory.com/131
solution
스프링 배치 구성
- 잡 런처 -> 잡 실행 시키는 주체
- 잡 -> 작업의 단위 ( 한개이상의 스텝으로 구성 되어있다 )
- 스텝 -> 행위 ( 데이터 읽기 read , 데이터 작업 process, 데이터 쓰기 writer , Skip, Retry 등등.. )
이외에도 스프링 배치 구성요소를 생성을 도와주는( 프록시 객체 생성 ) JobBuilder / StepBuilder 가 있다.
JobBuilderFactory, StepBuilderFactory deprecated 되었다.
@Configuration //빈설정
@RequiredArgsConstructor
public class jobConfig {
private final JobBuilder jobBuilder;
private final StepBuilder stepBuilder;
@Bean
public Job helloJob() {
return this.jobBuilder.get("testJob") //=> Job 생성
.start(helloStep(status))
.build();
}
@Bean
public Step helloStep() String status) {
return stepBuilder.get("testStep") //=> Step 생성 (일의 항목, 단계)
.tasklet((contribution, chunkContext) -> { //=> Step 안에서 단일 Task로 수행되는 로직 구현 (작업 내용)
System.out.println(" ============================");
System.out.println(" >> Step2 has execu");
System.out.println(" ============================");
return RepeatStatus.FINISHED;
})
.build();
}
}
JobBuilder로 잡을 생성하고
StepBuilder로 Step을 생성해준다.
tasklet -> 단일 작업을 수행하는 주체 이다.
tasklet 이란
itemRead , itemProcess , itemWriter 같은 item 단위가 아닌 - > 세부 단위가 아님
파일 이동 , 삭제 , 특정데이터베이스 쿼리 실행 , 특정 메서드 실행 - > 하나의 작업 단위
중요한 개념
스프링 배치는 한번 돌면 똑같은 배치는 다시 실행되지 않는다.
위 코드를 다시 실행하면 failed to execute ApplicationRunnuner 라는 에러를 만날것이다.
실패의 이유는 배치는 한번 성공한 것은 안정성을 위해 다시 실행되지 못하게 한다.
그렇다면 어떻게 계속 다른 배치를 만들어줄것이냐 ?
파라매터를 바꾸어서 돌려주면 배치는 정상적으로 실행 된다.
보통 버전 정보 , 현재 날짜정보 등을 넣어주어 배치 실행을 시켜준다.
@Bean
@JobScope
public Job jobBatchBuilder(@Value("#{jobParameters['date']}") String date) {
return jobBuilderFactory.get("updateCustomerStatusStep")
.start(updateCustomerStatusStep(date))
.build();
}
@Bean
@JobScope
public Job updateCustomerStatusJob(@Value("#{jobParameters['date']}") String date) {
return jobBuilderFactory.get("updateCustomerStatusJob")
.start(updateCustomerStatusStep(date))
.build();
}
@Bean
@JobScope
public Step updateCustomerStatusStep(@Value("#{jobParameters['date']}") String date) {
return stepBuilderFactory.get("updateCustomerStatusStep")
.<Customer, Customer>chunk(chunkSize)
.reader(reader())
.processor(processor(date))
.writer(writer())
.build();
}
@Value 어노테이션을 사용하려면
@Scope 어노테이션과 함께 사용해주어야 한다. (@JobScope , @StepScope ...)
안쓴다면 아래와 같은 에러를 만나면서 런타임 에러가 발생한다.
Expression parsing failed; nested exception is org
필자는 스케쥴로 실행 시켜줄 것이기 때문에 date를 넣어주었다.
이제 각 스텝을 만들고 조합해서 배치를 활용 해보자
Batch 속도를 개선 해보자
- addBatch 로 인서트를 청크단위로 보내자
- processor 는 하나씩 동작해서 너무 오래 걸린다 빼자 -> writer 에서 작업
- 비동기로 동작하게 만들자
스프링 배치는 반드시 테스트 코드를 작성하자
- 배치 작업은 대용량의 데이터 처리를 위한 시스템 이기 때문에 잘못 동작하면 큰 사고가 난다
- 배치의 각 기능에 대한 단계를 테스트로 검증해야 한다.
- 코드를 변경하거나 리펙토링 할때 예기치 않은 기능에 영향을 주지 않는지 확인 해야 한다.
728x90
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
[Spring] Jasypt 중요 정보를 암호화 하자 (0) | 2024.04.12 |
---|---|
[Spring] Fixture Monkey 테스트 라이브러리 (0) | 2024.04.06 |
[Kotlin] build.gradle 환경변수 적용 (0) | 2024.03.18 |
[Spring] Java + Kotlin 멀티 모듈 프로젝트 만들기 (설정편) (0) | 2024.03.17 |
[Java] CQRS 패턴 적용기 (Feat.Redis) (0) | 2024.03.07 |