⚡ 1. 스프링 배치(Spring Batch)란?
Spring Batch는 대량의 데이터를 일정한 주기로 처리하는 배치 작업을 수행하는 프레임워크입니다.
스프링 기반으로 배치 처리 자동화 및 최적화를 지원하며, 데이터 읽기(Read) → 처리(Process) → 저장(Write) 의 흐름을 기본으로 합니다.
✅ Spring Batch 주요 특징
🔹 대량 데이터 처리 최적화 → 데이터베이스, 파일, API에서 데이터를 읽고 처리 후 저장 가능
🔹 트랜잭션 관리 → 장애 발생 시 재시도(Retry), 롤백(Rollback), 체크포인트(Checkpoint) 지원
🔹 스케줄링 연동 → Spring Scheduler, Quartz, Kubernetes CronJob과 연동 가능
🔹 병렬 처리 지원 → 멀티스레드, 분산 처리로 성능 최적화 가능
🔹 대량 처리 시 성능 보장 → 청크(Chunk) 기반의 처리 방식 사용
⚡ 2. 스프링 배치 기본 개념
Spring Batch는 크게 Job → Step → Tasklet(ItemReader, ItemProcessor, ItemWriter) 구조로 이루어집니다.
🏗 Spring Batch 기본 구조
+----------------------+
| Job | <- 하나의 배치 작업 단위
+----------------------+
|
↓
+----------------------+
| Step | <- 개별 처리 단계
+----------------------+
|
↓
+----------------------+ +----------------------+ +----------------------+
| ItemReader | → | ItemProcessor | → | ItemWriter |
+----------------------+ +----------------------+ +----------------------+
⚙️ 핵심 개념
개념 | 설명 |
Job | 배치 작업의 실행 단위 (하나의 배치 Job은 여러 Step을 포함) |
Step | 배치 Job의 내부 처리 단위 (읽기-처리-쓰기 포함) |
ItemReader | 데이터 소스(DB, 파일, API)에서 데이터를 읽음 |
ItemProcessor | 데이터를 가공 및 변환 |
ItemWriter | 가공된 데이터를 저장(DB, 파일, 메시지 큐 등) |
⚡ 3. 스프링 배치 설정 및 예제
Spring Boot 프로젝트에서 Spring Batch를 설정하고 실행하는 방법을 알아봅시다.
⚙️ 1) Spring Batch 의존성 추가 (build.gradle)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.h2database:h2' // 테스트용 DB
}
• spring-boot-starter-batch를 추가하면 배치 기능을 사용할 수 있습니다.
⚙️ 2) 배치 Job 설정 (BatchConfig.java)
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Bean
public Job sampleJob(JobRepository jobRepository, Step sampleStep) {
return new JobBuilder("sampleJob", jobRepository)
.start(sampleStep)
.build();
}
@Bean
public Step sampleStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("sampleStep", jobRepository)
.<String, String>chunk(10, transactionManager)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build();
}
@Bean
public ItemReader<String> itemReader() {
return new ListItemReader<>(List.of("Apple", "Banana", "Cherry"));
}
@Bean
public ItemProcessor<String, String> itemProcessor() {
return item -> item.toUpperCase(); // 데이터를 대문자로 변환
}
@Bean
public ItemWriter<String> itemWriter() {
return items -> items.forEach(System.out::println); // 콘솔 출력
}
}
📝 실행 흐름:
1️⃣ itemReader() → "Apple", "Banana", "Cherry" 데이터 읽기
2️⃣ itemProcessor() → 데이터를 대문자로 변환 (APPLE, BANANA, CHERRY)
3️⃣ itemWriter() → 변환된 데이터를 콘솔에 출력
🖥 실행 결과:
APPLE
BANANA
CHERRY
⚙️ 3) 배치 Job 실행 방법
1️⃣ Spring Boot 애플리케이션 실행 시 자동 실행
• Spring Boot를 실행하면 sampleJob이 자동 실행됩니다.
2️⃣ 커맨드라인에서 직접 실행 (CommandLineJobRunner)
java -jar my-batch-app.jar --spring.batch.job.names=sampleJob
• 특정 Job을 실행하려면 --spring.batch.job.names 옵션을 사용하면 됩니다.
⚡ 4. 스프링 배치 심화 기능
⚙️ 1) DB에서 데이터를 읽고 가공하여 저장하기
• 데이터 읽기(ItemReader) → 변환(ItemProcessor) → 저장(ItemWriter)
1️⃣ 데이터 읽기 (JPA 기반 ItemReader)
@Bean
public JpaPagingItemReader<User> itemReader(EntityManagerFactory entityManagerFactory) {
return new JpaPagingItemReaderBuilder<User>()
.name("userItemReader")
.entityManagerFactory(entityManagerFactory)
.queryString("SELECT u FROM User u")
.pageSize(10)
.build();
}
2️⃣ 데이터 변환 (ItemProcessor)
@Bean
public ItemProcessor<User, UserDto> itemProcessor() {
return user -> new UserDto(user.getId(), user.getName().toUpperCase());
}
3️⃣ 데이터 저장 (JPA 기반 ItemWriter)
@Bean
public JpaItemWriter<UserDto> itemWriter(EntityManagerFactory entityManagerFactory) {
return new JpaItemWriterBuilder<UserDto>()
.entityManagerFactory(entityManagerFactory)
.build();
}
⚙️ 2) 배치 Job 재시도 및 실패 처리
• Step이 실패할 경우 재시도(Retry) 가능
• 지정된 횟수만큼 실행 후 실패하면 Job 종료
• 예외가 발생했을 때 스킵(Skip) 가능
@Bean
public Step sampleStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("sampleStep", jobRepository)
.<String, String>chunk(10, transactionManager)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.faultTolerant()
.retry(Exception.class) // 실패 시 재시도
.retryLimit(3) // 최대 3번 재시도
.skip(Exception.class) // 특정 예외 발생 시 스킵
.skipLimit(2) // 최대 2개 데이터 스킵 가능
.build();
}
⚡ 5. 배치 스케줄링 (자동 실행)
Spring Batch는 스케줄링을 통해 주기적으로 실행 가능합니다.
⚙️ 1) Spring Scheduler 사용
@Component
public class BatchScheduler {
private final JobLauncher jobLauncher;
private final Job sampleJob;
@Scheduled(cron = "0 0 2 * * ?") // 매일 새벽 2시에 실행
public void runJob() throws Exception {
jobLauncher.run(sampleJob, new JobParameters());
}
}
⚙️ 2) Kubernetes CronJob 사용
apiVersion: batch/v1
kind: CronJob
metadata:
name: spring-batch-job
spec:
schedule: "0 2 * * *" # 매일 새벽 2시 실행
jobTemplate:
spec:
template:
spec:
containers:
- name: batch-job
image: my-batch-app
restartPolicy: OnFailure
⚡ 결론
• Spring Batch는 대량 데이터 처리에 특화된 프레임워크
• Job → Step → Tasklet(ItemReader, Processor, Writer) 구조를 가짐
• 스케줄링을 통해 주기적으로 실행 가능하며, 트랜잭션, 재시도, 실패 처리 등 다양한 기능 제공
🚀 배치 작업을 최적화하고 싶다면 Spring Batch를 활용하면 효율적!
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring AI (0) | 2025.03.13 |
---|---|
[Spring Boot] DispatcherServlet (0) | 2025.03.07 |
[Spring Boot] 멀티 모듈 프로젝트 (0) | 2025.02.26 |
[Spring Boot] @TestMethodOrder (0) | 2025.02.25 |
[Spring Boot, JPA] 리플렉션 (0) | 2025.02.23 |