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

'Spring.io' 카테고리의 다른 글

Spring boot CLI 명령어와 예시  (0) 2023.06.15
Spring framework 개발 Tip  (0) 2023.05.11
Spring Batch Tasklet 단위 테스트(Unit Test)  (0) 2023.04.27
Spring Boot Mail Starter  (0) 2023.04.25
How to run Spring Boot application unpack-jar  (0) 2023.04.25
Comments