1. Spring Batch 기본 구성 요소
Spring Batch는 대규모 데이터 처리에 최적화된 프레임워크로 대량의 데이터를 처리하거나 활용하는데 널리 사용된다. 스프링 배치에서 사용되는 주된 구성 요소들을 큰 순서부터 차례로 나열하면 다음과 같다
- Job: 하나 이상의 Step으로 구성된 배치 처리 단위
- Step: 작업의 논리적 단위로, Tasklet이나 Chunk 기반 처리로 구현
- Tasklet: 단순 반복 작업을 처리하기 위한 인터페이스
- Chunk: 데이터를 일정 크기 단위로 나누어 처리하는 방식. 내부적으로는 크게 reader, processor, writer 형태로 처리.
tasklet vs chunk
chunk | tasklet | |
장점 | 대량 데이터를 효율적으로 처리 가능(읽기, 처리, 쓰기) | 간단한 반복 작업에 적합함. |
사용 사례 | 파일 로드, DB 마이그레이션, ETL 작업 | 단일 작업, 외부 API 호출 등 |
코드 예시
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Bean
public Job exampleJob(JobBuilderFactory jobBuilderFactory, Step exampleStep) {
return jobBuilderFactory.get("exampleJob")
.start(exampleStep)
.build();
}
@Bean
public Step exampleStep(StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get("exampleStep")
.<String, String>chunk(10) // Chunk 단위 설정
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build();
}
@Bean
public ItemReader<String> itemReader() {
return new SimpleItemReader();
}
@Bean
public ItemProcessor<String, String> itemProcessor() {
return new SimpleItemProcessor();
}
@Bean
public ItemWriter<String> itemWriter() {
return new SimpleItemWriter();
}
}
2. Spring Batch 성능 최적화 기법
여러가지 방법이 있겠지만 크게 4가지가 있다.
- Multi-threaded Step
- 말 그대로 데이터를 병렬 처리해 성능을 향상시키는 방법.
- 다만 멀티 쓰레드 시 가지는 문제점에 대해서 고민(병목 현상, 데이터 정합성 등)
- Partitioning
- 데이터를 파티션으로 나누어서 병렬 처리하는 방식
- 멀티 쓰레드와 유사하지만 말 그대로 하나의 작업을 파트별로 나눠서 처리(1000가지가 있다면 100개씩)
- Parallel Step
- 만약 하나의 Step에서 순서대로 처리하지 않아도 되는 작업이라면 별도로 그 작업을 별도로 병렬로 나눠서 처리하는 방식.
- Step의 흐름을 하나 더 나눠서 처리하는 방식.
- Chunk 크기 조절
- Chunk 크기에 따른 데이터 크기와 메모리 사용량을 고려해 적절한 크기를 설정해 처리 효율을 극대화 하는 방식.
3. Scheduler를 활용한 통합
Spring Batch는 단일로 사용하기보다는 사용자의 이용량이 적은 새벽 시간대에 통계 작업을 위해 처리하는 경우가 많기 때문에 Spring Scheduler나 Quartz를 연동해서 많이 처리한다.
다만 개발단계에서는 스프링이 실행되면 Job이 자동으로 실행되기 때문에 이를 application.yml이나 설정 파일에서 스프링 배치 실행을 끄고 작업할 필요는 있다. 만약 스프링 부트 환경이라면 application.properties에 다음 속성을 추가한다.
spring.batch.job.enabled=false
코드 예시
@Component
public class JobScheduler {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job exampleJob;
@Scheduled(cron = "0 0 2 * * ?")
public void runJob() throws Exception {
JobParameters params = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(exampleJob, params);
}
}
실무에서 Spring Batch를 사용할 경우가 뭐가 있을지 생각해보니, 일일 사용량과 같은 통계 데이터를 추출하거나, 특정 기간에 대한 정산 데이터를 구하기 위해서도 자주 사용하는 예시를 확인했다. 또한 개인적인 생각이지만 한 번 제대로 작성하고 나면 로직 자체가 변경되는 일이 많지 않을 것 같기 때문에 처음에 조금 정성들이는게 추후에 관리를 위해서도 좋을 것 같다.
'Web Programming' 카테고리의 다른 글
[Web] 웹 인증 방식에 대한 이해 (1) | 2024.09.03 |
---|