Spring Boot · 2026-01-26

Spring Boot 배치 처리 설계와 최적화

Spring Boot 환경에서 대용량 배치 작업을 안정적으로 운영하기 위한 설계 원칙과 spring batch 설정 예제, 병렬 처리 및 자원 튜닝 전략을 사례 중심으로 정리한 설계

작성일 : 2026-01-26 ㆍ 작성자 : 관리자
post
목차

소개

배치 처리는 대량 데이터를 안정적으로 처리하는 핵심 기술이다. Spring Boot와 Spring Batch는 배치 개발을 빠르고 일관되게 만든다. 그러나 단순한 구현만으로는 운영 환경에서 요구하는 성능과 안정성을 확보하기 어렵다. 본문에서는 기본 개념부터 설정 예제, 성능 튜닝 방법까지 초보자도 이해할 수 있도록 단계별로 설명한다.

Spring Batch 개요

Spring Batch는 Job, Step, ItemReader, ItemProcessor, ItemWriter로 구성된다. Job은 전체 배치 흐름을 정의하고, Step은 실제 작업 단위를 나타낸다. Chunk 지향 처리는 대량 데이터를 작은 단위로 묶어 트랜잭션 경계를 제어한다. 이 구조는 재시작, 오류 처리, 스케일링에 유리하다.

아키텍처와 설계 원칙

분리와 단순화

읽기, 변환, 쓰기 로직을 분리한다. 역할이 분명하면 테스트와 유지보수가 쉬워진다. 데이터 소스와 트랜잭션 경계는 명확히 정의해야 한다.

작업 단위 설계

Step 크기는 운영 환경에 맞춰 조절한다. 단일 Step이 과도히 큰 책임을 가지면 장애 시 복구가 어렵다. 가능한 한 작은 단위로 구성하되, IO 오버헤드를 고려해 적절한 chunk size를 선택한다.

spring batch 설정 예제

아래는 Spring Boot에서 Java 기반으로 기본 Job과 Step을 구성한 예제다. 핵심은 chunk 사이즈와 트랜잭션 경계 설정이다.

package com.example.batchconfig;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Bean
    public Job sampleJob(JobBuilderFactory jobs, Step sampleStep) {
        return jobs.get("sampleJob").start(sampleStep).build();
    }

    @Bean
    public Step sampleStep(StepBuilderFactory steps,
                           org.springframework.batch.item.ItemReader<String> reader,
                           org.springframework.batch.item.ItemProcessor<String, String> processor,
                           org.springframework.batch.item.ItemWriter<String> writer) {
        return steps.get("sampleStep")
                .<String, String>chunk(100)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }
}

환경 설정 예시

application.yml에서 datasource와 batch 설정을 관리한다. 아래는 기본적인 설정 항목이다.

spring:
  datasource:
    url: jdbc:postgresql://db:5432/mydb
    username: user
    password: pass
  batch:
    initialize-schema: never
    job:
      enabled: false

성능 최적화 전략

Chunk Size 조정

chunk size는 처리량과 메모리 사용량의 균형 지점이다. 작은 값은 트랜잭션 빈도가 높아져 오버헤드가 증가하고, 큰 값은 메모리 사용량과 롤백 부담이 커진다. 일반적으로 IO 바운드 작업은 큰 chunk, CPU 바운드 변환은 작은 chunk가 유리하다.

병렬 처리

멀티스레드 Step, 파티셔닝, 멀티 프로세스 배포 등으로 처리량을 높일 수 있다. 스레드풀을 사용할 때는 데이터 소스와 커넥션 풀이 병렬성을 감당할 수 있는지 확인해야 한다. 파티셔닝은 데이터를 분할해 각 파티션을 독립적으로 실행하므로 확장성이 좋다.

트랜잭션과 DB 튜닝

트랜잭션 격리 수준과 커밋 빈도를 적절히 설정한다. 대량 삽입 시 배치 인서트와 인덱스 비활성화, 적절한 커밋 간격 설정이 성능에 큰 영향을 준다. 또한 데이터베이스 커넥션 풀 크기와 네트워크 대역폭을 고려해 병목을 방지한다.

오류 처리와 재시작

skip과 retry 정책을 통해 부분 실패를 관리한다. 복구 가능한 오류와 데이터 손상 위험을 분리해 정책을 설정한다. 또한 JobRepository와 메타데이터를 통해 재시작 지점을 명확히 관리한다.

모니터링과 운영

모니터링은 성능 유지의 핵심이다. 수행 시간, 처리 건수, 실패율, 스루풋을 수집해 임계치를 설정한다. 로그와 메트릭은 문제 발생 시 원인 파악에 필수적이다. Prometheus, Grafana 같은 툴과 연계하면 실시간 관찰이 가능하다.

권장 구성 요소

  • 커넥션 풀: HikariCP와 같은 경량 풀 사용
  • 메시지 큐: 작업 분배 및 긴 재처리 분리
  • 외부 스토리지: 대용량 파일은 객체 스토리지 사용
  • 배포 자동화: Blue-Green 또는 Canary 적용

결론

Spring Boot 기반의 배치 설계는 명확한 역할 분리와 환경 맞춤 튜닝이 핵심이다. spring batch 설정 예제로 기본 구성을 익히고, chunk size, 병렬 처리, DB 튜닝을 통해 성능을 개선한다. 또한 모니터링과 재시작 전략을 항상 포함해 운영 안정성을 확보한다. 이 원칙을 따르면 spring boot 배치 처리의 안정성과 처리량을 크게 향상시킬 수 있다.

spring batch 설정 예제 spring boot 배치 처리 spring batch 성능 튜닝 Spring Batch 배치 병렬 처리 파티셔닝 chunk size 최적화 배치 모니터링