BE/Spring & Spring Boot

[Spring Boot] 스프링 배치 (Spring Batch)

baek-dev 2025. 3. 1. 13:45

⚡ 1. 스프링 배치(Spring Batch)란?

Spring Batch대량의 데이터를 일정한 주기로 처리하는 배치 작업을 수행하는 프레임워크입니다.

스프링 기반으로 배치 처리 자동화 및 최적화를 지원하며, 데이터 읽기(Read) → 처리(Process) → 저장(Write) 의 흐름을 기본으로 합니다.

 

✅ Spring Batch 주요 특징

 

🔹 대량 데이터 처리 최적화 → 데이터베이스, 파일, API에서 데이터를 읽고 처리 후 저장 가능

🔹 트랜잭션 관리 → 장애 발생 시 재시도(Retry), 롤백(Rollback), 체크포인트(Checkpoint) 지원

🔹 스케줄링 연동Spring Scheduler, Quartz, Kubernetes CronJob과 연동 가능

🔹 병렬 처리 지원 → 멀티스레드, 분산 처리로 성능 최적화 가능

🔹 대량 처리 시 성능 보장 → 청크(Chunk) 기반의 처리 방식 사용

 

⚡ 2. 스프링 배치 기본 개념

Spring Batch는 크게 Job → Step → Tasklet(ItemReader, ItemProcessor, ItemWriter) 구조로 이루어집니다.

 

🏗 Spring Batch 기본 구조

+----------------------+
|        Job          |  <- 하나의 배치 작업 단위
+----------------------+
         |
         ↓
+----------------------+
|        Step         |  <- 개별 처리 단계
+----------------------+
         |
         ↓
+----------------------+   +----------------------+   +----------------------+
|     ItemReader      | → |   ItemProcessor      | → |     ItemWriter      |
+----------------------+   +----------------------+   +----------------------+

 

⚙️ 핵심 개념

개념 설명
Job 배치 작업의 실행 단위 (하나의 배치 Job은 여러 Step을 포함)
Step 배치 Job의 내부 처리 단위 (읽기-처리-쓰기 포함)
ItemReader 데이터 소스(DB, 파일, API)에서 데이터를 읽음
ItemProcessor 데이터를 가공 및 변환
ItemWriter 가공된 데이터를 저장(DB, 파일, 메시지 큐 등)

 

⚡ 3. 스프링 배치 설정 및 예제

Spring Boot 프로젝트에서 Spring Batch를 설정하고 실행하는 방법을 알아봅시다.

 

⚙️ 1) Spring Batch 의존성 추가 (build.gradle)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.h2database:h2' // 테스트용 DB
}

spring-boot-starter-batch를 추가하면 배치 기능을 사용할 수 있습니다.

 

⚙️ 2) 배치 Job 설정 (BatchConfig.java)

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Bean
    public Job sampleJob(JobRepository jobRepository, Step sampleStep) {
        return new JobBuilder("sampleJob", jobRepository)
                .start(sampleStep)
                .build();
    }

    @Bean
    public Step sampleStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
        return new StepBuilder("sampleStep", jobRepository)
                .<String, String>chunk(10, transactionManager)
                .reader(itemReader())
                .processor(itemProcessor())
                .writer(itemWriter())
                .build();
    }

    @Bean
    public ItemReader<String> itemReader() {
        return new ListItemReader<>(List.of("Apple", "Banana", "Cherry"));
    }

    @Bean
    public ItemProcessor<String, String> itemProcessor() {
        return item -> item.toUpperCase(); // 데이터를 대문자로 변환
    }

    @Bean
    public ItemWriter<String> itemWriter() {
        return items -> items.forEach(System.out::println); // 콘솔 출력
    }
}

📝 실행 흐름:

1️⃣ itemReader()"Apple", "Banana", "Cherry" 데이터 읽기

2️⃣ itemProcessor() → 데이터를 대문자로 변환 (APPLE, BANANA, CHERRY)

3️⃣ itemWriter() → 변환된 데이터를 콘솔에 출력

 

🖥 실행 결과:

APPLE
BANANA
CHERRY

 

