Spring Batch는 대용량 데이터 처리를 위한 강력한 프레임워크입니다. 데이터를 읽고, 처리하고, 쓰는 작업을 안정적이고 효율적으로 수행할 수 있도록 다양한 기능을 제공합니다. 이번 글에서는 Spring Batch를 사용하여 데이터 일괄 처리를 구현하는 방법에 대해 알아보겠습니다.
1. Spring Batch 기본 개념
Spring Batch는 Job, Step, ItemReader, ItemProcessor, ItemWriter 등의 주요 컴포넌트로 구성됩니다.
- Job: 하나의 배치 작업을 나타내며, 여러 개의 Step으로 구성됩니다.
- Step: 배치 처리의 실제 단위로, 데이터 읽기, 처리, 쓰기 등의 작업을 수행합니다.
- ItemReader: 데이터를 읽어오는 컴포넌트입니다. 다양한 소스에서 데이터를 읽어올 수 있습니다.
- ItemProcessor: 읽어온 데이터를 가공하거나 필터링하는 컴포넌트입니다.
- ItemWriter: 처리된 데이터를 저장하는 컴포넌트입니다. 다양한 대상에 데이터를 쓸 수 있습니다.
2. Spring Batch 환경 설정
Spring Batch를 사용하려면 spring-boot-starter-batch
의존성을 추가하고, @EnableBatchProcessing
어노테이션을 사용하여 배치 기능을 활성화합니다.
1
2
3
4
5
6
7
|
@SpringBootApplication
@EnableBatchProcessing
public class BatchApplication {
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
}
|
cs |
3. Job 및 Step 구성
JobBuilderFactory
와 StepBuilderFactory
를 사용하여 Job과 Step을 구성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Configuration
public class BatchConfig {
@Bean
public Job myJob(JobBuilderFactory jobBuilderFactory, Step myStep) {
return jobBuilderFactory.get(“myJob”)
.start(myStep)
.build();
}
@Bean
public Step myStep(StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get(“myStep”)
.<Input, Output>chunk(10)
.reader(myReader())
.processor(myProcessor())
.writer(myWriter())
.build();
}
}
|
cs |
4. ItemReader 구현
ItemReader
는 데이터를 읽어오는 역할을 합니다. 대표적으로 FlatFileItemReader
와 JdbcCursorItemReader
가 있습니다.
1
2
3
4
5
6
7
|
@Bean
public FlatFileItemReader<Person> personItemReader() {
FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource(“people.csv”));
// CSV 파일 읽기 설정
return reader;
}
|
cs |
5. ItemProcessor 구현
ItemProcessor
는 읽어온 데이터를 가공하거나 필터링합니다. 비즈니스 로직을 구현합니다.
1
2
3
4
5
6
7
|
public class PersonItemProcessor implements ItemProcessor<Person, Person> {
@Override
public Person process(Person person) throws Exception {
// 데이터 가공 로직
return transformedPerson;
}
}
|
cs |
6. ItemWriter 구현
ItemWriter
는 처리된 데이터를 저장합니다. FlatFileItemWriter
와 JdbcBatchItemWriter
가 대표적입니다.
1
2
3
4
5
6
7
|
@Bean
public FlatFileItemWriter<Person> personItemWriter() {
FlatFileItemWriter<Person> writer = new FlatFileItemWriter<>();
writer.setResource(new FileSystemResource(“output/people.txt”));
// 파일 쓰기 설정
return writer;
}
|
cs |
7. 청크 지향 처리
Spring Batch는 청크 지향 처리를 지원하여 대용량 데이터를 효율적으로 처리할 수 있습니다.
1
2
3
4
5
6
7
8
9
|
@Bean
public Step myStep(StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get(“myStep”)
.<Person, Person>chunk(100)
.reader(personItemReader())
.processor(personItemProcessor())
.writer(personItemWriter())
.build();
}
|
cs |
8. 테스트 및 실행
@SpringBatchTest
와 JobLauncherTestUtils
를 사용하여 Spring Batch 애플리케이션을 테스트할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
|
@SpringBatchTest
class BatchTests {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Test
void testMyJob() throws Exception {
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
}
}
|
cs |
9. 스케줄링
@Scheduled
어노테이션을 사용하여 Job 실행 주기를 설정할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
|
@Component
public class JobScheduler {
@Scheduled(cron = “0 */15 * * * *”)
public void scheduleMyJob() throws Exception {
JobParameters params = new JobParametersBuilder()
.addString(“JobID”, String.valueOf(System.currentTimeMillis()))
.toJobParameters();
jobLauncher.run(myJob, params);
}
}
|
cs |
10. 활용 예시
Spring Batch는 데이터 마이그레이션, 데이터 정제, 보고서 생성 등 다양한 배치 처리 작업에 활용할 수 있습니다. 예를 들어:
- 대용량 데이터를 한 시스템에서 다른 시스템으로 이관하는 작업
- 로그 파일을 분석하여 통계 데이터를 생성하는 작업
- 매일 밤 배치로 실행되는 데이터 정제 및 집계 작업
- 정기적으로 생성되는 보고서를 자동화하는 작업
Spring Batch는 강력하고 유연한 배치 처리 프레임워크로, 다양한 데이터 일괄 처리 작업을 안정적이고 효율적으로 수행할 수 있게 해줍니다. Job, Step, ItemReader, ItemProcessor, ItemWriter 등의 컴포넌트를 조합하여 프로젝트에 맞는 배치 처리 과정을 구성할 수 있습니다.
또한 청크 지향 처리, 스케줄링 등의 기능을 통해 대용량 데이터를 효과적으로 처리하고 자동화할 수 있습니다. 데이터 처리와 관련된 다양한 요구사항을 Spring Batch로 해결해보시기 바랍니다.