jdk 17, Spring Boot 3.x, Spring Batch 5.x
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-batch'
}
spring.batch.job.enabled
: 애플리케이션 시작 시 Batch 작업 자동 실행 여부를 설정. 기본값 truespring.batch.jdbc.initialize-schema
: 데이터베이스 스키마 초기화 옵션을 설정. 기본값 embedded
, 내장 데이터베이스인 경우에만 스키마 자동 생성spring.batch.job.names
: 실행할 Batch 작업의 이름 지정. 여러 개의 작업을 쉼표로 구분하여 지정 가능-> 자주 사용되는 설정은 spring.batch.job.enabled
, spring.batch.jdbc.initialize-schema
가 있따.
-> spring.batch.job.enabled
를 false로 설정하면 애플리케이션 시작 시 Batch 작업이 자동으로 실행되지 않는다.
-> spring.batch.jdbc.initialize-schema
를 always
로 설정하면 애플리케이션 시작 시 Batch 관련 테이블이 자동으로 생성된다.
이번 프로젝트에서는 하나의 배치 작업(Job)에 여러 개의 스텝(Step)으로 구성하여 스텝 간 데이터 전달까지 진행할 것이다. 또한 chunk
지향 처리 방식을 사용하여 reader, processor, writer를 통해 데이터를 읽고, 가공하고, 쓰는 과정을 수행해 보자.
아파트 실거래가를 OPEN API로부터 받아와서 진행한다.
그렇기에 WebClient
를 사용하여 OPEN API와 연동하고, 가져온 데이터를 Spring Batch에서 처리.
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
return WebClient.builder()
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
}
-> OPEN API 스펙에 따라 요청 URL, 파라미터, 응답 데이터 형식 등을 고려하여 WebClient
를 사용할 수 있다. WebClient의 get(), post() 등의 메서드를 사용하여 적절히 요청을 보내고 retrive()
메서드를 통해 응답 데이터를 받아올 수 있다.
스프링 배치 5.0 이후 버전에서는 JobBuilderFactory
와 StepBuilderFactory
대신 JobBuilder
와 StepBuilder
를 직접 사용하는 것이 권장된다. 이는 빌더 패턴을 사용하여 작업과 단계를 구성하는 방식으로 변경되었기 때문
또한 StepBuilder에서는 JobRepository와 PlatformTransactionManager를 파라미터로 받아 사용하는 것으로 바뀌었다. chunk
메서드에 TransactionManager를 인자로 전달해야 한다.
chunk(int, PlatformTransactionManager)
스프링 배치 5.0 이후부터는 JobRepository와 TransactionManager를 명시적으로 설정해야 하는 것으로 바뀌었다.
물론 TransactionManager를 명시적으로 설정하지 않고 스프링부트의 자동 설정에 의존할 수 있다.
private final PlatformTransactionManager transactionManager;
이렇게 스프링 빈으로 등록된 트랜잭션 매니저를 사용하는 것인데,
1. 스프링 부트는 클래스패스에서 사용 가능한 데이터 소스(DataSource)를 찾아 자동으로 설정한다.
2. 자동 설정된 DataSource를 기반으로 TransactionManager를 생성한다. 기본적으로 DataSourceTransactionManager가 사용된다.
3. 자동 설정된 DataSource와 TransactionManager를 사용하여 JobRepository를 생성한다.
위처럼 스프링 빈으로 등록된 TransactionManager를 주입 받아 Step의 트랜잭션을 관리할 수 있다.
궁금한 점 : 일반적으로 배치는 동기식 처리를 기본으로 한다 ? WebClient를 쓰는 것은 비동기가 가능한 것인데.. 이 부분은 내가 아직 잘 모르겠다 비동기. 동기 공부하자.