Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- flet
- JVM
- write by GPT-4
- kotlin
- oracle
- spring data jpa
- 인프라
- 자바네트워크
- jpa
- 자바
- android
- 자바암호
- Database
- 역학
- 소프트웨어공학
- NIO
- 고전역학
- chatGPT's answer
- 웹 크롤링
- Java
- 데이터베이스
- 리눅스
- Spring boot
- 코틀린
- 유닉스
- 파이썬
- 시스템
- write by chatGPT
- python
- GPT-4's answer
Archives
- Today
- Total
Akashic Records
Spring Batch RestAPI to DB 본문
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);
}
}
}
마지막으로 이 Reader
와 Writer
를 사용하는 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 Data JPA - EntityManager (0) | 2024.11.26 |
---|---|
Spring Data JPA(Spring Data Java Persistence API) (0) | 2024.11.26 |
Spring boot CLI 명령어와 예시 (0) | 2023.06.15 |
Spring framework 개발 Tip (0) | 2023.05.11 |
Spring Batch Tasklet 단위 테스트(Unit Test) (0) | 2023.04.27 |
Comments