Spring Batch는 대용량 데이터 처리, 스케줄링, 반복 작업을 효율적으로 관리할 수 있는 강력한 프레임워크입니다. 이 글에서는 Spring Batch를 활용해 배치 작업을 설계하는 방법을 단계별로 설명하고, 주요 구성 요소와 사용 예제를 소개합니다.
목차
1. Spring Batch 개요
2. Spring Batch의 핵심 구성 요소
3. 배치 작업 설계 단계
4. 실제 코드 예제
5. Spring Batch의 확장성 및 성능 최적화
6. 결론
1) Spring Batch 개요
Spring Batch는 아래와 같은 시나리오에서 유용합니다.
- 대량의 데이터를 읽고 처리하고 저장하는 작업
- 일정 주기로 반복 수행해야 하는 데이터 작업
- 분산 처리와 병렬 처리가 필요한 경우
Spring Batch는 기존의 Spring 프레임워크와 자연스럽게 통합되며, 선언적 프로그래밍과 다양한 내장 기능을 제공합니다.
2) Spring Batch의 핵심 구성 요소
Spring Batch는 아래 3가지 핵심 구성 요소를 기반으로 설계됩니다.
1. Job
Job은 배치 작업의 최상위 엔티티로 하나 이상의 Step으로 구성됩니다.
2. Step
Step은 독립적인 작업 단위를 나타냅니다. Step은 주로 아래 구성 요소로 이루어집니다.
- ItemReader : 데이터를 읽어오는 컴포넌트
- ItemProcessor : 데이터를 처리하는 컴포넌트
- ItemWriter : 데이터를 저장하는 컴포넌트
3. ExecutionContext
ExecutionContext는 Job 및 Step의 상태를 저장하여 재시작 기능을 지원합니다.
3) 배치 작업 설계 단계
1. 요구사항 정의
배치 작업이 처리할 데이터의 유형, 처리 로직, 입력 및 출력 형식을 정의합니다.
2. Job 설계
Job은 비즈니스 로직의 전반적인 워크플로우를 나타냅니다. 작업 흐름에 따라 여러 Step으로 나뉩니다.
3. Stpe 설계
각 Step에 대해 Reader, Processor, Writer를 정의합니다. 필요에 따라 트랜잭션과 병렬 처리를 구성합니다.
4. 실행 및 스케줄링
Spring Batch는 Quartz, Spring Scheduler 등과 통합해 작업 스케줄링을 지원합니다.
4) 실제 코드 예제
아래는 Spring Batch를 이용해 간단한 파일 데이터를 읽고 처리한 후 결과를 데이터베이스에 저장하는 예제입니다.
1. 의존성 설정
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
2. 설정 클래스
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public FlatFileItemReader<String> itemReader() {
FlatFileItemReader<String> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("input.csv"));
reader.setLineMapper((line, lineNumber) -> line);
return reader;
}
@Bean
public ItemProcessor<String, String> itemProcessor() {
return item -> "Processed: " + item;
}
@Bean
public JdbcBatchItemWriter<String> itemWriter(DataSource dataSource) {
JdbcBatchItemWriter<String> writer = new JdbcBatchItemWriter<>();
writer.setDataSource(dataSource);
writer.setSql("INSERT INTO processed_data (data) VALUES (:data)");
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
return writer;
}
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.<String, String>chunk(10)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter(null))
.build();
}
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step())
.build();
}
}
3. 실행 스케줄
스프링 스케줄링을 통해 작업을 주기적으로 실행할 수 있습니다.
@EnableScheduling
@Configuration
public class SchedulerConfig {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Scheduled(cron = "0 0 * * * ?")
public void performBatchJob() throws Exception {
JobParameters params = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(job, params);
}
}
5) Spring Batch의 확장성 및 성능 최적화
1. 병렬 처리
Spring Batch는 멀티스레드와 분산 처리를 지원해 대규모 작업에 대한 성능을 높일 수 있습니다.
stepBuilderFactory.get("parallelStep")
.<Input, Output>chunk(100)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter(null))
.taskExecutor(new SimpleAsyncTaskExecutor())
.build();
2. 데이터베이스 기반의 상태 관리
ExecutionContext와 JobRespository를 활용해 작업 실패 시 상태를 복구할 수 있습니다.
6) 결론
Spring Batch는 데이터 처리의 효율성과 안정성을 높이는 강력한 프레임워크입니다. 핵심 구성 요소와 설계 패턴을 잘 이해하고 활용하면 다양한 비즈니스 요구사항을 충족할 수 있습니다. 또한, 병렬 처리 및 스케줄링 기능을 통해 확장성과 유연성을 확보할 수 있습니다.
* 참고 자료
- Spring 공식 문서: Spring Batch Documentation
- Apache License 2.0: Spring Batch는 Apache License 2.0 하에 배포됩니다.
'프로그래밍' 카테고리의 다른 글
모바일 앱에서 비콘(Beacon) 기술 활용 (5) | 2025.01.24 |
---|---|
데이터베이스에서 인덱스 설계 팁 (4) | 2025.01.18 |
CSS에서 반응형 웹을 만드는 방법 (2) | 2025.01.15 |
오라클 JOIN (0) | 2025.01.14 |
Java 17의 주요 기능 및 변화 (0) | 2025.01.12 |