📌 들어가기 앞서
본 글은 향로 선생님의 2. Spring Batch 가이드 - Batch Job 실행해보기 의 내용을 바탕으로 작성되었습니다.
내용을 효과적으로 읽기 위해서는 위 글을 우선적으로 읽어보시는 것을 권장드립니다.
본 글은 아래의 내용을 포함하고 있습니다.
• Spring Batch 프로젝트 생성하기
• Spring Batch 기본 용어
• 간단한 Job과 Step을 구성하여 배치 실행하기
• MySQL과 함께 실행하기
• Spring Batch 5에서 추가로 변경된 사항
원본 글에 대한 인용 및 요약은 음영 처리된 형태로 표시됩니다.
글의 작성 방향은 이 글을 참고해주시면 감사하겠습니다.
관련 시리즈
1. Spring Batch 5 가이드 - 배치 어플리케이션이란?
2. Spring Batch 5 가이드 - Batch Job 실행해보기
3. Spring Batch 5 가이드 - 메타테이블엿보기
4. Spring Batch 5 가이드 - Spring Batch Job Flow
5. Spring Batch 5 가이드 - Spring Batch Scope & Job Parameter
6. Spring Batch 5 가이드 - Chunk 지향 처리
7. Spring Batch 5 가이드 - ItemReader
8. Spring Batch 5 가이드 - ItemWriter
9. Spring Batch 5 가이드 - ItemProcessor
작업한 코드는 Github에 작성되어 있습니다.
필요한 경우 참고하시면 됩니다.
2.1. Spring Batch 프로젝트 생성하기
기존 향로님이 진행하셨던 개발 환경은 아래와 같습니다.
- IntelliJ IDEA 2018.2
- Spring Boot 2.0.4
- Java 8
- Gradle
본 시리즈에서는 아래의 개발 환경으로 예제 코드가 작성됩니다.
- Spring Boot 3.3.0 (Spring Batch 5.1.2)
- Kotlin JVM 1.9.24
- JDK 17
- Gradle (+ Kotlin DSL)
아래 파일은 위 환경에 따른 Gradle 파일입니다.
plugins {
id("org.springframework.boot") version "3.3.0"
id("io.spring.dependency-management") version "1.1.5"
kotlin("jvm") version "1.9.24"
kotlin("plugin.spring") version "1.9.24"
}
group = "com.ruthetum"
version = "0.0.1-SNAPSHOT"
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-batch")
implementation("org.jetbrains.kotlin:kotlin-reflect")
runtimeOnly("com.h2database:h2")
runtimeOnly("com.mysql:mysql-connector-j")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
testImplementation("org.springframework.batch:spring-batch-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
kotlin {
compilerOptions {
freeCompilerArgs.addAll("-Xjsr305=strict")
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
Spring Batch 기본 용어
간단한 Job을 선언하는 방법을 확인하기 전에 기본적인 Spring Batch의 용어들에 대해 간단하게 설명드리겠습니다.
- JoLauncher : Job을 실행시키는 컴포넌트
- Job : 배치 작업
- JobRepository : Job 실행과 Job, Step을 저장
- Step : 배치 작업의 단계
- ItemReader, ItemProcesser, ItemWriter : 데이터를 읽고 처리하고 쓰는 구성
Job은 1개 이상의 Step으로 구성되어 배치 작업을 수행합니다.
후에 설명을 드리겠지만 Step 같은 경우 Chunk 기반의 작업을 수행하는 경우와 Tasklet 기반의 작업을 수행하는 경우로 구분됩니다.
- 일반적으로 Chunk 기반 스텝을 많이 사용합니다.
- Tasklet 스탭은 하나의 트랜잭션 내에서 작동하고, 단순한 처리를 할 때 사용하게 됩니다.
2-2. Simple Job 생성하기
기본 용어를 이해한 상태에서 간단한 Job을 구성해보도록 하겠습니다.
먼저 Java와 Spring Batch 4 기준으로 간단한 Job을 구성하게 되면 아래와 같은 형태로 작성되어집니다.
@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();
}
}
각 컴포넌트 및 라인에서 의미하는 바는 아래와 같습니다.
@Configuration
- Spring Batch의 모든 Job은 @Configuration으로 등록해서 사용합니다.
jobBuilderFactory.get("simpleJob")
- simpleJob 이란 이름의 Batch Job을 생성합니다.
- job의 이름은 별도로 지정하지 않고, 이렇게 Builder를 통해 지정합니다.
stepBuilderFactory.get("simpleStep1")
- simpleStep1 이란 이름의 Batch Step을 생성합니다.
- jobBuilderFactory.get("simpleJob")와 마찬가지로 Builder를 통해 이름을 지정합니다.
tasklet((contribution, chunkContext))
- Step 안에서 수행될 기능들을 명시합니다.
- Tasklet은 Step안에서 단일로 수행될 커스텀한 기능들을 선언할때 사용합니다.
- 여기서는 Batch가 수행되면 log.info(">>>>> This is Step1") 가 출력되도록 합니다.
기본적으로 Spring 및 Spring Batch에서 활용되는 어노테이션 및 주요 컴포넌트는 대부분 동일합니다.
다만 Spring Batch의 버전이 올라가면서 몇몇 어노테이션 지원 및 Spring Batch에서 배치를 실행하기 위해 정의하는 Job에 대한 설정 방법에 일부 수정이 있습니다.
[Batch 4 vs. Batch 5] JobBuilderFactory, StepBuilderFactory deprecated
먼저 Job과 Step을 선언하는 경우 JobBuilderFactory, StepBuilderFactory는 Batch 5를 기준으로 지원하지 않게 되었습니다.
- 이에 따라 더이상 Builder Factory를 사용하지 않고 JobBuilder, StepBuilder를 사용합니다.
[Batch 4 vs. Batch 5] JobRepository, TransactionManager
Spring Batch 5에서는 내부의 필요한 객체를 명시적으로 표시해주는 형태로 변경되었습니다.
- 이에 따라 기존에는 생략했던 JobRepository, TransactionManager를 선언하여 Job을 구성하게 됩니다.
변경점을 고려하여 위에서 작성했던 예제 코드를 Kotlin과 Srping Batch 5 기준으로 작성하면 아래와 같이 변경됩니다.
@Configuration
class SimpleJobConfiguration(
private val jobRepository: JobRepository,
private val transactionManager: PlatformTransactionManager,
) {
private val log = logger()
@Bean
fun simpleJob(): Job {
return JobBuilder("simpleJob", jobRepository)
.start(simpleStep1())
.build()
}
@Bean
fun simpleStep1(): Step {
return StepBuilder("simpleStep1", jobRepository)
.tasklet(simpleTasklet(), transactionManager)
.build()
}
fun simpleTasklet(): Tasklet {
return Tasklet { _, _ ->
log.info(">>>>> This is Step1");
RepeatStatus.FINISHED
}
}
}
실행 결과는 아래와 같습니다.
정상적으로 Job과 Step이 실행됨을 확인할 수 있습니다.
2-3. MySQL 환경에서 Spring Batch 실행해보기
이전 과정에서 굉장히 간단하게 Spring Batch가 수행되었습니다.
Spring Batch는 어플리케이션 코드만 작성하면 되는구나! 라고 생각하실수 있으실텐데요.
실제로는 그렇지 않습니다. Spring Batch에선 메타 데이터 테이블들이 필요합니다.
Spring Batch의 메타 데이터는 다음과 같은 내용들을 담고 있습니다.
- 이전에 실행한 Job이 어떤 것들이 있는지
- 최근 실패한 Batch Parameter가 어떤것들이 있고, 성공한 Job은 어떤것들이 있는지
- 다시 실행한다면 어디서 부터 시작하면 될지어떤 Job에 어떤 Step들이 있는지
- Step들 중 성공한 Step과 실패한 Step들은 어떤것들이 있는지
등등 Batch 어플리케이션을 운영하기 위한 메타데이터가 여러 테이블에 나눠져 있습니다.
아래 테이블은
Spring Batch의 버전이 올라감에 따라 메타 데이터 스키마에도 작은 변경이 있었고, 해당 내용에 대해서는 다음 글에서 설명드리겠습니다.
- Spring Batch Meta-data Schema(5.1.2): https://docs.spring.io/spring-batch/reference/schema-appendix.html
- Spring Batch Meta-data Schema(3.x.x): https://docs.spring.io/spring-batch/docs/3.0.x/reference/html/metaDataSchema.html
테이블의 정의나 관계는 크게 변하지 않았고, Job Parameter 정보를 담는 BATCH_JOB_EXECUTION_PARAMS의 테이블 정의가 일부 변경되었습니다.
이 테이블들이 있어야만 Spring Batch가 정상 작동합니다.
기본적으로 H2 DB를 사용할 경우엔 해당 테이블을 Boot가 실행될때 자동으로 생성해주지만, MySQL이나 Oracle과 같은 DB를 사용할때는 개발자가 직접 생성해야만 합니다.
그럼 이 테이블들의 스키마가 궁금하실텐데요.
이미 Spring Batch에 해당 스키마가 존재하고 있고, 이를 그대로 복사해서 create table 하면 됩니다.
각 데이터베이스 별로 Native Query를 확인하고 싶으신 경우 Spring Batch Github을 통해 확인하실 수 있습니다.
e.g. MySQL Metadata table schema
2.4. Spring Batch 5에서 추가로 변경된 사항
본 내용은 원본 글에는 포함되어 있지 않은 Spring Batch 5를 적용할 때 Batch 4와 다른 부분에 대해서 내용을 정리합니다.
[Batch 4 vs. Batch 5] @EnableBatchProcessing
Spring Boot 3.0부터는 @EnableBatchProcessing 사용을 권장하지 않습니다.
- 정확히는 필수적으로 사용해야 하는 어노테이션이 아니게 되었습니다.
- @EnableBatchProcessing 어노테이션의 경우 Batch와 관련된 기본 Bean들을 자동으로 등록해주는 기능을 담당합니다.
- 그래서 버전 4까지는 위 어노테이션을 사용하여 기본 Bean들을 등록했지만, 버전5부터는 해당 어노테이션을 사용하지 않아도 Bean 등록이 진행됩니다.
'Spring Batch > Spring Batch 가이드' 카테고리의 다른 글
[Kotlin] 4. Spring Batch 5 가이드 - Spring Batch Job Flow (0) | 2024.06.23 |
---|---|
[Kotlin] 3. Spring Batch 5 가이드 - 메타테이블 엿보기 (0) | 2024.06.16 |
[Kotlin] 1. Spring Batch 5 가이드 - 배치 어플리케이션이란? (0) | 2024.06.06 |
[Kotlin] 0. Spring Batch 5 가이드에 들어가기 앞서 (0) | 2024.06.06 |