본문 바로가기
Spring

Spring Batch (스프링 배치) 정리

by SuldenLion 2025. 6. 15.
반응형

 

ㅇ Spring Batch 란?

- 대용량 데이터 처리에 특화된 배치 처리 오픈 소스 프레임워크

- 대량의 레코드를 처리하는데 필수적인 재사용 가능한 기능과 신뢰성있게 수행하기 위한 다양한 기능 제공

  > 로깅/추적(로그 및 상태 저장), 병렬 처리 및 청크 기반 처리, 스케줄링 연동 용이(Spring scheduler, Quartz 등), 트랜잭션 관리, Job 처리 통계, Job 작업 중단/재시작, 스킵 및 자원 관리, 최적화 및 파티셔닝, 초고용량 및 고성능 배치 기술 등

- 보통 다음의 과정을 포함함 :

  > 데이터 읽기 (Read)

  > 데이터 처리 (Process)

  > 데이터 쓰기 (Write)

 

ㅇ Spring Batch 구성 요소
① Job 

    - 배치 처리 단위의 최상위 개념

    - 여러 Step으로 구성됨

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

 

 

② Step

     - Job을 구성하는 하나의 처리 단계

     - ItemReader, ItemProcess, ItemWriter를 포함

@Bean
public Step sampleStep(StepBuilderFactory stepBuilderFactory,
                       ItemReader<MyData> reader,
                       ItemProcessor<MyData, MyData> processor,
                       ItemWriter<MyData> writer) {
    return stepBuilderFactory.get("sampleStep")
        .<MyData, MyData>chunk(100) // 청크 단위 처리
        .reader(reader)
        .processor(processor)
        .writer(writer)
        .build();
}

- 청크(Chunk) : 대량의 데이터를 일정한 단위로 나누어 처리하는 방식

   > chunk(100)은 ItemReader가 100개 데이터를 읽고, ItemProcessor가 그 100개를 가공하고, ItemWriter가 100개 데이터를 한 번에 기록함.

   > 하나의 묶음(chunk)을 기준으로 트랜잭션이 관리됨

   > 너무 큰 청크: 메모리 부담 + 처리 실패 시 재시도 비용 큼

   > 너무 작은 청크: 성능 저하 (I/O 횟수 많아짐)

 

 

③ ItemReader

     - 데이터를 읽어오는 컴포넌트 (DB, CSV, API 등)

@Bean
public FlatFileItemReader<MyData> reader() {
    FlatFileItemReader<MyData> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("data.csv"));
    reader.setLineMapper(new DefaultLineMapper<>() {
        {
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames("id", "name", "value");
            }});
            setFieldSetMapper(fieldSet -> new MyData(
                fieldSet.readLong("id"),
                fieldSet.readString("name"),
                fieldSet.readInt("value")
            ));
        }
    });
    return reader;
}

 

 

④ ItemProcessor

     - 읽은 데이터를 가공하는 단계 (optional)

@Bean
public ItemProcessor<MyData, MyData> processor() {
    return item -> {
        item.setValue(item.getValue() * 2); // 예: 값 2배로 변경
        return item;
    };
}

 

 

⑤ ItemWriter

     - 처리된 데이터를 저장하는 단계

@Bean
public JdbcBatchItemWriter<MyData> writer(DataSource dataSource) {
    JdbcBatchItemWriter<MyData> writer = new JdbcBatchItemWriter<>();
    writer.setDataSource(dataSource);
    writer.setSql("INSERT INTO my_table (id, name, value) VALUES (:id, :name, :value)");
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
    return writer;
}

 

 

ㅇ 스프링 부트에서의 배치 설정

1. spring-boot-starter-batch 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

 

2. application.yml 수정

spring:
  batch:
    job:
      enabled: false # 자동 실행 비활성화 (원할 때만 수동 실행)
    jdbc:
      initialize-schema: always

 

 

ㅇ 실행 방식

- 기본적으로 CommandLineRunner나 ApplicationRunner를 이용해 수동으로 Job 실행 가능

@Component
public class BatchJobRunner implements CommandLineRunner {
    private final JobLauncher jobLauncher;
    private final Job sampleJob;

    public BatchJobRunner(JobLauncher jobLauncher, Job sampleJob) {
        this.jobLauncher = jobLauncher;
        this.sampleJob = sampleJob;
    }

    @Override
    public void run(String... args) throws Exception {
        JobParameters params = new JobParametersBuilder()
            .addLong("time", System.currentTimeMillis())
            .toJobParameters();
        jobLauncher.run(sampleJob, params);
    }
}

 

 

ㅇ Spring Batch의 메타 테이블

- Job/Step의 실행 이력 및 상태를 추적하기 위해 내부적으로 아래의 테이블들 사용함

  > BATCH_JOB_INSTANCE

  > BATCH_JOB_EXECUTION

  > BATCH_JOB_EXECUTION_PARAMS

  > BATCH_STEP_EXECUTION

  > BATCH_STEP_EXECUTION_CONTEXT

- "initialize-schema: always" 설정 시, 위 테이블들 자동 생성 가능

 

 

ㅇ 예외 처리 및 재시작

- Step 실패시 Job 전체 실패

- 재시작 가능 (JobRepository에서 상태 확인)

- skip, retry 정책 설정 가능

.step("stepName")
    .<Input, Output>chunk(100)
    .reader(reader())
    .processor(processor())
    .writer(writer())
    .faultTolerant()
    .skip(MyException.class)
    .skipLimit(10)
    .retry(AnotherException.class)
    .retryLimit(3)

 

 

ㅇ 병렬 처리

- 대용량 데이터를 빠르게 처리하기 위해 여러 쓰레드 또는 프로세스를 활용하는 기법 

1. Multi-threaded Step:

    - 단일 Step 내에서 TaskExecutor를 사용해 병렬처리

2. Partitioning:

    - Partitioner로 데이터를 나누고, 동일 Step을 병렬로 실행

3. Remote Chunking:

    - Master가 read/process 후, Worker가 write 수행 (Spring Integration 또는 Kafka 등 사용)

4. Remote Partitioning:

    - Partitioning을 네트워크 기반 분산 환경에서 실행하는 구조

5. Parallel Steps:

    - 여러 Steps를 동시에 실행하여 처리 속도를 높이는 방법 (서로 의존성이 없는 Step인 경우)

 

 

ㅇ Scheduler

- Spring Boot + Spring Batch는 @Scheduled 어노테이션을 사용하여 배치 Job을 정기적으로 실행할 수 있음

@Scheduled(cron = "0 0 * * * *") // 매 정각마다 실행
public void launchJob() throws Exception {
    JobParameters params = new JobParametersBuilder()
        .addLong("time", System.currentTimeMillis())
        .toJobParameters();
    jobLauncher.run(sampleJob, params);
}

 

 

ㅇ Spring Batch 핵심 정리

 

  • 재시작 가능성
  • 상태 기반 관리
  • 예외 내성(Fault Tolerance)
  • 병렬 처리
  • 운영성
  • JobRepository 기반 상태 관리
  • Chunk 단위 트랜잭션 처리
  • ExecutionContext로 상태 저장/복구
  • 재실행 불가 방지 → JobParameter 관리
  • 병렬 처리 방식 다양
  • 스코프 및 리스너 전략
  • 에러 처리(Fault Tolerant) 설계

 

반응형

댓글