본문 바로가기
Java | spring/Spring

스케줄링 보다는 Spring Batch! 기본개념

by 워니 wony 2025. 8. 23.

배치는 생각보다 장점이 많은데, 기존에 작업되어 있던 부분을 개선할 생각을 못했을까? 라는 의문이 들어서 다시 공부해 보았다.

주기적으로 통계, 결산, 마감 같은 처리 작업이나 대량 데이터를 일괄 처리하는 작업을 하고 있거나, 할 예정이라면!

스프링 배치를 제대로 공부해 보고 적용해 보는 것도 아주 좋은 선택이다.

 

 

 

배치 프로세싱이란?

대량 데이터를 일괄 처리하는 방식으로 주기적이거나 조건에 따라 한번에 여러 작업을 처리하는 것을 말한다.

  • 특징
    • 실시간 처리가 필요 없는 작업에 적합
    • 빠른 응답성보다는 안정성과 대량 처리 효율에 초점
  • 주요 사용 사례
    • 금융 시스템 일괄 / 월간 결산
    • 근태 시스템 업무 마감 처리
    • 통계 데이터 생성(월간, 연간 등)
    • 대량 데이터 마이그레이션

스케줄링 vs 배치

구분 스프링 스케줄링 (Spring Scheduling) 스프링 배치 (Spring Batch)
목적 단순히 주기적 작업 실행 대량 데이터 일괄 처리, 상태 관리
데이터 처리 소규모, 간단한 작업에 적합 대규모 데이터 처리, 청크 단위 트랜잭션
트랜잭션 관리 기본적으로 없음 청크 단위 트랜잭션, 롤백 가능
실패 복구 직접 로직 작성 필요 JobRepository 통해 재시작/재처리 가능
구성 @Scheduled 어노테이션만으로 가능 Job, Step, Reader/Processor/Writer 등 구성 필요
장점 간단, 빠르게 구현 안정성, 재시작 가능, 대량 처리에 강점

Spring Batch

스프링 배치는 스프링 프레임워크의 일부로 대규모 데이터 처리와 복잡한 배치 작업을 지원하는 오픈 소스 프레임워크이다.

기능으로는 배치 작업의 구성, 실행, 관리 등이 있어서 대량 데이터를 효율적으로 처리 할 수 있다.

 

 

주요 특징 및 장점은 아래와 같다.

  • 트랜잭션 관리
    • 청크는 설정한 건수 단위(예: 10건, 100건) 로 데이터를 읽고, 처리하고, 쓰기를 하나의 트랜잭션으로 묶어 관리
    • 에러가 발생한 부분만 롤백 하고, 그 외 나머지는 정상 처리됨
  • 체크포인트 설정
    • 배치 작업 중간에 체크 포인트 설정을 해서 배치 작업이 중간에 중단 되더라도 이전 체크포인트 부터 다시 시작할 수 있음
  • 에러 재시도
    • 일시적인 오류 발생 시 설정된 횟수 만큼 자동으로 재시도 가능
    • 네트워크 장애나 외부 서비스 호출이 일시적으로 오류가 나는 경우 재시도 해서 안정성을 높일 수 있음
  • 대량 데이터 처리에 적합
    • 청크 단위 트랜잭션 처리로 안정성 및 메모리 효율 확보
  • 유연한 구성
    • Java Config / XML 지원, DI 기반 컴포넌트 조립 가능
  • 작업 관리 용이
    • Job 실행 이력 및 상태 관리 → 성공/실패/재실행 가능

Spring Batch 아키텍처

Spring Batch는 크게 다섯 가지 주요 구성 요소로 이루어진다.

  • Job
  • Step
  • Job Repository
  • Job Launcher
  • Job Configuration

Job

배치 처리 기본 단위로, 여러 Step 묶어서 하나의 작업 흐름을 정의한다. 예를 들어 DB에서 데이터를 읽고 → 가공 및 처리 → 다시 DB에 저장하는 전체 과정을 하나의 Job으로 정의할 수 있다.

 

Step

Job 내부의 세부 작업 단위로, 특정 데이터를 읽고, 처리하고 쓰는 과정을 말한다. 하나의 Job은 여러 개의 Step을 가질 수 있다.

  • Step 구성 방법
    • 청크 기반 처리:
      • 데이터를 개발자가 설정한 건수 단위(예: 10개)로 읽고 → 처리 → 쓰기를 반복
      • 하나의 청크가 정상 처리되면 트랜잭션이 커밋되고, 오류 발생 시 해당 청크 단위로 롤백된다
    • Tasklet 기반 처리:
      • 단일 작업 수행 방식
      • 간단한 작업에 적합하며, 각 Step 실행 완료 후 다음 Step으로 진행

 

Job Repository

Job과 Step의 실행 상태 및 메타데이터를 관리하는 저장소이다.

각 Job의 성공, 실패여부, Step의 실행 상태, 오류 발생 지점등이 기록된다.

만약 Job 실행 중 중단 되어 다시 시작해야 하는 경우, Job Repository 참조하여 해당 Job 이전 상태로 복구가 가능하다.

 

Job Launcher

Job을 실행하는 진입점으로 외부 이벤트나 스케줄링 시스템에서 트리거해서 실행한다. 예를 들어 특정 시간에 자동으로 Job 시작되도록 스케줄러와 연동 가능할 수 있다.

 

Job Configuration

Java Config 또는 XML 설정 기반으로 Job과 Step 정의하는 영역이다. 스프링의 DI 활용하여 설정 가능하며, 설정한 객체 간의 연결을 자동으로 구성하고, 필요한 파라미터 전달 가능하다.

Job Configuration를 통해서 Job, Step의 흐름을 설정해서 특정 Step 실행 조건이나 순서를 쉽게 조절 가능하다.

 


