오늘은 배치 처리 도구인 Spring Batch에 대해 이야기하려 합니다.
🌱 Spring Batch란?
Spring Batch는 대용량 데이터 처리를 위한 오픈 소스 프레임워크로, Spring의 특성을 기반으로 한 복잡한 배치 작업을 개발하고 유지보수하기 쉽게 만들어 줍니다. 배치 처리라는 것은 일련의 자동화된 단계로 구성된 비-인터랙티브 태스크를 의미합니다.
📚 주요 구성요소
- Job: 배치 처리의 전체 작업 프로세스를 나타냅니다.
- Step:
Job
내의 개별적인 처리 단계를 의미합니다. - ItemReader: 데이터 소스로부터 데이터를 읽어오는 역할을 합니다.
- ItemProcessor: 읽어온 데이터에 대한 처리 로직을 수행합니다.
- ItemWriter: 처리된 데이터를 최종 목적지(예: 데이터베이스)에 저장합니다.
💡 사용 사례
매일 밤, 온라인 상점의 주문 데이터를 CSV 파일에서 MySQL 데이터베이스에 저장해야 한다고 상상해봅시다.
예제 코드
- 도메인 모델 정의
@Entity
@Table(name = "orders")
data class Order(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
val orderId: Long,
val productId: Long,
val amount: Int
)
- CSV 파일에서 데이터를 읽어오는 ItemReader 정의
@Bean
fun reader(): FlatFileItemReader<Order> {
val reader = FlatFileItemReader<Order>()
reader.setResource(ClassPathResource("orders.csv"))
reader.setLineMapper(object : DefaultLineMapper<Order>() {
init {
this.setLineTokenizer(DelimitedLineTokenizer())
this.setFieldSetMapper(object : BeanWrapperFieldSetMapper<Order>() {
init {
this.setTargetType(Order::class.java)
}
})
}
})
return reader
}
- 데이터 처리를 위한 ItemProcessor 정의 (여기서는 그대로 반환)
@Bean
fun processor(): ItemProcessor<Order, Order> = ItemProcessor { it }
- JPA와 함께 데이터베이스에 데이터를 저장하는 ItemWriter 정의
@Bean
fun writer(entityManagerFactory: EntityManagerFactory): JpaItemWriter<Order> {
val writer = JpaItemWriter<Order>()
writer.setEntityManagerFactory(entityManagerFactory)
return writer
}
- Step 및 Job 정의
@Bean
fun importOrderStep(stepBuilderFactory: StepBuilderFactory, reader: ItemReader<Order>, writer: ItemWriter<Order>, processor: ItemProcessor<Order, Order>): Step {
return stepBuilderFactory["importOrderStep"]
.chunk<Order, Order>(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build()
}
@Bean
fun importOrderJob(jobBuilderFactory: JobBuilderFactory, importOrderStep: Step): Job {
return jobBuilderFactory["importOrderJob"]
.incrementer(RunIdIncrementer())
.flow(importOrderStep)
.end()
.build()
}
🎓 마치며...
Spring Batch는 대용량 데이터의 일괄 처리에 탁월한 선택입니다. 위의 간단한 예제를 통해 배치 작업의 기초를 익혔지만, 실제 환경에서는 예외 처리, 트랜잭션 관리, Job 파라미터, 리스너 등 많은 추가적인 기능들을 활용할 수 있습니다. Happy coding! 🚀
728x90
'Framework || Library > Spring' 카테고리의 다른 글
Mockito를 알아보자 (0) | 2023.09.12 |
---|---|
Spring Application 프로파일 (0) | 2023.09.05 |
Spring에서 JPA사용하기 (Transaction, 예외 처리) (0) | 2023.08.18 |
Spring에서 JPA 사용하기(환경 설정부터 기본 CRUD 까지) (0) | 2023.08.18 |
Lombok이란? (예시 코드 포함) (0) | 2023.08.17 |