일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- tasklet
- cheerio
- Spring Batch
- Spring Security
- cloud native
- JavaScript
- Reduxpender
- OpenStack
- UsernamePasswordAuthenticationFilter
- AuthenticatoinProvide
- stopPropogation
- vuejs
- T-OTP
- Spring REST Docs
- Flyway
- REACT
- SpringBoot
- 리액트
- preventdefault
- Pender
- SWAGGER
- vue
- MFA
- Filter
- axios
- MSA
- SpringRESTDocs
- openapi3
- gradle
- Crawling
- Today
- Total
Miracle Morning, LHWN
20. Spring Batch 를 활용한 데이터 일괄 처리 본문
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
https://docs.spring.io/spring-batch/docs/4.3.x/reference/html/
'IT 기술 > [JAVA] Spring Boot' 카테고리의 다른 글
21. MFA (Multi-Factor Authentication) (0) | 2021.06.25 |
---|---|
18-3. Spring Security 에 대해 (3) (0) | 2021.06.25 |
18-2. Spring Security 에 대해 (2) (0) | 2021.06.15 |
19. Spring Security 를 활용하여 OpenStack 연동해보기 (0) | 2021.06.02 |
18-1. Spring Security 에 대해 (1) (0) | 2021.06.01 |