[SpringBatch 실습] 28. ItemReaderAdapter

반응형
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()

 

반응형

Designed by JB FACTORY