반응형
728x90
반응형
ItemReaderAdapter
SpringBatch에서 Job 안에 이미 있는 DAO나 다른 서비스를 ItemReader 안에서 사용하고자 할 때 위임 역할을 한다.
Adapter 패턴을 도입하여 지정한 서비스를 호출하도록 한다.
Job 생성
ItemReaderAdapterConfiguration.java
package com.project.springbatch._57_readerAdapter;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.adapter.ItemReaderAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*
--job.name=itemReaderAdapterJob
*/
@RequiredArgsConstructor
@Configuration
public class ItemReaderAdapterConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job itemReaderAdapterJob() throws Exception {
return jobBuilderFactory.get("itemReaderAdapterJob")
.incrementer(new RunIdIncrementer())
.start(itemReaderAdapterStep1())
.build();
}
@Bean
public Step itemReaderAdapterStep1() throws Exception {
return stepBuilderFactory.get("itemReaderAdapterStep1")
.<String,String>chunk(10)
.reader(itemReaderAdapterCustomItemReader())
.writer(itemReaderAdapterCustomItemWriter())
.build();
}
@Bean
public ItemReaderAdapter itemReaderAdapterCustomItemReader() {
ItemReaderAdapter reader = new ItemReaderAdapter();
reader.setTargetObject(customService());
reader.setTargetMethod("joinCustomer");
return reader;
}
private CustomService<String> customService() {
return new CustomService<>();
}
@Bean
public ItemWriter<String> itemReaderAdapterCustomItemWriter() {
return items -> {
System.out.println(items);
};
}
}
1) CustomService.java 에 위임하기
@Bean
public ItemReaderAdapter itemReaderAdapterCustomItemReader() {
ItemReaderAdapter reader = new ItemReaderAdapter();
reader.setTargetObject(customService());
reader.setTargetMethod("joinCustomer");
return reader;
}
Reflection을 사용하여 customService 객체를 생성하여 TargetObject로 설정한다.
private CustomService<String> customService() {
return new CustomService<>();
}
joinCustomer 메서드를 수행하도록 TargetMethod를 설정한다.
2) ItemReaderAdapter 설정
대상이 되는 객체와 메서드와 메서드에 넘겨줄 매개변수 설정이 가능하다.
- setTargetMethod() : 대상이 되는 메서드를 설정한다.
- setTargetObject() : 대상이 되는 객체를 넣어준다.
- setArguments() : 메서드에 넘겨줄 매개변수를 설정한다.
CustomService.java
package com.project.springbatch._57_readerAdapter;
public class CustomService<T> {
private int cnt = 0;
public T joinCustomer(){
return (T)("item" + cnt++);
}
}
동작방식
1) itemReaderAdapterCustomItemReader() 수행
2) SimpleChunkProvider.java > doRead()
3) ItemReaderAdapter > read()
4) AbstractMethodInvokeingDelegator.java > invokeDelegateMethod()
5) AbstractMethodInvokeingDelegator.java > createMethodInvoker() : HippyMethodInvoker 객체를 생성한다.
6) AbstractMethodInvokeingDelegator.java > doInvoke() : 우리가 설정했던 targetMethod를 실행한다.
7) CustomService.java > joinCustomer()
반응형