잡
-스텝 1
아이템 처리자
-리더 (읽기)
-프로세서(변환)
-라이터(쓰기)
청크: 데이터를 넘기는 묶음의 단위
ex)예시코드
@Configuration
@RequiredArgsConstructor
@Slf4j
public class RebateOrderItemJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final OrderItemRepository orderItemRepository; // 읽을 대상
private final RebatedOrderItemRepository rebatedOrderItemRepository; // 쓸 대상
@Bean
public Job rebateOrderItemJob(Step rebateOrderItemJobStep1) {
return jobBuilderFactory.get("rebateOrderItemJob")
.start(rebateOrderItemJobStep1)
.incrementer(new RunIdIncrementer())
.build();
}
@JobScope
@Bean
public Step rebateOrderItemJobStep1(
ItemReader orderItemReader,
ItemProcessor orderItemProcessor,
ItemWriter orderItemWriter) {
return stepBuilderFactory.get("rebateOrderItemJobStep1")
.<OrderItem, RebatedOrderItem>chunk(1)
.reader(orderItemReader)
.processor(orderItemProcessor)
.writer(orderItemWriter)
.build();
}
@StepScope
@Bean
public RepositoryItemReader<OrderItem> orderItemReader() {
return new RepositoryItemReaderBuilder<OrderItem>()
.name("orderItemReader")
.repository(orderItemRepository)
.methodName("findAll")
.pageSize(1)
.arguments(Arrays.asList())
.sorts(Collections.singletonMap("id", Sort.Direction.ASC))
.build();
}
@StepScope
@Bean
public ItemProcessor<OrderItem, RebatedOrderItem> orderItemProcessor() {
return orderItem -> new RebatedOrderItem(orderItem);
}
@StepScope
@Bean
public ItemWriter<RebatedOrderItem> orderItemWriter() {
return items -> items.forEach(item -> rebatedOrderItemRepository.save(item));
}
}
실무에는 코드(상품코드등)이 다 있다.
데이터를 정산해야되는데 실물 db를 직접 잠글 수는 없으니까,
db를 복사 한 후에 백업한 데이터들에 대해서 정산을 한다.
findAllByIdLessThan(6L) 6보다 작은 모든걸 찾는다.
연관관계 상태의 테이블이 있는 데이터를 지울 수는 없다.
그러므로 외래키 설정에는 주의할 것
제약 풀기.
foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)