Miracle Morning, LHWN

20. Spring Batch 를 활용한 데이터 일괄 처리 본문

IT 기술/[JAVA] Spring Boot

20. Spring Batch 를 활용한 데이터 일괄 처리

Lee Hye Won 2021. 6. 25. 08:50
Batch

 

'일괄 처리' 로서, 일정 기간으로 스케줄링하여 처리한다. 유저와 상호 작용 없이 동작하며, 대용량 데이터 처리하는데에 쓰인다.

이때 고려해야 할 사항에는 무엇이 있을까

  • 단순화
  • 메모리에 무리가 가지 않는 수준으로 대량 처리
  • 데이터의 무결성
  • DB 쿼리 최적화
  • 백업

 

Spring Batch

 

  • Spring Source 가 Accenture 사와 협력하여 개발한 Batch Framework 이다.
  • 엔터프라이즈 환경에서 강력한 Batch Application 을 개발할 수 있도록 설계되었다.
  • Logging / Tracing, Transaction Management, Job Processing Statistics, Job Restart, Skip, Resource Management 등 대량의 레코드 처리에 필수적인 재사용 가능한 기능을 제공한다.
  • 최적화 및 파티셔닝 기술을 통햏 대용량 및 고성능 배치 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공한다.
  • 단순하고 복잡한 대용량 배치 작업은 확장성이 뛰어난 방식으로 프레임 워크를 활용하여 많은 양의 정보를 처리한다.
  • Spring Framework 를 사용한다.
  • Run (실행 영역) / Job (작업 영역) / Application (비즈니스 영역) 으로 구분된다.
  • interface 로 공통의 핵심 실행 서비스를 제공한다.
  • Maven 을 사용하여 빌드된 Application 과 완전히 분리된 아키텍처 JAR 로 간단한 배포 모델을 제공한다.

 

Job

 

'작업' 으로서 하나의 Job Flow 에서 여러 Step 을 가진다.

@Bean
public Job job() {
	return this.jobBuilderFactory.get("job") // 작업 이름
    	.start(this.step1()) 
        .next(this.step2())
        .next(this.step3())
        .build();
}

 

Step

 

'단계' 로서 모든 Job 은 하나 이상의 Step 을 가진다. 

@Bean
public Step createNewArticlesStep() {
	return this.stepBuilderFactory.get("createNewArticlesStep")
    .<ArticleModel, Article>chunk(100)
    .reader(this.newArticlesReader())
    .processor(this.newArticlesProcessor())
    .writer(this.newArticlesWriter())
    .build();
}    

 

JobInstance

 

논리적 작업의 실행 단위로서, 매일 실행되는 배치일 경우 매일 하나의 JobInstance 가 생성되는 개념이다.

JobInstance 는 JobParameters 에 의해 식별될 수 있다.

 

JobParameters

 

JobParameters 객체는 배치 작업을 시작하는데에 사용하는 파라미터 세트를 가진다.

  • JobInstance = Job + (identifying) JobParameters
  • java -jar build/libs/batch.jar --job.name=jobName + createdDate=2020-08-26
@Value("#{jobParameters[createdDate]}") String createdDate

 

JobParametersIncremeter

 

JobParameter 를 자동으로 Increment 하기 위해 사용한다. JobExecution 에 문제가 있어서 재실행이 어려운 경우, JobParameters 를 Increment 하여 처음부터 다시 실행하기도 한다.

무조건 증가시키고 동일한 JobParameters 의 Job 을 여러 번 수행해도 괜찮은 경우가 있다. 

 

보통 RunIdIncremeter 를 사용하고, JobParametersIncrementer 인터페이스를 커스텀하게 구현하여 사용한다.

 

@JobScope, @StepScope

 

JobScope, StepScope 는 Late Binding (애플리케이션 실행 시점이 아닌 Scope 실행 시점에 Binding 되고 끝날 때 삭제 됨) 이다.

JobParameter 를 Scope 내에 할당할 수 있고, 병렬 처리에 비교적 안전하다.

 

@Bean
@StepScope
public RepositoryItemReader<Article> oldArticlesReader(@Value("#{jobParameters[createdDate]}")) String createdDate
  {
  ...
  }

 

JobExecution

 

JobInstance 의 논리적인 실행 단위로 JobExecution 은 실제 실행 단위이다. 

Job 은 작업과 실행 방법 등의 설정을 정의한다면, JobInstance 는 올바른 시작을 위해 실행의 논리적인 단위, JobExecution 은 실제 물리적인 실행의 단위이다.

만일 매일 실행되는 배치가 성공하지 않았을 경우 완료되지 않은 것으로 간주되어 하루에 여러 JobExecution 이 생성될 수 있다. JobExecutionContext 는 개체 범위에 지정된 상태를 저장할 수 있도록 개발자에 제공된다.

 

StepExecution

 

Step 의 실행 단위로서, Step 이 실제로 시작될 때 생성된다. StepExecutionContext 는 개체 범위에 지정된 상태를 저장할 수 있도록 개발자에 제공된다.

 

JobRepository

Batch 메타 데이터 엔티티의 지속성을 담당하는 저장소로 JobLauncher, Job, Step 구현체들을 위해 CRUD 작업을 제공한다.

StepExecution 과 JobExecution 구현체들은 Repository 에게 전달되어 저장된다.

 

DefaultBatchConfigurer 를 상속받아서 설정 가능하다.

@EnableBatchProcessing

 

JobLauncher

 

JobRepository 로부터 유효한 JobExecution 을 획득하고 Job 을 실행한다. JobLauncher 인터페이스는 호출이 동기 또는 비동기적으로 실행되는지 보장되지 않는다. DefaultBatchConfigurer 를 상속받아서 설정 가능하다.

public JobExecution run (Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException,
JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException;

 

Tasklet

 

하나의 Step 에서 단일 Task 를 수행하며, Tasklet 인터페이스를 구현한다. 

 

ChunkOrientedTasklet

 

하나의 Step 에서 읽기, 처리, 쓰기의 과정으로 Task 를 수행한다. Page size 단위로 읽고 처리한 데이터가 Chunk size 에 도달하면 쓰고 Commit 처리한다. 

 

# Chunk-Oriented Processing : 한 번에 1건씩 데이터를 읽어서 Chunk 라는 데이터 덩어리를 만들어 트랙잭션 처리한다.

 

 

출처 : https://spring.io/projects/spring-batch

 

Spring Batch

Spring Batch provides reusable functions that are essential in processing large volumes of records, including logging/tracing, transaction management, job processing statistics, job restart, skip, and resource management. It also provides more advanced tec

spring.io

https://docs.spring.io/spring-batch/docs/4.3.x/reference/html/

 

Spring Batch - Reference Documentation

Welcome to the Spring Batch reference documentation! This documentation is also available as single html and pdf documents. The reference documentation is divided into several sections: The following appendices are available: Lucas Ward, Dave Syer, Thomas

docs.spring.io

 

Comments