<Spring Batch> 0. 스프링 배치란?
by BFine
출처 : http://www.yes24.com/Product/Goods/99422216
가. 배치 (Batch-Processing)
a. 무엇인가?
- 실시간으로 동작하는 주 서비스 외에 별도로 대량의 데이터를 일괄처리 하는 것을 의미한다.
=> ex. 월말정산, 회원 상태 처리 등
b. 특징
- 사용자의 요청에 의해 동작하는 방식이 아니다.
- 주 서비스의 리소스를 소모하지 않고 별도로 동작한다.
- 일괄로 데이터를 처리하기 때문에 관리하기가 용이하다.
c. 설계시 고려사항
1. 공통 컴포넌트를 쉽게 확장해 새로운 기능을 추가할 수 있는지
2. 컴포넌트 변경 추가시 시스템 전체에 미치는 영향을 알 수 있도록 단위 테스트가 잘 되어있는지
3. Job이 실패할때 어디서 왜 실패했는지 알 수 있는지
나. Spring Batch
a. 무엇인가?
- 액센츄어에서 만든 Spring을 사용하여 Batch Processing을 간편하게 할 수 있도록 만든 오픈소스 프레임워크
=> 사용 사례. ETL [Extract (추출), Transform (변환), Load (적재)],
b. 구조
- 3 Tier 계층 구조
#----- 어플리케이션 -----
#| |
#| | 코어 | |
#| ------------ |
#| | 인프라스트럭처| |
#---------------------
- 어플리케이션 레이어
- 사용자 코드 및 구성(+Job 구조화)이 포함된다.
- 최상위 레이어가 아닌 감싸고 있음 => 보통은 코어와 함께 동작하지만 때로는 인프라 일부를 만들기도 한다.
- 코어 레이어
- 배치 도메인을 정의하는 모든 부분이 포함된다.
=> Job & Step 인터페이스, 실행에 사용되는 인터페이스 JobLauncher, JobParameters 등
- 인프라스트럭처 레이어
- 어떤 처리할 때 관련 리소스를 읽고 쓰기 및 Job 실패 후 재시도될 때 어떤 작업을 해야 하는지 등
c. 아키텍처
- 스프링 배치에서 Job은 State machine에 지나지 않다. 일반적으로 상태를 보여주는 단위는 Step이다.
- Step은 Job을 구성하는 독립된 작업의 단위이며 두 가지 유형으로 나눌 수 있다.
1. Tasklet(테스크릿) 기반
=> 간단한 구조, 초기화 & SP 실행, 알림전송 등과 같은 Job에서 사용
2. Chunk(청크) 기반
=> 아이템을 기반으로 하는 처리방법이며 ItemReader, ItemProcessor(비필수), ItemWriter로 구성
- 특징
- 각 Step 서로 독립적으로 처리된다. 즉 다른 Step에 거의 영향을 미치지 않는다.
- 하나의 Step 내에서 처리할 일을 여러 스레드로 나눠 병렬로 실행 가능하다.
- 스프링 배치는 여러 빌더 클래스와 스프링빈을 통해 재사용이 용이하도록 설계되어있다.
d. Job 컴포넌트
- JobRepository
- 배치 아키텍쳐 내에서 공유되는 주요 컴포넌트
- 다양한 배치 수행과 관련 수치 데이터(시작,종료 시간, 읽기/쓰기 횟수 등) & Job의 상태를 유지 관리한다.
=> 일반적으로 RDB를 사용하여 관리
- JobLauncher
- Job을 실행하는 역할을 담당(Job.excute)
- 이외에는 재실행 여부 검토, 실행방법(스레스 처리), 파라미터 유효성 검증 등 수행한다.
- Spring Boot에서는 즉시 Job을 시작하는 기능을 제공 (일반적으로 직접 다룰 필요는 없음)
- 동작
1. Job을 실행하면 해당 Job은 각각의 Step을 실행한다.
2. Step이 실행되면 JobRepository는 현재 상태로 갱신된다.
=> 실행된 Step, 상태, 읽고 & 처리된 아이템 수 등 저장
3. Step 내에서 Chunk 처리가 완료 될때 JobExecution or StepExecution을 현재상태로 갱신한다.
- Job이 실행되면 JobInstance가 생기고 Job이름과 실행을 위해 제공되는 고유식별 파라미터를 가진다.
- JobExecution은 실제 Job 실행을 의미한다. (Job 구동할 때마다 새롭게 생성)
=> 실행에 실패 후 재실행될 경우 JobInstance는 그대로이지만 JobExecution은 새롭게 생성
- StepExecution은 Step 실행을 의미하며 StepInstance는 존재하지 않는다.
e. 병렬화
- 다중 스레드 Step
- 스프링 배치에서 Job은 Chunk(블록 단위)로 처리되고 각각은 독립적인 트랜잭션으로 처리된다.
=> 일반적으로 Chunk는 연속해서 처리 (커밋수를 50개로 하면 50개씩 처리 후 커밋)
- Step 내에 Chunk를 처리하는 부분에 여러 개의 스레드를 사용하면 병렬로 처리할 수 있다.
- 병렬 Step
- Step을 병렬 스레드로 실행하는 방법이다.
- 비동기 ItemProcessor, ItemWriter
- AsynchronousItemProcessor는 ItemProcessor 호출 결과를 반환하는 대신 Future를 반환한다.
반환된 Future 목록은 AsynchronousItemWriter로 전달한다.
- Remote Chunking (원격 청킹)
- 여러 JVM에 처리를 분산하는 방법, 위의 방법들은 모두 단일 JVM에서 실행되어 확장성에 한계가 있다.
- 입력은 마스터 노드에서 표준 ItemReader를 사용해 이뤄지고 MQ 등을 이용하여 원격으로 워커 노드에
ItemProcessor로 전송되어 처리 완료 후에는 다시 마스터로 보내거나 직접 기록하는 방식이다.
- 단점은 네트워크 사용량이 많아져서 실제 처리에 비해 I/O 비용이 적은 시나리오에 적합하다.
- 파티셔닝
- Step에 대해서 마스터-워커 방식을 사용하여 처리하는 방법이다.
- 원격 청킹과 차이점은 마스터가 워커의 Step 수집을 위한 컨트롤러 역할만 하기 때문에 MQ 등 별도 통신이 필요하지 않는다.
다. 기본 설정
@Slf4j
@EnableBatchProcessing
@RequiredArgsConstructor
@Configuration
public class BatchExample {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Step step(){
return stepBuilderFactory.get("Step")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
log.info(" ##### Step 실행 ##### ");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Job job(){
return jobBuilderFactory.get("Job").start(step()).build();
}
}
a. @EnableBatchProcessing
- 스프링 배치의 인프라스트럭처를 부트스트랩 하는데 사용한다.
b. SimpleBatchConfiguration
- 배치의 인프라스트럭처를 위한 Bean을 등록하는 클래스 이다. (AbstractBatchConfiguration 상속)
- Bean
1. JobRepository : 실행 중인 Job의 상태를 기록함
2. JobLauncher : Job을 실행시키는데 사용함
3. JobRegistry : 특정한 Launcher 구현체를 사용할때 Job을 찾는 용도로 사용함
4. JobExplorer : JobRepository를 사용해 읽기 전용 작업을 수행함
5. PlatformTransactionManager : Job 진행 과정에서 트랜잭션을 다루는데 사용됨
6. JobBuilderFactory & StepBuilderFactory : Job, Step을 생성하는 빌더 (AbstractBatchConfiguration 등록)
'공부 > Spring Batch' 카테고리의 다른 글
<Spring Batch> 3. 배치 테이블 Embedded DB(H2)로 따로 관리하기 (1) | 2021.09.27 |
---|---|
<Spring Batch> 2. JobRepository, Config Customizing (0) | 2021.09.22 |
<Spring Batch> 1. JobParameters, ExecutionContext (0) | 2021.09.21 |
<Spring Batch> API 호출해서 DB에 저장하기(with JPA) (4) | 2021.03.01 |
<Spring Batch> 예제 프로그램 따라하기 (2) | 2021.02.25 |
블로그의 정보
57개월 BackEnd
BFine