ㅇ 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) 설계
'Spring' 카테고리의 다른 글
FeignClient 정리 (2) | 2025.05.21 |
---|---|
스프링 & 스프링 Web MVC 주요 개념 (0) | 2024.06.23 |
서블릿 API 필수적 개념 (세션, 쿠키, 필터, 리스너) (0) | 2023.09.17 |
Spring Tiles (스프링 타일즈) (0) | 2023.07.25 |
웹 페이지 파일(이미지) 업로드 & 페이지네이션 (0) | 2023.07.24 |
댓글