이번 글에서는 주문 테이블에서 데이터를 읽어 정산 엔티티로 변환해 정산 테이블에 이관하는 작업을 해보겠습니다. 이번 글에서는 Job과 Step 그리고 Step들에는 ItemReader, ItemProcessor, ItemWriter를 등록해 사용해보겠습니다.
먼저 새로운 JobConfig 클래스를 만들고 의존관계를 주입해줍니다.
@Configuration
@RequiredArgsConstructor
public class TrMigrationConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final OrdersRepository ordersRepository;
private final AccountsRepository accountsRepository;
}
그런 다음 Job과 ItemReader, ItemProcessor, ItemWriter를 작성해줍니다.
// 잡
@Bean
public Job trMigrationJob(Step trMigrationStep) {
return jobBuilderFactory.get("trMigrationJob") // 이 Job의 이름을 지정
.incrementer(new RunIdIncrementer()) // Job의 식별자인 id값 자동 증가
.start(trMigrationStep) // 실행될 Step을 지정
.build();
}
// 리더
@Bean
@StepScope
public RepositoryItemReader<Orders> trOrdersReader() {
return new RepositoryItemReaderBuilder<Orders>()
.name("trOrdersReader") // 아이템 리더명 지정
.repository(ordersRepository) // 사용할 레파지토리
.methodName("findAll") // 사용할 매서드
.pageSize(5) // 통상 chunk 사이즈와 동일
.arguments(Arrays.asList()) // 파라미터
.sorts(Collections.singletonMap("id", Sort.Direction.ASC)) // 정렬
.build();
}
// 프로세서
@Bean
@StepScope
public ItemProcessor<Orders, Accounts> trOrderProcessor() {
return new ItemProcessor<Orders, Accounts>() {
@Override
public Accounts process(Orders item) throws Exception {
return new Accounts(item);
}
};
}
// 라이터
@Bean
@StepScope
public RepositoryItemWriter<Accounts> trOrdersWriter() {
return new RepositoryItemWriterBuilder<Accounts>()
.repository(accountsRepository) // 사용할 레파지토리
.methodName("save") // 사용할 매서드
.build();
}
복잡해 보이지만 굉장히 단순한 구조로 구성되어 있습니다. 그리고 이것들을 Step에 등록해줍니다.
// 스텝
@Bean
@JobScope
public Step trMigrationStep(ItemReader trOrdersReader,
ItemProcessor trOrderProcessor,
RepositoryItemWriter trOrdersWriter) {
return stepBuilderFactory.get("trMigrationStep") // 이 Step의 이름을 지정
.<Orders, Accounts> chunk(5) // chunk: 처리할 데이터의 트랜잭션 수, <가져올 엔티티, 쓸 엔티티>
.reader(trOrdersReader)
.processor(trOrderProcessor)
.writer(trOrdersWriter)
.build();
}
전체적으로 정리하자면 ItemReader는 DB에서 데이터를 읽어 오고, ItemProcessor는 가져온 데이터를 가지고 작업하고, ItemWriter는 작업한 데이터를 DB에 저장하거나 혹은 다른 곳으로 보내는 등 마지막 처리를 합니다.
다음 글에서는 csv 파일에서 데이터를 읽어와 txt 파일로 쓰는 방법에 대해 알아보겠습니다.