본문 바로가기
개발/SpringBatch

Spring batch 그게 뭔데?

by 난중후니 2024. 2. 25.
728x90
반응형

Spring batch 가 뭔데?

  • Spring Batch는 대용량 데이터 처리를 위한 애플리케이션을 개발할 수 있도록 지원하는 경량, 포괄적인 배치 프레임워크 입니다.


Spring batch 왜 사용하는데?


1. 대규모 데이터 처리의 효율성

Spring Batch는 대용량 데이터를 효율적으로 처리할 수 있는 설계가 특징입니다.
Chunk 기반 처리 방식을 통해, 데이터를 덩어리(chunk) 단위로 나누어 처리함으로써 메모리 사용량을 최적화하고, 처리 속도를 개선할 수 있습니다.

Chunk 기반 처리 방식 원리

1) 데이터 분할

  • 대규모 데이터 세트를 작은 "Chunk"로 나눕니다.
  • 각 Chunk는 처리할 데이터의 한 묶음을 나타냅니다.
  • 이 크기는 설정 가능하며, 배치 작업의 요구 사항과 시스템의 메모리 제약에 따라 최적화 될 수 있습니다.

2) 순차 처리

  • Chunk 단위로 데이터를 읽고(Reader), 처리(Processor), 쓰기(Writer)의 과정을 순차적으로 수행합니다.
  • 이 과정은 전체 데이터 세트가 처리될 때까지 반복됩니다.
메모리 사용량 최적화

1) 한 번에 작은 데이터만 로딩

  • Chunk 단위로 데이터를 처리함으로써, 한 번에 메모리에 로딩되는 데이터의 양을 제한할 수 있습니다.
  • 이는 전체 데이터 세트를 한 번에 메모리에 로딩하는 것보다 메모리 사용량을 상당히 줄여줍니다.

2) 가비지 컬렉션 최적화

  • 작은 데이터 덩어리를 순차적으로 처리하고 완료된 후에는 메모리에서 해제함으로써, 가비지 컬렉터가 더 효율적으로 작동할 수 있습니다.
  • 이는 메모리 관리를 개선하고, 메모리 누수 가능성을 줄여줍니다.
처리 속도 개선

1) 병렬 처리

  • Chunk 단위로 데이터를 처리하는 것은 병렬 처리를 쉽게 구현할 수 있는 기반을 제공합니다.
  • 각 Chunk를 독립적으로 처리할 수 있으므로, 멀티 스레딩 환경에서 각 Chunk를 병렬로 처리하여 전체 처리 속도를 높일 수 있습니다.

2) 트랜잭션 관리

  • Chunk 단위로 트랜잭션을 관리함으로써, 데이터 처리 과정에서 발생할 수 있는 실패를 효율적으로 관리할 수 있습니다.
  • 실패가 발생하면 해당 Chunk만 rollback 하고 재처리할 수 있으므로, 전체 작업의 성공률을 높이면서도 성능 저하를 최소화 할 수 있습니다.
재사용성
  1. 표준화된 구성 요소
  • Spring Batch는 'ItemReader', 'ItemProcessor', 'ItemWriter'와 같은 표준화된 인터페이스를 제공합니다.
  • 이 인터페이스를 구현하는 클래스는 다양한 배치 작업에서 재사용 될 수 있으며, 이를 통해 개발자는 반복적인 코드 작성을 피하고, 일관된 방식으로 데이터를 읽고, 처리하며, 쓸 수 있습니다.
  1. 높은 수준의 추상화
  • Spring Batch는 배치 작업을 구성하는 데 필요한 고수준의 추상화를 제공합니다.
  • 이는 개발자가 복잡한 로직에 집중할 수 있게 하면서도, 공통 작업(ex: 에러 핸들링, 트랜잭션 관리, 작업실행 및 모니터링 등)은 프레임워크가 처리하도록 합니다.

1) 에러 핸들링(Error Handling)

  • 배치 처리 중 발생할 수 있는 다양한 예외 사항을 적절히 관리학 위해 개발자는 'skip', 'retry', 'backoff' 정책과 같은 에러 핸들링 전략을 구성할 수 있습니다.
  • 이를 통해 일시적인 오류에 대해 자동 재시도를 수행하거나, 특정 조건을 만족하는 오류를 건너뛸 수 있습니다.

1-1) Skip 정책

  • 'skip' 정책을 사용하면 특정 예외가 발생했을 때 해당 항목의 처리를 건너뛸 수 있습니다.
  • 예를 들어, 아래 코드의 CustomSkipException이 발생할 경우 최대 5회까지 해당 항목의 처리를 건너뛰도록 설정합니다.
@Bean
public Step step1(){
    return stepBuilderFactory.get("step1")
            .<InputType, OutputType>chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .faultTolerant()
            .skip(CustomSkipException.class)
            .skipLimit(5)
            .build();
}

1-2) Retry 정책

  • retry 정책을 설정하면 특정 예외가 발생했을 때 작업을 자동으로 재시도 할 수 있습니다.
  • 예를 들어, 아래의 설정은 CustomoRetryException이 발생할 경우 최대 3회까지 재시도하도록 설정합니다.
@Bean
public Step step2(){
    return stepBuilderFactory.get("step2")
            .<InputType, OutputType>chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .faultTolerant()
            .retry(CustomRetryException.class)
            .build();
}

1-3) Backoff 정책

  • backoff 정책은 재시도 사이의 대기 시간을 설정할 수 있습니다.
  • 예를 들어, BackOffPolicy를 사용하여 재시도 사이에 점점 증가하는 대기 시간을 설정할 수 있습니다.
  • 아래는 FixedBackOffPolicy를 사용하는 예시로, 재시도 사이에 고정된 시간(5000ms) 만큼 대기하도록 설정합니다.
@Bean
public Step step3(){
    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
    backOffPolicy.setBackOffPeriod(5000); // 5000ms 대기

    return stepBuilderFactory.get("step3")
            .<InputType, OutputType>chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .faultTolearnt()
            .retry(CustomRetryException.class)
            .retryLimit(3)
            .backOffPolicy(backOffPolicy)
            .build();
}

2. 재사용 가능한 로직

  • 비즈니스 로직을 'ItemProcessor'나 다른 커스텀 컴포넌트로 캡슐화함으로써, 다른 배치 작업에서도 동일한 로직을 재사용할 수 있습니다.
  • 이는 코드의 중복을 줄이고, 애플리케이션의 일관성을 유지하는 데 도움이 됩니다.

ex) 아래는 Spring Batch에서 ItemProcessor를 사용하여 비즈니스 로직을 캡슐화하고, 이를 재사용 가능하게 만드는 간단한 예시 입니다.
데이터 변환 프로세스를 구현하여 입력 데이터를 대문자로 변환하는 ItemProcessor를 만들고, 이를 배치 작업에 적용합니다.

import org.springframework.batch.item.ItemProcessor;

public class CustomItemProcessor implements ItemProcessor<String, String> {

    @Override
    public String process(String item) throws Exception {
        // 비즈니스 로직: 입력된 문자열을 대문자로 변환
        return item.toUpperCase();
    }
}
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.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.List;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

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

    @Bean
    public ItemReader<String> itemReader() {
        return new ListItemReader<>(Arrays.asList("spring", "batch", "example"));
    }

    @Bean
    public CustomItemProcessor processor() {
        return new CustomItemProcessor();
    }

    @Bean
    public ItemWriter<String> itemWriter() {
        return items -> items.forEach(System.out::println); // 출력을 통한 간단한 ItemWriter
    }

    @Bean
    public Step exampleStep() {
        return stepBuilderFactory.get("exampleStep")
                .<String, String>chunk(10) // Chunk 크기 설정
                .reader(itemReader())
                .processor(processor())
                .writer(itemWriter())
                .build();
    }

    @Bean
    public Job exampleJob() {
        return jobBuilderFactory.get("exampleJob")
                .start(exampleStep())
                .build();
    }
}

3. 안정성 및 오류 관리

  • Spring Batch는 실패 관리 기능을 제공하여, 작업 실행 중 발생할 수 있는 다양한 예외 사항을 처리할 수 있습니다.
    예를 들어, 재시도 로직, 건너뛰기 정책, 배치 작업의 중단 및 재시작 지원 등이 있어, 배치 처리의 안정성을 보장합니다.

3-1) 재시도 로직(Retry Logic)

  • Spring Batch는 일시적인 오류가 발생했을 때 해당 작업을 자동으로 재시도할 수 있는 기능을 제공합니다.
  • 예를 들어, 네트워크 장애나 일시적인 데이터베이스 연결 오류와 같이 재시도로 해결될 수 있는 문제에 대응하기 위해 사용됩니다.
  • 개발자는 retry() 메소드를 사용하여 어떤 예외에 대해 재시도할지, 그리고 retryLimit() 메소드로 최대 재시도 횟수를 설정 할 수 있습니다.

3-2) 건너뛰기(Skip Policy)

  • 특정 조건을 만족하는 오류가 발생했을 때, 그 오류를 발생시킨 항목의 처리를 건너뛸 수 있도록 설정할 수 있습니다.
  • 데이터 포맷 오류나 데이터 자체의 문제로 인해 처리할 수 없는 항목들을 건너뛰고, 배치 작업을 계속 진행할 수 있게 합니다.
  • skipLimit()을 설정하여 건너뛸 수 있는 최대 항목 수를 정의하고, skip() 메소드로 어떤 예외를 건너뛸지 지정할 수 있습니다.

3-3) 중단 및 재시작 지원(Stop and Restart Capabilities)

  • Spring Batch는 배치 작업의 실행 중단 및 재시작을 지원합니다.
  • 예를 들어, 처리 중인 데이터에 문제가 발견되어 중단해야 하는 경우, 현재 상태를 저장하고 나중에 중단된 지점부터 재시작할 수 있습니다.
  • 이 기능은 JobRepository를 통해 관리되며, 작업의 상태와 진행 상황을 추적합니다.

