프롬프트 AI&OpenAPI&공공데이터를 활용한 웹앱개발자 양성 과정 91일차

서명원·2024년 4월 24일

1. 아이템 처리자(청크방식)


-스텝 1

  • 테스틀릿 or 아이템처리자
    -스텝 1
  • 테스틀릿 or 아이템처리자
    -스텝 1
  • 테스틀릿 or 아이템처리자

아이템 처리자
-리더 (읽기)
-프로세서(변환)
-라이터(쓰기)

청크: 데이터를 넘기는 묶음의 단위

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));
    }
}

실무에는 코드(상품코드등)이 다 있다.

2. 정산중에 백업이 필요한 이유

데이터를 정산해야되는데 실물 db를 직접 잠글 수는 없으니까,
db를 복사 한 후에 백업한 데이터들에 대해서 정산을 한다.

findAllByIdLessThan(6L) 6보다 작은 모든걸 찾는다.

3. 주의사항

연관관계 상태의 테이블이 있는 데이터를 지울 수는 없다.
그러므로 외래키 설정에는 주의할 것
제약 풀기.

foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)
profile
백엔드 취업을 꿈꾸는 일본어 전공자

0개의 댓글