예시)
1개의 Job
아이템처리자
readdr (읽기)
processor (변환)
writer (쓰기)
@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));
}
}
6보다 작은 id를 조회하고싶다 -> LessThan을 사용한다
public interface OrderItemRepository extends JpaRepository<OrderItem, Long> {
Page<OrderItem> findAllByIdLessThan(long id, Pageable pageable);
}
public class makeRebateOrderItemJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public class makeRebateOrderItemJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public RepositoryItemReader<OrderItem> orderItemReader() {
return new RepositoryItemReaderBuilder<OrderItem>()
.name("orderItemReader")
.repository(orderItemRepository)
.methodName("findAllByIdLessThan")
.pageSize(100)
.arguments(Arrays.asList(6L))
.sorts(Collections.singletonMap("id", Sort.Direction.ASC))
.build();
}
x ~ y 사이의 데이터를 조회하고싶다 -> Between
public interface OrderItemRepository extends JpaRepository<OrderItem, Long> {
Page<OrderItem> findAllByIdLessThan(long id, Pageable pageable);
Page<OrderItem> findAllByIdBetween(long fromId, long toId, Pageable pageable);
}
public RepositoryItemReader<OrderItem> orderItemReader(
@Value("#{jobParameters['fromId']}") long fromId,
@Value("#{jobParameters['toId']}") long toId
) {
return new RepositoryItemReaderBuilder<OrderItem>()
.name("orderItemReader")
.repository(orderItemRepository)
.methodName("findAllByIdBetween")
.pageSize(100)
.arguments(Arrays.asList(fromId, toId))
.sorts(Collections.singletonMap("id", Sort.Direction.ASC))
.build();
}
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
public class RebateOrderItem extends BaseEntity {
@OneToOne(fetch = FetchType.LAZY)
@ToString.Exclude
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private OrderItem orderItem;
@ManyToOne(fetch = FetchType.LAZY)
@ToString.Exclude
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Order order;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private ProductOption productOption;
private int quantity;
//가격
private int price; // 권장 판매가
private int salePrice; // 실제 판매가
private int wholesalePrice; // 도매가
private int pgFee; // 결제대행사 수수료
private int payPrice; // 결제금액
private int refundPrice; // 환불금액
private int refundQuantity; // 환불 한 갯수
private boolean isPaid; // 결제 여부