Akashic Records

Spring Batch RestAPI to DB 본문

Spring.io

Spring Batch RestAPI to DB

Andrew's Akashic Records 2023. 6. 27. 11:54
728x90

먼저, 필요한 Maven dependency를 추가해야 합니다. Spring Batch와 Spring Boot Starter Data JPA를 사용하면 됩니다.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- Rest Template 사용을 위한 의존성 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 추가적으로 필요한 의존성들 -->
</dependencies>

 

그런 다음 아래와 같이 RestTemplate을 이용하여 REST API를 호출하는 ItemReader를 정의하겠습니다. API 호출에서 사용할 날짜 문자열을 파라미터로 받습니다.

import org.springframework.batch.item.ItemReader;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

public class RestApiReader implements ItemReader<List<MyObject>> {

    private final String apiUrl;
    private final RestTemplate restTemplate;

    public RestApiReader(String apiUrl, String dateParam) {
        this.apiUrl = apiUrl + dateParam;
        this.restTemplate = new RestTemplate();
    }

    @Override
    public List<MyObject> read() {
        MyObject[] data = restTemplate.getForObject(apiUrl, MyObject[].class);
        return data != null ? Arrays.asList(data) : null;
    }
}

이제 DB에 데이터를 쓰는 ItemWriter를 정의하겠습니다.

import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

public class DBWriter implements ItemWriter<List<MyObject>> {

    @Autowired
    private MyObjectRepository myObjectRepository;

    @Override
    public void write(List<? extends List<MyObject>> items) {
        for (List<MyObject> item : items) {
            myObjectRepository.saveAll(item);
        }
    }
}

 

마지막으로 이 ReaderWriter를 사용하는 Spring Batch Job을 정의하겠습니다.

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public RestApiReader reader(String apiUrl, String dateParam) {
        return new RestApiReader(apiUrl, dateParam);
    }

    @Bean
    public DBWriter writer() {
        return new DBWriter();
    }

    @Bean
    public Step step1(DBWriter writer) {
        return stepBuilderFactory.get("step1")
                .<List<MyObject>, List<MyObject>> chunk(10)
                .reader(reader())
                .writer(writer)
                .build();
    }

    @Bean
    public Job exportDataJob(Step step1) {
        return jobBuilderFactory.get("exportDataJob")
                .flow(step1)
                .end()
                .build();
    }
}

이 코드는 간단한 예제이며, 실제 작업에서는 예외 처리, 페이징 처리, 스레드 관리 등 다양한 요구 사항을 고려해야 할 수 있습니다. 따라서 실제 상황에 맞게 코드를 수정하실 필요가 있습니다.

 

MyObject 클래스와 MyObjectRepository 인터페이스는 예시로 든 것이며 실제 엔티티 클래스와 JpaRepository 인터페이스에 맞게 수정하실 수 있습니다.

728x90
Comments