2025. 1. 6. 16:47ㆍIT정보/초보자를 위한 IT 팁
대용량 데이터 처리는 많은 애플리케이션에서 중요한 요구사항입니다. Spring Batch는 대용량 데이터 처리에 특화된 프레임워크로, 효율적이고 안정적으로 데이터를 읽고 처리하며 저장하는 기능을 제공합니다. 이번 글에서는 Spring Batch를 활용하여 대용량 데이터를 처리하는 방법과 주요 구성 요소에 대해 알아보겠습니다.
Spring Batch란?
Spring Batch는 배치 작업(Batch Job)을 구현하기 위한 경량화된 프레임워크로, 다음과 같은 특징을 제공합니다.
- 대용량 데이터 처리 : 데이터베이스, 파일 등에서 대량의 데이터를 읽고 변환한 뒤 저장하는 작업을 효율적으로 처리할 수 있습니다.
- 강력한 오류 처리 : 작업 실패 시 롤백, 재시도, 또는 특정 데이터를 건너뛰는 기능을 제공합니다.
- 유연한 설정 : XML 또는 Java 기반의 설정을 통해 배치 작업을 구성할 수 있습니다.
- 확장성 : 분산 처리와 병렬 처리를 지원하여 성능을 극대화할 수 있습니다.
Spring Batch의 주요 구성 요소
Spring Batch는 세 가지 주요 구성 요소로 이루어집니다.
- Job : 하나의 배치 작업 단위입니다. Job은 여러 개의 Step으로 구성됩니다.
- Step : Step은 ItemReader, ItemProcessor, ItemWriter로 이루어진 개별 실행 단위입니다.
- Execution Context : 작업 실행 정보를 관리하여 상태를 추적하고, 재시도 시 이전 상태에서 작업을 이어갈 수 있도록 도와줍니다.
Spring Batch 대용량 처리 구성하기
Spring Batch를 이용한 대용량 처리의 기본적인 단계는 다음과 같습니다.
1. 의존성 추가
Spring Batch를 사용하려면 spring-boot-starter-batch 의존성을 추가해야 합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
2. 데이터 소스 설정
Spring Batch는 기본적으로 임베디드 데이터베이스를 사용하여 메타데이터를 저장합니다. 실제 애플리케이션에서는 데이터베이스를 명시적으로 설정해야 합니다.
application.properties 예시
spring.datasource.url=jdbc:mysql://localhost:3306/spring_batch
spring.datasource.username=root
spring.datasource.password=pass
spring.batch.initialize-schema=always
3. 배치 작업(Job) 구성
Job은 배치 작업의 전반적인 흐름을 정의합니다.
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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 Job exampleJob(Step exampleStep) {
return jobBuilderFactory.get("exampleJob")
.start(exampleStep)
.build();
}
@Bean
public Step exampleStep() {
return stepBuilderFactory.get("exampleStep")
.<String, String>chunk(1000) // 청크 단위로 처리
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build();
}
@Bean
public ItemReader<String> itemReader() {
// 데이터 읽기 로직 구현
return new FlatFileItemReaderBuilder<String>()
.name("fileReader")
.resource(new FileSystemResource("input.csv"))
.delimited()
.names("field1", "field2")
.targetType(String.class)
.build();
}
@Bean
public ItemProcessor<String, String> itemProcessor() {
return item -> item.toUpperCase(); // 데이터 변환 로직
}
@Bean
public ItemWriter<String> itemWriter() {
return items -> items.forEach(System.out::println); // 데이터 쓰기 로직
}
}
4. 실행 및 모니터링
Spring Batch 작업은 스프링 애플리케이션이 시작될 때 실행되며, JobLauncher를 사용하여 프로그램 내에서 실행할 수도 있습니다.
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BatchController {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job exampleJob;
@GetMapping("/start-batch")
public String startBatch() {
try {
JobExecution execution = jobLauncher.run(exampleJob, new JobParameters());
return "배치 작업 실행 완료: " + execution.getStatus();
} catch (Exception e) {
e.printStackTrace();
return "배치 작업 실행 실패: " + e.getMessage();
}
}
}
Spring Batch의 고급 기능
1. 병렬 처리 (Parallel Processing)
Spring Batch는 멀티쓰레드 환경에서 Partitioner 또는 TaskExecutor를 사용하여 병렬로 데이터를 처리할 수 있습니다.
@Bean
public Step parallelStep(TaskExecutor taskExecutor) {
return stepBuilderFactory.get("parallelStep")
.<String, String>chunk(1000)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.taskExecutor(taskExecutor)
.build();
}
@Bean
public TaskExecutor taskExecutor() {
SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
taskExecutor.setConcurrencyLimit(10);
return taskExecutor;
}
2. 재시도 및 건너뛰기
Spring Batch는 특정 오류 발생 시 작업을 재시도하거나, 실패한 데이터를 건너뛰도록 설정할 수 있습니다.
@Bean
public Step retryStep() {
return stepBuilderFactory.get("retryStep")
.<String, String>chunk(1000)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.faultTolerant()
.retryLimit(3)
.retry(Exception.class)
.skipLimit(10)
.skip(Exception.class)
.build();
}
3. 분산 처리 (Remote Chunking)
Spring Batch는 분산 환경에서 대량 데이터를 처리하기 위해 원격 청킹(Remote Chunking)을 지원합니다. 이 기능을 사용하면 데이터를 여러 노드에 분산하여 처리 속도를 극대화할 수 있습니다.
Spring Batch는 대용량 데이터를 안정적이고 효율적으로 처리할 수 있는 강력한 프레임워크로, 다양한 비즈니스 요구사항을 충족시킬 수 있습니다. 기본적인 배치 작업부터 병렬 처리, 재시도 및 건너뛰기, 분산 처리와 같은 고급 기능까지 폭넓게 지원하여 개발자가 유연하게 활용할 수 있습니다.
배치 작업을 설계할 때는 데이터 크기, 실패 처리 전략, 병렬 처리 가능성 등 다양한 요인을 종합적으로 고려해야 하며, 적절한 구성을 통해 최적의 성능과 안정성을 달성할 수 있습니다.
더 자세한 내용은 Spring Batch의 공식 문서와 Spring Batch GitHub를 참고해보세요.
'IT정보 > 초보자를 위한 IT 팁' 카테고리의 다른 글
Spring Boot 프로젝트 (1단계 - 생성 및 환경 설정) (2) | 2025.01.10 |
---|---|
PostgreSQL 기능, 장점 및 설치 가이드 (4) | 2025.01.07 |
꾸준히 사용하는 오라클(Oracle) 함수 정리 (1) | 2025.01.06 |
Spring Boot에서 비동기 처리 (Asynchronous Processing) (2) | 2025.01.03 |
Spring Boot로 구현하는 REST API와 토큰 인증 (2) | 2024.12.31 |