Spring Batch 5.0 이후

Chooooo·2024년 5월 17일
0

스프링 배치

목록 보기
3/3

환경

jdk 17, Spring Boot 3.x, Spring Batch 5.x

  1. Spring Batch 의존성 추가
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-batch'
}
  1. Spring Batch 관련 환경 설정
  • spring.batch.job.enabled : 애플리케이션 시작 시 Batch 작업 자동 실행 여부를 설정. 기본값 true
  • spring.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-schemaalways로 설정하면 애플리케이션 시작 시 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();
    }
}
  • WebClient 스프링 빈으로 등록.
  • defaultHeader()를 사용하여 기본 요청 헤더를 설정한다. (이후에 역시 수정 가능)
  • 이렇게 미리 스프링 빈으로 등록해 놓으면 다른 컴포넌트에서 주입 받아 편하게 사용할 수 있다.

-> OPEN API 스펙에 따라 요청 URL, 파라미터, 응답 데이터 형식 등을 고려하여 WebClient를 사용할 수 있다. WebClient의 get(), post() 등의 메서드를 사용하여 적절히 요청을 보내고 retrive() 메서드를 통해 응답 데이터를 받아올 수 있다.

Spring Batch 5.0 바뀐점

스프링 배치 5.0 이후 버전에서는 JobBuilderFactoryStepBuilderFactory 대신 JobBuilderStepBuilder를 직접 사용하는 것이 권장된다. 이는 빌더 패턴을 사용하여 작업과 단계를 구성하는 방식으로 변경되었기 때문

또한 StepBuilder에서는 JobRepository와 PlatformTransactionManager를 파라미터로 받아 사용하는 것으로 바뀌었다. chunk 메서드에 TransactionManager를 인자로 전달해야 한다.

  • chunk(int, PlatformTransactionManager)

스프링 배치 5.0 이후부터는 JobRepository와 TransactionManager를 명시적으로 설정해야 하는 것으로 바뀌었다.

  1. JobRepository
  • JobRepository는 배치 작업의 메타데이터를 저장하고 관리하는 역할.
  • 배치 작업의 실행 정보, 상태, 결과 등을 데이터베이스에 저장하고 관리하는 역할을 한다.
  • JobInstance, JobExecution, StepExecution등의 정보를 저정하고 관리
  • JobRepository는 일반적으로 데이터베이스와 연동되어 사용된다.
  1. TransactionManager
  • TransactionManager는 배치 작업의 트랜잭션을 관리하는 역할을 한다.
  • 배치 작업은 대량의 데이터를 처리하므로 트랜잭션 관리가 중요하다. 트랜잭션을 사용하여 데이터 일관성과 무결성을 보장한다.
  • 스프링 배치에서 청크 기반 처리를 사용할 때 트랜잭션 경계를 설정하고 관리한다.
  • 트랜잭션 관리자는 데이터베이스 연동에 사용되는 기술에 따라 다양한 구현체 사용 가능. JDBC, JPA... (ex. JpaTransactionManager)
  • 트랜잭션 관리자는 스프링 배치의 Step설정에서 명시적으로 지정해야 한다.

물론 TransactionManager를 명시적으로 설정하지 않고 스프링부트의 자동 설정에 의존할 수 있다.
private final PlatformTransactionManager transactionManager; 이렇게 스프링 빈으로 등록된 트랜잭션 매니저를 사용하는 것인데,
1. 스프링 부트는 클래스패스에서 사용 가능한 데이터 소스(DataSource)를 찾아 자동으로 설정한다.
2. 자동 설정된 DataSource를 기반으로 TransactionManager를 생성한다. 기본적으로 DataSourceTransactionManager가 사용된다.
3. 자동 설정된 DataSource와 TransactionManager를 사용하여 JobRepository를 생성한다.

위처럼 스프링 빈으로 등록된 TransactionManager를 주입 받아 Step의 트랜잭션을 관리할 수 있다.

궁금한 점 : 일반적으로 배치는 동기식 처리를 기본으로 한다 ? WebClient를 쓰는 것은 비동기가 가능한 것인데.. 이 부분은 내가 아직 잘 모르겠다 비동기. 동기 공부하자.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글