[INTRO] 3. Spring Batch로 배치 Job 구성하기 예제

y001·2026년 2월 2일

Spring Batch Guide

목록 보기
3/19
post-thumbnail

0. 예제 시나리오

간단한 배치 시나리오를 구성한다.

  • Job 이름: simpleHelloJob

  • Step 구성:

    1. 시작 메시지를 출력하는 Step
    2. 종료 메시지를 출력하는 Step

데이터 처리는 포함하지 않고, Tasklet 기반 Step만 사용한다. 이를 통해 Job과 Step 구성, 배치 실행 인프라에 집중한다.

1. 프로젝트 기본 설정

빌드 도구는 Gradle, Java 버전은 17을 사용한다. Spring Boot 관련 의존성은 포함하지 않는다.

plugins {
    id 'java'
    id 'application'
}

group = 'com.example.batch'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.batch:spring-batch-core:5.2.2'
    implementation 'com.h2database:h2:2.3.232'

    testImplementation 'org.springframework.batch:spring-batch-test:5.2.2'
}

application {
    mainClass = 'org.springframework.batch.core.launch.support.CommandLineJobRunner'
}

여기서 핵심은 spring-batch-coreCommandLineJobRunner이다. Spring Boot를 사용하지 않기 때문에 배치 실행을 위한 진입점을 직접 지정해야 하며, Spring Batch는 이를 위해 CommandLineJobRunner를 제공한다.

2. 배치 인프라 설정

Spring Batch는 Job과 Step의 실행 정보를 메타데이터로 저장한다. 이를 위해 DataSource와 TransactionManager가 반드시 필요하다. Spring Batch 5부터 제공되는 DefaultBatchConfiguration을 활용하면 핵심 컴포넌트 구성을 단순화할 수 있다.

@Configuration
public class BatchInfrastructureConfig extends DefaultBatchConfiguration {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript("org/springframework/batch/core/schema-h2.sql")
                .build();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

DefaultBatchConfiguration은 JobRepository, JobLauncher 등 Spring Batch의 핵심 컴포넌트를 자동으로 구성해준다. 대신 DataSource와 PlatformTransactionManager는 개발자가 직접 제공해야 한다. 이 설정만으로 배치 실행에 필요한 최소 인프라는 완성된다.

3. Job과 Step 구성

이제 실제 배치 Job을 구성한다. Job과 Step은 반드시 Spring Bean으로 등록되어야 하며, JobRepository를 통해 실행 이력과 상태가 관리된다.

@Import(BatchInfrastructureConfig.class)
@Configuration
public class SimpleHelloJobConfig {

    private final JobRepository jobRepository;
    private final PlatformTransactionManager transactionManager;

    public SimpleHelloJobConfig(JobRepository jobRepository,
                                PlatformTransactionManager transactionManager) {
        this.jobRepository = jobRepository;
        this.transactionManager = transactionManager;
    }

    @Bean
    public Job simpleHelloJob() {
        return new JobBuilder("simpleHelloJob", jobRepository)
                .start(startStep())
                .next(endStep())
                .build();
    }

    @Bean
    public Step startStep() {
        return new StepBuilder("startStep", jobRepository)
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("배치 Job이 시작되었습니다.");
                    return RepeatStatus.FINISHED;
                }, transactionManager)
                .build();
    }

    @Bean
    public Step endStep() {
        return new StepBuilder("endStep", jobRepository)
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("배치 Job이 정상적으로 종료되었습니다.");
                    return RepeatStatus.FINISHED;
                }, transactionManager)
                .build();
    }
}

Job은 JobBuilder를 통해 생성되며, 이름과 JobRepository를 반드시 지정해야 한다. Step 역시 StepBuilder를 사용해 생성하며, 각 Step은 Tasklet 기반으로 구현했다. Step이 종료되면 다음 Step으로 넘어가며, 모든 Step이 정상 종료되어야 Job이 성공으로 처리된다.

4. 배치 Job 실행

Spring Boot가 없기 때문에 배치 실행은 CommandLineJobRunner를 통해 이루어진다. Gradle 실행 명령은 다음과 같다.

./gradlew run --args="com.example.batch.SimpleHelloJobConfig simpleHelloJob"

첫 번째 인자는 Job이 정의된 설정 클래스의 FQCN이며, 두 번째 인자는 실행할 Job의 이름이다. Job 이름은 JobBuilder에서 지정한 이름과 정확히 일치해야 한다.

실행 결과는 다음과 같다.

배치 Job이 시작되었습니다.
배치 Job이 정상적으로 종료되었습니다.

동시에 H2 인메모리 데이터베이스에는 Job과 Step 실행에 대한 메타데이터가 기록된다. 이는 Spring Batch가 배치 실행을 "상태를 가진 작업"으로 다룬다는 것을 보여준다.

0개의 댓글