강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

노 승우님의 프로필 이미지
노 승우

작성한 질문수

[스프링 배치 입문] 예제로 배우는 핵심 Spring Batch

일단 실행 - Hello, World (스프링 배치 구조 익히기)

질문x 1강 일단 실행 코드부분 5.0에 맞춰 수정

작성

·

13

0

yaml 수정 시작

spring:
  batch:
    job:
      name: ${job.name:NONE}  # 'names' (복수형)가 삭제되고 'name' (단수형)으로 변경됨
      enabled: true            # 자동 실행을 원할 경우 (기본값 true)
    jdbc:
      initialize-schema: ALWAYS # Spring Boot 3.x 이상에서는 이 속성을 사용 (기존 spring.batch.initialize-schema 삭제됨)
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_batch
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 1234
  sql:
    init:
      mode: always            

 

 

yaml 수정 끝

 

job 패키지 하위 HelloWoldJobConf 수정 시작

package com.example.SpringBatchTutorial.job;

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.job.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.Step;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.infrastructure.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@RequiredArgsConstructor
public class HelloWorldJobConfig {

    /**
     * [Spring Batch 5.0 변경점 1] Factory 삭제
     * - 과거: JobBuilderFactory, StepBuilderFactory를 사용 (Deprecated/삭제됨)
     * - 현재: JobRepository와 TransactionManager를 직접 주입받아서 Builder에 전달해야 함
     */
    private final JobRepository jobRepository; // Job과 Step의 상태(실행 기록 등)를 DB에 저장/관리하는 저장소
    private final PlatformTransactionManager transactionManager; // 트랜잭션 관리자 (Commit/Rollback 담당)

    /**
     * Job 생성 설정
     * - Job은 배치의 가장 큰 실행 단위입니다.
     */
    @Bean
    public Job helloWorldJob() {
        // [변경점 2] new JobBuilder("이름", jobRepository) 사용
        // Factory.get() 대신 Builder를 직접 생성하며, 두 번째 인자로 jobRepository가 필수입니다.
        return new JobBuilder("helloWorldJob", jobRepository)
                .start(helloWorldStep()) // 첫 번째로 실행할 Step 지정
                .build(); // Job 생성
    }

    /**
     * Step 생성 설정
     * - Step은 Job 내부에서 실제 비즈니스 로직(읽기/처리/쓰기)을 담당하는 단계입니다.
     */
    @Bean
    public Step helloWorldStep() {
        // [변경점 3] new StepBuilder("이름", jobRepository) 사용
        return new StepBuilder("helloWorldStep", jobRepository)

                /* * Tasklet 정의 (단순 작업용)
                 * - 람다(Lambda) 식을 사용하여 코드를 간결하게 작성했습니다.
                 * - (contribution, chunkContext) -> { ... } 구조입니다.
                 */
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("Hello, World! Spring Batch 5.0");

                    // Step이 정상적으로 끝났음을 반환 (FINISHED)
                    return RepeatStatus.FINISHED;
                }, transactionManager) // [변경점 4] TransactionManager 필수 전달
                // Spring Batch 5부터는 Step을 만들 때 어떤 트랜잭션 매니저를 쓸지 명시해야 합니다.

                .build(); // Step 생성
    }

}

/*

스프링 3.0.x 대의 버전
@Configuration // 이 클래스가 Spring의 설정(Configuration) 클래스임을 명시
@RequiredArgsConstructor // final이 선언된 필드에 대해 생성자를 자동으로 생성 (의존성 주입)
public class HelloWorldJobConfig {

    // Job과 Step을 쉽게 생성할 수 있도록 도와주는 빌더 팩토리 (Spring Batch 5.0 이전 방식)
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;


      //Job 생성 설정
      //- Job은 배치의 가장 큰 실행 단위입니다.

    @Bean
    public Job helloWorldJob() {
        return jobBuilderFactory.get("helloWorldJob") // "helloWorldJob"이라는 이름으로 Job 생성
                // RunIdIncrementer: Job 실행 시마다 파라미터 ID를 증가시켜, 같은 Job을 여러 번 재실행할 수 있게 함
                .incrementer(new RunIdIncrementer())
                .start(helloWorldStep()) // Job 시작 시 실행할 첫 번째 Step 지정
                .build(); // Job 빌드 및 반환
    }


     //Step 생성 설정
    // - Step은 Job 내부에서 실질적인 처리를 담당하는 단계입니다.
    //  - @JobScope: Job이 실행될 때 이 Bean이 생성되도록 설정 (Late Binding)

    @JobScope
    @Bean
    public Step helloWorldStep() {
        return stepBuilderFactory.get("helloWorldStep") // "helloWorldStep"이라는 이름으로 Step 생성
                .tasklet(helloWorldTasklet()) // 이 Step에서 수행할 기능(Tasklet)을 지정
                .build(); // Step 빌드 및 반환
    }

    //
     // Tasklet 생성 설정
     // - Tasklet은 Step 안에서 단일 작업을 수행하는 로직입니다. (단순 작업용)
     // - @StepScope: Step이 실행될 때 이 Bean이 생성되도록 설정
     ///
    @StepScope
    @Bean
    public Tasklet helloWorldTasklet() {
        // 익명 클래스로 Tasklet 구현
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                // 비즈니스 로직 작성 구간
                System.out.println("Hello World Spring Batch");

                // 이 Tasklet의 처리가 끝났음을 반환 (FINISHED: 종료, CONTINUABLE: 다시 실행)
                return RepeatStatus.FINISHED;
            }
        };
    }
}

* */

job 패키지 하위 HelloWoldJobConf 수정 끝

 

한국어 패치하신분들은

실행/디버그구성 > 빌드 및 실행 > 옵션 및 수정 > 프로그램 인수에

--spring.batch.job.name=helloWorldJob

넣고 값 조회

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 노 승우님이 스프링 배치 설정 변경에 대해 자세히 설명해주셨네요. Spring Batch 5.0으로 변경하면서 여러 변경점이 있었는데, 이를 반영하여 설정을 잘 수정하신 것 같습니다.

특히 주의할 점은:

  1. Job 및 Step Builder 변경: JobBuilderFactory, StepBuilderFactory 대신 JobRepositoryPlatformTransactionManager를 직접 주입받아 사용하신 점
  2. bean 등록 시 @JobScope와 @StepScope 사용 여부에 주의: 이는 빈 생성 시점을 조정하므로 특정 작업의 로드 타이밍에 활용될 수 있습니다.

스프링 5.0부터는 Job 및 Step 설정이 보다 명확해져서 장기적으로는 가독성과 유지보수성이 좋아집니다. 많은 개발자들이 이러한 변경 사항에 적응하는데 시간을 좀 더 갖고 있으며, 각 변경점이 가져오는 이득을 잘 이해하고 사용하는 것이 중요합니다.

아래 링크에서 유사한 문제에 대한 이전의 답변을 참조하실 수 있습니다. Spring Batch 5.0 변경점에 대해 더 많은 정보를 얻을 수 있을 것입니다.
- Spring Batch 테이블이 생성되질 않습니다!!!!!
- 빌드가 실패해요 ㅠㅠ

유용한 정보가 되길 바랍니다. 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

노 승우님의 프로필 이미지
노 승우

작성한 질문수

질문하기