Spring Batch 작업 흐름

읽기 (Read) → 처리 (Process) → 쓰기 (Write) → 청크 단위 트랜잭션 처리 → 커밋/롤백

 

읽기 Read

다양한 데이터 소스에서 데이터를 읽어오는 것을 말한다. DB 말고도 파일, API 응답 결과 등도 포함 될 수 있다.

예) CSV 파일에 있는 사원 데이터를 읽어서 DB에 저장하는 작업

 

처리 Process

데이터 계산, 변환, 가공 등 필요한 비즈니스 로직에 맞춰서 데이터를 처리하는 것을 말한다. 데이터를 가공, 변환해서 다음 단계인 쓰기에서 편한 형식으로 준비하는 과정이다.

예) API로 응답 받은 데이터를 저장하기 좋은 객체로 변환

 

쓰기 Write

처리된 데이터를 지정된 쓰기 작업을 통해 저장하는 과정을 말한다. 다양한 목적에 따라 데이터를 유연하게 다루는 방법 설정이 가능하다.

예) DB에 데이터를 저장하거나 파일로 출력하는 작업

 

청크기반 트랜잭션 처리

스프링 배치는 청크 기반으로 트랜잭션 처리를 진행한다. 100개를 하나의 트랜잭션으로 묶어서 처리하고 커밋하는 형태로 관리한다. 모든 데이터를 한번에 처리하지 않고 청크 크기에 따라 작은 단위로 작업을 반복하여 메모리 부담을 줄이고 안정성을 높일 수 있다.

각 청크에 대한 트랜잭션이 완료되면, 해당 데이터를 커밋하여 영구 저장하고, 오류 발생 시 해당 청크 기준으로 롤백 처리 하여 데이터 일관성을 보장한다.

 


코드 예시

아래는 employee.csv 파일 데이터를 읽어와 가공한 후 DB에 저장하는 간단한 배치 예시이다.

@Configuration
@EnableBatchProcessing
public class EmployeeJobConfig {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    public EmployeeJobConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }

    // Reader: CSV 파일에서 데이터 읽기
    @Bean
    public FlatFileItemReader<Employee> employeeReader() {
        return new FlatFileItemReaderBuilder<Employee>()
                .name("employeeReader")
                .resource(new ClassPathResource("employee.csv"))
                .delimited()
                .names("id", "name", "department")
                .targetType(Employee.class)
                .build();
    }

    // Processor: 데이터 변환/가공
    @Bean
    public ItemProcessor<Employee, Employee> employeeProcessor() {
        return employee -> {
            employee.setName(employee.getName().toUpperCase()); // 예: 이름을 대문자로 변환
            return employee;
        };
    }

    // Writer: DB 저장
    @Bean
    public JdbcBatchItemWriter<Employee> employeeWriter(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Employee>()
                .sql("INSERT INTO employee (id, name, department) VALUES (:id, :name, :department)")
                .dataSource(dataSource)
                .beanMapped()
                .build();
    }

    // Step 구성
    @Bean
    public Step employeeStep() {
        return stepBuilderFactory.get("employeeStep")
                .<Employee, Employee>chunk(10) // 청크 단위 10개씩 처리
                .reader(employeeReader())
                .processor(employeeProcessor())
                .writer(employeeWriter(null)) // DataSource는 @Autowired로 주입 가능
                .build();
    }

    // Job 구성
    @Bean
    public Job employeeJob() {
        return jobBuilderFactory.get("employeeJob")
                .start(employeeStep())
                .build();
    }
}

 

위 코드의 FLOW 다이어그램은 아래와 같다.

   [employeeJob]
        |
        v
   [employeeStep]
        |
        |--- Chunk(10) 반복 ---
        |
        v
   [Reader] --> [Processor] --> [Writer] --> [Commit]
  1. Job (employeeJob)
    • 시작점: employeeJob 실행
  2. Step (employeeStep)
    • Chunk 단위(10) 로 실행
    • 각 Chunk마다 흐름 반복 (읽기 → 처리 → 쓰기 → 커밋)
    • Reader (employeeReader)
      • CSV 파일(employee.csv)에서 데이터 읽기
    • Processor (employeeProcessor)
      • 이름을 대문자로 변환 (ex. "kim" → "KIM")
    • Writer (employeeWriter)
      • DB에 INSERT (employee 테이블 저장)
    • Commit
      • 10건 단위로 트랜잭션 커밋

 


Spring Batch 주요 3단계

1. Job Configuration

스프링 배치 작업 구성 단계이다.

  • 배치 작업은 Job → Step 으로 구성됨
  • Java Config 기반으로 Job/Step 정의 (JobBuilder, StepBuilder 활용)
  • 각 Step 내부에서 Reader, Processor, Writer 등을 설정

 

2. Execution Flow

실제 Job이 실행되는 흐름을 보여주는 단계이다.

  • Job 실행은 JobLauncher를 통해 시작됨
  • Step은 기본적으로 순차 실행되지만 아래 작업 등을 통해 유연한 실행 흐름 설계 가능
    • 조건부 분기(Flow)
    • 병렬 실행(Parallel Step, Partitioning)

 

3. Data Processing

스프링 배치 작업에서 데이터가 실제로 처리되는 단계이다.

  • Step 내부 데이터 처리 흐름: ItemReader → ItemProcessor → ItemWriter
  • 기본 처리 방식은 Chunk-Oriented Processing
    • 청크(Chunk): 설정한 개수만큼의 아이템 묶음 (예: 10개씩 처리)
    • 한 청크 단위로 트랜잭션 커밋
    • 실패 시 해당 청크만 롤백되어 재처리 가능
반응형

댓글