본문 바로가기
Framework || Library/Spring

Spring Batch

by 시니성 2023. 9. 5.

오늘은 배치 처리 도구인 Spring Batch에 대해 이야기하려 합니다.

🌱 Spring Batch란?

Spring Batch는 대용량 데이터 처리를 위한 오픈 소스 프레임워크로, Spring의 특성을 기반으로 한 복잡한 배치 작업을 개발하고 유지보수하기 쉽게 만들어 줍니다. 배치 처리라는 것은 일련의 자동화된 단계로 구성된 비-인터랙티브 태스크를 의미합니다.

📚 주요 구성요소

  • Job: 배치 처리의 전체 작업 프로세스를 나타냅니다.
  • Step: Job 내의 개별적인 처리 단계를 의미합니다.
  • ItemReader: 데이터 소스로부터 데이터를 읽어오는 역할을 합니다.
  • ItemProcessor: 읽어온 데이터에 대한 처리 로직을 수행합니다.
  • ItemWriter: 처리된 데이터를 최종 목적지(예: 데이터베이스)에 저장합니다.

💡 사용 사례

매일 밤, 온라인 상점의 주문 데이터를 CSV 파일에서 MySQL 데이터베이스에 저장해야 한다고 상상해봅시다.

예제 코드

  1. 도메인 모델 정의
@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
)
  1. 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
}
  1. 데이터 처리를 위한 ItemProcessor 정의 (여기서는 그대로 반환)
@Bean
fun processor(): ItemProcessor<Order, Order> = ItemProcessor { it }
  1. JPA와 함께 데이터베이스에 데이터를 저장하는 ItemWriter 정의
@Bean
fun writer(entityManagerFactory: EntityManagerFactory): JpaItemWriter<Order> {
    val writer = JpaItemWriter<Order>()
    writer.setEntityManagerFactory(entityManagerFactory)
    return writer
}
  1. 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! 🚀