Spring Batch는 대량의 데이터를 효율적으로 처리하는 배치(일괄) 처리 프레임워크입니다.
스프링 기반 애플리케이션에서 대량 데이터 처리, 반복 작업 자동화, 트랜잭션 관리 등을 쉽게 구현할 수 있도록 지원합니다.
✅ 대량 데이터 처리 → 대용량 파일, 데이터베이스 작업 등을 효율적으로 처리
✅ 일괄 처리(Batch Processing) → 특정 시간대에 정해진 작업을 수행
✅ 트랜잭션 관리 → 처리 단위(Chunk)별로 트랜잭션 적용 가능
✅ 재시도(Retry) & 오류 처리(Skip) → 실패한 작업을 재시도하거나 건너뛸 수 있음
✅ 병렬 & 분산 처리 지원 → 성능 최적화 가능
Spring Batch는 Job(작업) → Step(단계) → Tasklet/Chunk(처리 단위) 로 구성됩니다.
구성 요소 | 설명 |
---|---|
Job | 하나 이상의 Step으로 이루어진 배치 작업 단위 |
Step | 실제로 실행되는 개별 작업 (ItemReader, ItemProcessor, ItemWriter 포함) |
JobLauncher | Job을 실행하는 역할 |
JobRepository | Job 실행 정보를 저장하고 관리 (DB 기반) |
Tasklet | 간단한 작업을 수행하는 Step 방식 |
Chunk | 데이터를 여러 개의 작은 단위(Chunk)로 나누어 처리하는 방식 |
ItemReader | 데이터를 읽어오는 역할 (DB, 파일, API 등) |
ItemProcessor | 데이터를 가공 및 변환하는 역할 |
ItemWriter | 데이터를 저장(쓰기)하는 역할 (DB, 파일, 메시지 큐 등) |
1️⃣ Job 실행 →
2️⃣ Step 실행 (Tasklet or Chunk 방식) →
3️⃣ ItemReader가 데이터 읽기 →
4️⃣ ItemProcessor가 데이터 가공 →
5️⃣ ItemWriter가 데이터 저장
6️⃣ Job 완료
📌 Chunk 기반 처리 흐름
Step 실행 → Chunk 단위로 데이터 읽기 → 처리 → 저장 → 반복 → 완료
예를 들어 1000개의 데이터를 처리할 때 Chunk 크기를 100
으로 설정하면:
100개씩 읽고 → 처리 → 저장 → 반복
하여 10번 수행 후 작업 완료✅ Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
✅ Gradle
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
@Configuration
@EnableBatchProcessing // Spring Batch 활성화
public class BatchConfig {
@Bean
public Job myJob(JobBuilderFactory jobBuilderFactory, Step myStep) {
return jobBuilderFactory.get("myJob")
.start(myStep) // Step 실행
.build();
}
@Bean
public Step myStep(StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get("myStep")
.tasklet((contribution, chunkContext) -> {
System.out.println("Spring Batch 실행 완료!");
return RepeatStatus.FINISHED;
})
.build();
}
}
✅ @EnableBatchProcessing
→ Spring Batch 활성화
✅ Job
→ 하나 이상의 Step
실행
✅ Step
→ Tasklet
을 사용하여 간단한 작업 수행
📌 실행하면 콘솔 출력:
Spring Batch 실행 완료!
아래 예제는 CSV 파일을 읽고 → 대문자로 변환 → 데이터베이스에 저장하는 배치 프로그램입니다.
@Bean
public FlatFileItemReader<String> reader() {
return new FlatFileItemReaderBuilder<String>()
.name("csvReader")
.resource(new ClassPathResource("data.csv"))
.lineMapper(new DefaultLineMapper<>())
.build();
}
@Bean
public ItemProcessor<String, String> processor() {
return item -> item.toUpperCase(); // 데이터를 대문자로 변환
}
@Bean
public JdbcBatchItemWriter<String> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<String>()
.dataSource(dataSource)
.sql("INSERT INTO users (name) VALUES (:name)")
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.build();
}
@Bean
public Step myStep(StepBuilderFactory stepBuilderFactory,
ItemReader<String> reader,
ItemProcessor<String, String> processor,
ItemWriter<String> writer) {
return stepBuilderFactory.get("myStep")
.<String, String>chunk(10) // Chunk 크기 설정
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
✅ Chunk(10) → 10개씩 읽고, 변환 후 저장
✅ ItemReader
→ CSV 파일 읽기
✅ ItemProcessor
→ 데이터 변환
✅ ItemWriter
→ DB 저장
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job myJob;
public void runBatchJob() throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis()) // 중복 실행 방지
.toJobParameters();
jobLauncher.run(myJob, jobParameters);
}
$ mvn spring-boot:run
기능 | 설명 |
---|---|
재시도(Retry) | 특정 예외 발생 시 재시도 (RetryPolicy ) |
건너뛰기(Skip) | 특정 예외 발생 시 데이터 건너뛰기 (SkipPolicy ) |
병렬 실행 | 멀티 스레드로 Step 실행 (TaskExecutor ) |
JobParameter | 실행 시 동적 파라미터 전달 가능 |
Step 분할(Partitioning) | 데이터를 여러 Step으로 분산 처리 |
✅ Spring Batch는 대량 데이터 처리 및 자동화된 배치 작업을 지원
✅ Step 기반 처리로 Tasklet
(단순 작업) 또는 Chunk
(대량 데이터 처리) 방식 사용
✅ ItemReader → ItemProcessor → ItemWriter 패턴으로 대량 데이터 처리 가능
✅ 트랜잭션, 오류 처리, 재시도 등 다양한 기능 제공
✅ 파일 읽기, 데이터 변환, DB 저장, 병렬 처리 등 다양한 시나리오에서 활용
추가 학습 자료