인프런 커뮤니티 질문&답변
질문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으로 변경하면서 여러 변경점이 있었는데, 이를 반영하여 설정을 잘 수정하신 것 같습니다.
특히 주의할 점은:
- Job 및 Step Builder 변경:
JobBuilderFactory,StepBuilderFactory대신JobRepository와PlatformTransactionManager를 직접 주입받아 사용하신 점
- bean 등록 시 @JobScope와 @StepScope 사용 여부에 주의: 이는 빈 생성 시점을 조정하므로 특정 작업의 로드 타이밍에 활용될 수 있습니다.
스프링 5.0부터는 Job 및 Step 설정이 보다 명확해져서 장기적으로는 가독성과 유지보수성이 좋아집니다. 많은 개발자들이 이러한 변경 사항에 적응하는데 시간을 좀 더 갖고 있으며, 각 변경점이 가져오는 이득을 잘 이해하고 사용하는 것이 중요합니다.
아래 링크에서 유사한 문제에 대한 이전의 답변을 참조하실 수 있습니다. Spring Batch 5.0 변경점에 대해 더 많은 정보를 얻을 수 있을 것입니다.
- Spring Batch 테이블이 생성되질 않습니다!!!!!
- 빌드가 실패해요 ㅠㅠ
유용한 정보가 되길 바랍니다. 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏





