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 하고 재처리할 수 있으므로, 전체 작업의 성공률을 높이면서도 성능 저하를 최소화 할 수 있습니다.
재사용성
- 표준화된 구성 요소
- Spring Batch는 'ItemReader', 'ItemProcessor', 'ItemWriter'와 같은 표준화된 인터페이스를 제공합니다.
- 이 인터페이스를 구현하는 클래스는 다양한 배치 작업에서 재사용 될 수 있으며, 이를 통해 개발자는 반복적인 코드 작성을 피하고, 일관된 방식으로 데이터를 읽고, 처리하며, 쓸 수 있습니다.
- 높은 수준의 추상화
- 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();
}
-> 결론
- 동작 방식
i) 작업 중단
- 배치 작업 실행 중 에러가 발생허가너, 어떤 이유로 중단되면,
JobRepository
는 현재 까지의 실행 상태(성공한 Step, 실패한 지점 등)를 저장합니다.
ii) 재시작 가능 여부 확인
restartable(true)
설정이 있는 작업이 중단되었을 경우, 이 작업은 재시작 할 수 있는 상태로 표시됩니다.- 이 설정이
false
인 경우, 작업은 재시작할 수 없습니다.
iii) 수동 재시작
- 중단된 작업을 재시작하려면, 개발자나 운영자는 Spring Batch의 관리 도구, 스크립트, API 등을 사용하여 해당 작업을 명시적으로 재시작해야 합니다.
- 이 때,
JobParameters
가 동일하면 Spring Batch는JobRepository
에서 중단된 지점을 찾아 그 지점부터 처리를 재개합니다.
- 재시작 조건
i) 동일한 JobParameters
- 재시작 시 동일한
JobParameters
를 사용해야 합니다. - 이를 통해 Spring Batch는
JobRepository
에서 해당 작업의 이전 실행을 식별하고, 중단된 지점부터 작업을 재개할 수 있습니다.
ii) JobInstance
와 JobExecution
- Spring Batch는
JobInstance
를JobParameters
로 식별합니다. - 한
JobInstance
는 여러 번의JobExecution
을 가질 수 있으며, 재시작 시 새로운JobExecution
이 생성되어 이전 실행의 중단된 지점부터 처리가 계속됩니다.
- 모니터링 및 관리
- Spring Batch는 배치 처리의 모니터링 및 관리를 위한 도구를 제공합니다.
3-1) Spring Cloud Data Flow
- Spring Cloud Data Flow는 Spring Batch 작업을 포함하여 다양한 데이터 처리 애플리케이션을 모니터링, 관리 및 오케스트레이션할 수 있는 포괄적인 플랫폼을 제공합니다.
- 그래픽 UI 및 CLI를 통한 관리: 작업 실행, 중지, 재시작 및 로그 조회 등을 그래픽 인터페이스 또는 명령줄 인터페이스를 통해 수행할 수 있습니다.
- 실시간 스트림 처리와 배치 처리의 통합: 실시간 데이터 스트림 처리와 배치 작업을 하나의 플랫폼에서 관리할 수 있습니다.
- 마이크로서비스 기반 배치 작업: 독립적으로 배포 가능한 마이크로서비스 형태로 배치 작업을 관리하고 실행할 수 있습니다.
728x90
반응형
'개발 > SpringBatch' 카테고리의 다른 글
Spring Batch에서 JpaPagingItemReader와 JpaCursorItemReader의 이해 (0) | 2024.02.27 |
---|---|
Spring Batch의 핵심: Tasklet과 Chunk 기반 처리 이해하기 (0) | 2024.02.26 |
[Spring Batch] 2. Spring Batch 용어 (0) | 2023.01.17 |
댓글