Spring Batch step.1 - Overview

Batch application 의 필요성

Spring Batch 를 살펴보기 전에 “Batch application 은 왜 필요할까?” 를 당연 먼저 생각해볼 필요가 있다. Batch application 은 아래와 같은 조건의 상황을 개발할 때 효율적인 서비스라고 생각한다.

  • 대용량 데이터 처리 : 1만건, 10만건 등 대용량의 데이터를 조회/전달/계산 등 처리가 필요한 경우
  • 자동화 : 일정 주기적으로 동일한 작업이 필요한 경우

Spring Batch?

Spring BatchSpring 의 특성을 가지고 있으면서 Batch 작업을 할 수 있도록 지원하는 Framework 이다. 그리고 다양한 라이브러리를 지원하면서 DB, 전문 파일 등 다양한 데이터 형식의 정보를 조회 및 가공 처리가 가능하다. 이번 Spring Batch 를 정리하면서는 아직도 현업에서 많이 사용중인 전문 형식의 데이터를 처리하는 방식을 살펴보고 기록할 예정이다.

Dependencies

  • Spring Batch
  • H2 Database

Database 의존성 필수? Spring Batch 는 Batch Job 에 대한 설정을 DB 에 Meta Table 을 생성하여 관리하고 있기 때문에 필수이다.

Overview

Spring Batch 의 간단한 구현 방식이다. (with Kotlin)

@EnableBatchProcessing
@Configuration
class BatchJobConfig(
    val jobBuilderFactory: JobBuilderFactory,
    val stepBuilderFactory: StepBuilderFactory
) {
    // logger
    private val logger = LoggerFactory.getLogger(BatchJobConfig::class.java)

    @Bean
    fun simpleJob(): Job = jobBuilderFactory.get("simpleJob").start(simpleStep()).build()

    @Bean
    fun simpleStep(): Step = stepBuilderFactory
                                .get("simpleStep")
                                .tasklet { contribution, chunkContext ->
                                    logger.info("==== This is Step !! ====")
                                    RepeatStatus.FINISHED
                                }
                                .build()
}

간단한 simpleJob 를 실행하여 simpleStep 에서 실행되는 아래와 같은 로그를 확인해볼 수 있다.

spring Batch basic 01 테스트 결과

Job

Job 구조

JobBatch 작업 하나의 단위이고, Job 안에서 여러 개의 Step 들이 구성되어 Batch 작업을 수행한다. Spring Batch 구조에서 제일 큰 개념은 Job 이라 할 수 있다.

JobInstance

JobInstance 는 논리적인 Job 를 의미한다. 실제 1일 1회 실행되는 Job 이 존재한다면, 매일 1회 실행되는 새로운 Job 이 생성이 될 것이고, 이를 관리하고자 논리적인 JobInstance 가 필요하다. 따라서 각 JobInstance 는 여러 개의 실행 결과인 JobExecution 를 가질 수 있고, 특정 Job 과 식별 가능한 JobParameters 를 가질 수 있다. (단, JobParametersJobInstance 는 1개 뿐이다.)

JobParameters

JobParameters 는 다수의 Job 를 구분할 수도 있는 Job 이 실행될 때 사용하는 Parameter Set 객체이다. Job 의 식별값 또는 참조 데이터로 사용 가능하다.

JobExecution

JobExecutionJob 의 실행을 의미한다. 실행이 성공적으로 종료되기 전까지는 완료되지 않은 것으로 판단하고, 관리한다.


Step

Job & Step 구조

StepJob 의 독립적이고 순차적으로 단계를 처리하기 위한 도메인 객체이다. 모든 Job 은 하나 이상의 Step 으로 구성되며, Step 은 실제 Batch 에서 수행해야하는 처리를 정의하고 있다.

StepExecution

StepExecution 은 한 번의 Step 실행 시도를 의미한다. Step 를 실행할 때마다 생성되지만, 이전 단계의 Step 이 실패되면 다음 Step 를 실행하지 않고 StepExecution 도 저장하지 않는다.

Job & Step 구조

spring Batch job & step 구조

Job 은 항상 1개의 이상의 Step 으로 구성되어있다. Step 를 구성할 수 있는 방법은 크게 2가지로 나눌 수가 있다.

  • Tasklet : Batch 의 작업을 하나로 처리
  • Reader & Processor & Writer : 조회 / 처리 / 전달 기능을 나눠서 처리

기타 중요 기능

JobRepository

JobRepositorySpring Batch 에서의 모든 저장(persistence) 메커니즘을 담당하고, JobLauncher, Job, Step 구현체에 CRUD 기능을 제공해준다. Job 를 실행할 때 repository 에서 JobExecution 를 조회하고, 실행 중에는 StepExecutionJobExecution 구현체를 repository 에 전달/저장한다.

JobLauncher

JobLauncherJobParametersJob 을 실행시키는 인터페이스이다.

ItemReader

ItemReaderStep 에서 데이터를 조회하는 작업을 추상화한 개념이다.

ItemProcessor

ItemProcessorItemReader 에서 조회된 정보를 변환하거나 다른 비즈니스 처리를 담당한다.

ItemWriter

ItemWriterStep 에서 Batch 또는 chunk 단위로 정보를 출력하는 작업을 추상화한 개념이다.


기본적인 Spring Batch 의 개념을 확인하였고, 세부적인 코드나 내용들은 계속 정리하면서 추가할 예정이다.

Spring Batch 는 앞서 설명한 것처럼 @Configuration 으로 Bean 등록하여 사용가능하지만, jar 가 실행될 때 수행하는 Batch 가 아닌 Spring Web 에서 특정 API 를 호출하여 Batch 의 Job 을 실행시키는 방법도 있다. 하지만, Spring Web 에서 실행시키는 방법은 권장하지 않는 방법이기에 일단 jar 로 실행시키는 방법을 정리할 예정이다.


출처