Spring Batch 5.x ~ 사용해보기 - 1. 시작하기

Kim DongKyun·2023년 6월 4일
4

개요

대용량 데이터의 처리와 통계 데이터 활용을 위해 활용되는 Spring Batch, 알아보자. 알아볼 내용은 대부분 출처의 내용을 기반으로 공부했으며, SpringBoot 3.x 이상, Spring Batch 5 이상 버전에서 위 출처의 내용이 어떻게 적용될 수 있을지 따라가본다.

1. Spring Batch?

대용량의 데이터를 단발성으로 처리하기 위해서 만들어졌다.

  • 예를 들어 상품의 주문량 파악, 결산 금액 파악, ERP 데이터 활용 등
  • 하루 주문량을 Spring Batch를 이용해 저장하고, 저장된 데이터를 사용자가 요청할 때만 다시 볼 수 있도록 하는 식

이미지 출처 및 참고

위처럼 Spring Batch는 정해주는 시간에 따라 돌아가고, 사용자가 요청 할 때만 그 데이터를 전달하면 됨.

배치 어플리케이션의 조건

  1. 대용량 데이터
  • 배치 어플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다.
  1. 자동화
  • 배치 어플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
  1. 견고성
  • 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
  1. 신뢰성
  • 배치 어플리케이션은 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅, 알림)
  1. 성능
  • 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다.

2. 실제로 시작해보자!

테스트를 해 볼 환경은

SpringBoot 3.0.5 (아마 최신) + Gradle
Java 17

모든 코드는 : https://github.com/ca1af/Play_ground

2 - 1. build.gradle

dependencies {
    // Spring Batch
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    // Spring Data JPA
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // h2 DB
    implementation 'com.h2database:h2'
    // 스프링 웹
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // 롬복
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

2 - 2. application.properties

# Spring Batch Job enable
spring.batch.job.enabled=true

# H2 DATABASE Setting
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:db;MODE=MYSQL;
spring.datasource.username=sa
spring.datasource.password=

# Hibernate
spring.jpa.hibernate.ddl-auto = create
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true

2 - 3 시작하기

버전에 따라 달라진다.

  1. SpringBoot 2.~ 버전 링크

    JobBuilderFactory 의존 주입 후 사용 (선생님 방식)

먼저 SpringBootApplication 에 @EnableBatchProcessing 어노테이션을 통해서 Spring Batch 기능을 활성화한다

@Slf4j // log 사용을 위한 lombok 어노테이션
@RequiredArgsConstructor // 생성자 DI를 위한 lombok 어노테이션
@Configuration
public class SimpleJobConfiguration {
    private final JobBuilderFactory jobBuilderFactory; // 생성자 DI 받음
    private final StepBuilderFactory stepBuilderFactory; // 생성자 DI 받음

    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("simpleJob")
                .start(simpleStep1())
                .build();
    }

    @Bean
    public Step simpleStep1() {
        return stepBuilderFactory.get("simpleStep1")
                .tasklet((contribution, chunkContext) -> {
                    log.info(">>>>> This is Step1");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}

위 참고 블로그는 2018년 기준이라, JobBuilderFactory 를 사용하지만(4.x 버전까지는) 새로운 버전은 JobBuilder 객체를 사용하기를 권장한다

Builder에서 JobRepository가 생성되고 설정된다는 사실은 문서를 참고하기 전까지는 알 수 없다. 따라서 5.x 버전 이후로는 JobBuilder 객체를 직접 사용하여 아래와 같이 설정하는 것이 권장된다


2, SpringBoot 3.0.0 이상 버전의 방식

중요!!! SpringBoot 3.0 이상은

@EnableBatchProcessing 사용하지 않는다!

스프링 3.0 마이그레이션 가이드를 살펴보면, @EnableBatchProcessing 사용 시 Spring Batch 기본 설정이 백오프된다고 설명된다.

꺼주자.

아래는 위의 예제 코드를 SpringBoot 3.~ 버전으로 만들어 본 결과이다.

@Slf4j
@Configuration
public class SimpleJobConfiguration {
    @Bean
    public Job simpleJob1(JobRepository jobRepository, Step simpleStep1) {
        return new JobBuilder("simpleJob", jobRepository)
                .start(simpleStep1)
                .build();
    }
    @Bean
    public Step simpleStep1(JobRepository jobRepository, Tasklet testTasklet, PlatformTransactionManager platformTransactionManager){
        return new StepBuilder("simpleStep1", jobRepository)
                .tasklet(testTasklet, platformTransactionManager).build();
    }
    @Bean
    public Tasklet testTasklet(){
        return ((contribution, chunkContext) -> {
            log.info(">>>>> This is Step1");
            return RepeatStatus.FINISHED;
        });
    }
}

잘 동작하는 모습!

다음 시간에는 좀 더 복잡한 것을 해볼 예정

1개의 댓글

comment-user-thumbnail
2023년 12월 19일

spring batch5 자료가 너~무 없네요..
여기 글 잘 보고 있습니다.
simpleJob1 이것은 어떻게 실행이 되나요?

답글 달기