a) JobRepository의 역할

  • JobRepository는 Spring Batch의 메타데이터 저장소로, 배치 작업의 실행에 관한 정보(예: 실행 상태, 시작/종료 시간, 성공/실패 여부 등)를 저장합니다.
  • 이 정보를 사용하여 배치 작업의 실행을 관리하며, 특히 중단 및 재시작 기능을 구현하는 데 필수적입니다.

b) 작업 중단

  • 배치 작업을 중단하는 방법은 여러가지가 있지만, 가장 일반적인 방법은 사용자의 요청에 의한 중단이나 예외 발생에 따른 자동 중단입니다.
  • 사용자는 Spring Batch의 관리 도구나 외부 시스템을 통해 실행중인 작업을 중단할 수 있습니다.
  • 또한, 예외 발생 시 JobRepository에 현재 상태가 기록되어, 후속 처리가 가능합니다.

c) 작업 재시작

  • 작업을 재시작할 때, Spring Batch는 JobRepository에 저장된 메타데이터를 조회하여 마지막으로 성공적으로 완료된 지점을 파악합니다.
  • 그런 다음, 해당 지점부터 작업을 재개하여, 이전에 실패한 부분 또는 아직 처리되지 않은 데이터에 대해 처리를 계속합니다.
  • 이 과정은 배치 작업의 일관성과 데이터 무결성을 유지하는 데 중요합니다.

d) 재시작 가능성 관리

  • Spring Batch에서는 작업의 재시작 가능 여부를 세밀하게 제어할 수 있습니다.
  • Job 정의 시 restartable 속성을 통해 특정 작업이 재시작 가능한지 여부를 설정할 수 있으며, 이는 JobRepository에 저장됩니다.
  • 재시작 불가능으로 설정된 작업은 중단된 후 재시작할 수 없습니다.

ex)

@Bean
public Job exampleJob(JobBuilderFactory jobBuilderFactory, Step exampleStep){
    return jobBuilderFactory.get("exampleJob")
            .start(exampleStep)
            .restartable(true) // 이 작업이 재시작 가능하도록 설정
            .build();
}

-> 결론

  1. 동작 방식

i) 작업 중단

  • 배치 작업 실행 중 에러가 발생허가너, 어떤 이유로 중단되면, JobRepository는 현재 까지의 실행 상태(성공한 Step, 실패한 지점 등)를 저장합니다.

ii) 재시작 가능 여부 확인

  • restartable(true) 설정이 있는 작업이 중단되었을 경우, 이 작업은 재시작 할 수 있는 상태로 표시됩니다.
  • 이 설정이 false인 경우, 작업은 재시작할 수 없습니다.

iii) 수동 재시작

  • 중단된 작업을 재시작하려면, 개발자나 운영자는 Spring Batch의 관리 도구, 스크립트, API 등을 사용하여 해당 작업을 명시적으로 재시작해야 합니다.
  • 이 때, JobParameters가 동일하면 Spring Batch는 JobRepository에서 중단된 지점을 찾아 그 지점부터 처리를 재개합니다.
  1. 재시작 조건

i) 동일한 JobParameters

  • 재시작 시 동일한 JobParameters를 사용해야 합니다.
  • 이를 통해 Spring Batch는 JobRepository 에서 해당 작업의 이전 실행을 식별하고, 중단된 지점부터 작업을 재개할 수 있습니다.

ii) JobInstanceJobExecution

  • Spring Batch는 JobInstanceJobParameters로 식별합니다.
  • JobInstance는 여러 번의 JobExecution을 가질 수 있으며, 재시작 시 새로운 JobExecution이 생성되어 이전 실행의 중단된 지점부터 처리가 계속됩니다.
  1. 모니터링 및 관리
  • Spring Batch는 배치 처리의 모니터링 및 관리를 위한 도구를 제공합니다.

3-1) Spring Cloud Data Flow

  • Spring Cloud Data Flow는 Spring Batch 작업을 포함하여 다양한 데이터 처리 애플리케이션을 모니터링, 관리 및 오케스트레이션할 수 있는 포괄적인 플랫폼을 제공합니다.
  • 그래픽 UI 및 CLI를 통한 관리: 작업 실행, 중지, 재시작 및 로그 조회 등을 그래픽 인터페이스 또는 명령줄 인터페이스를 통해 수행할 수 있습니다.
  • 실시간 스트림 처리와 배치 처리의 통합: 실시간 데이터 스트림 처리와 배치 작업을 하나의 플랫폼에서 관리할 수 있습니다.
  • 마이크로서비스 기반 배치 작업: 독립적으로 배포 가능한 마이크로서비스 형태로 배치 작업을 관리하고 실행할 수 있습니다.
728x90
반응형

댓글