⚙️ 3) 배치 Job 실행 방법

 

1️⃣ Spring Boot 애플리케이션 실행 시 자동 실행

Spring Boot를 실행하면 sampleJob이 자동 실행됩니다.

 

2️⃣ 커맨드라인에서 직접 실행 (CommandLineJobRunner)

java -jar my-batch-app.jar --spring.batch.job.names=sampleJob

특정 Job을 실행하려면 --spring.batch.job.names 옵션을 사용하면 됩니다.

 

⚡ 4. 스프링 배치 심화 기능

⚙️ 1) DB에서 데이터를 읽고 가공하여 저장하기

데이터 읽기(ItemReader) → 변환(ItemProcessor) → 저장(ItemWriter)

 

1️⃣ 데이터 읽기 (JPA 기반 ItemReader)

@Bean
public JpaPagingItemReader<User> itemReader(EntityManagerFactory entityManagerFactory) {
    return new JpaPagingItemReaderBuilder<User>()
            .name("userItemReader")
            .entityManagerFactory(entityManagerFactory)
            .queryString("SELECT u FROM User u")
            .pageSize(10)
            .build();
}

 

2️⃣ 데이터 변환 (ItemProcessor)

@Bean
public ItemProcessor<User, UserDto> itemProcessor() {
    return user -> new UserDto(user.getId(), user.getName().toUpperCase());
}

 

3️⃣ 데이터 저장 (JPA 기반 ItemWriter)

@Bean
public JpaItemWriter<UserDto> itemWriter(EntityManagerFactory entityManagerFactory) {
    return new JpaItemWriterBuilder<UserDto>()
            .entityManagerFactory(entityManagerFactory)
            .build();
}

 

⚙️ 2) 배치 Job 재시도 및 실패 처리

Step이 실패할 경우 재시도(Retry) 가능

지정된 횟수만큼 실행 후 실패하면 Job 종료

예외가 발생했을 때 스킵(Skip) 가능

@Bean
public Step sampleStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
    return new StepBuilder("sampleStep", jobRepository)
            .<String, String>chunk(10, transactionManager)
            .reader(itemReader())
            .processor(itemProcessor())
            .writer(itemWriter())
            .faultTolerant()
            .retry(Exception.class) // 실패 시 재시도
            .retryLimit(3) // 최대 3번 재시도
            .skip(Exception.class) // 특정 예외 발생 시 스킵
            .skipLimit(2) // 최대 2개 데이터 스킵 가능
            .build();
}

 

⚡ 5. 배치 스케줄링 (자동 실행)

Spring Batch는 스케줄링을 통해 주기적으로 실행 가능합니다.

 

⚙️ 1) Spring Scheduler 사용

@Component
public class BatchScheduler {
    private final JobLauncher jobLauncher;
    private final Job sampleJob;

    @Scheduled(cron = "0 0 2 * * ?") // 매일 새벽 2시에 실행
    public void runJob() throws Exception {
        jobLauncher.run(sampleJob, new JobParameters());
    }
}

 

⚙️ 2) Kubernetes CronJob 사용

apiVersion: batch/v1
kind: CronJob
metadata:
  name: spring-batch-job
spec:
  schedule: "0 2 * * *"  # 매일 새벽 2시 실행
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: batch-job
              image: my-batch-app
          restartPolicy: OnFailure

 

⚡ 결론

Spring Batch는 대량 데이터 처리에 특화된 프레임워크

Job → Step → Tasklet(ItemReader, Processor, Writer) 구조를 가짐

스케줄링을 통해 주기적으로 실행 가능하며, 트랜잭션, 재시도, 실패 처리 등 다양한 기능 제공

 

🚀 배치 작업을 최적화하고 싶다면 Spring Batch를 활용하면 효율적!

 

 

 

 

출처 : ChatGPT

 

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] Spring AI  (0) 2025.03.13
[Spring Boot] DispatcherServlet  (0) 2025.03.07
[Spring Boot] 멀티 모듈 프로젝트  (0) 2025.02.26
[Spring Boot] @TestMethodOrder  (0) 2025.02.25
[Spring Boot, JPA] 리플렉션  (0) 2025.02.23