출처 : https://deeplify.dev/back-end/spring/batch-architecture-and-components
위 출처의 내용을 참고하여 공부 용도로 정리하였습니다.
구조
노란색 : 스케줄러 / DB (외부 애플리케이션) → AWS EventBridge , RDB , MongoDB , Redis , ..
빨간색 : 애플리케이션 서비스 (Spring Batch에서 제공)
초록색 : 개발자가 구성해야 하는 것들 → ex) 일정 주기대로 작업 시작되도록 설정하거나 , 작업을 실행하는 방법 등
Run Tier : 애플리케이션의 예약 및 시작과 관련이 있는 계층
(배치 작업의 시간 기반 및 상호 의존적인 스케줄링 제공 / 병렬 처리)
Job Tier : 배치 작업의 전체 실행을 담당
(배치 단계를 순차적으로 실행하여 모든 단계가 올바른 상태에 있고 모든 적절한 정책이 시행 되도록 함)
Application Tier : 프로그램을 실행하는데 필요한 구성 요소
(요구된 배치의 기능을 처리하고 Tasklet 실행에 대한 정책을 시행하는 특별한 Tasklet 포함)
Data Tier : DB , File 또는 대기열을 포함할 수 있는 물리적 DB 소스와의 연결 제공
용어 설명
1. Job
: 전체 배치 프로세스를 캡슐화하는 엔티티 (쉽게 말해 Step 인스턴스의 컨테이너)
구성 요소
→ 작업의 간단한 이름
→ Step 인스턴스의 정의 및 순서
→ 작업을 다시 시작할 수 있는지 여부
@Slf4j
@Configuration
@RequiredArgsConstructor
public class TutorialConfig {
private final JobBuilderFactory jobBuilderFactory;
@Bean
public Job tutorialJob() {
// jobBuilderFactory : Job을 쉽게 만들 수 있도록 도와주는 Class
// .get(jobName) : job 이름을 명시해주자.
return jobBuilderFactory.get("tutorialJob")
.start(tutorialStep1())
.next(tutorialStep2())
.build();
}
// step1 생략
@Bean
public Step tutorialStep2() {
return stepBuilderFactory.get("tutorialStep2")
.tasklet((contribution, chunkContext) -> {
log.debug("I'm a tutorialStep2");
return RepeatStatus.FINISHED;
})
.build();
}
}
2. JobRunner
: 외부 요청에 의해 작업 실행을 담당하는 클래스 (JobLauncher의 인스턴스화를 수행)
→ 다양한 외부 트리거(ex. java -jar job.name=xxx)로 메서드 호출을 할 수 있는 등의 여러 구현 방법들이 존재
3. JobInstance
: 배치 처리에서 Job이 실행될 때 하나의 논리적 작업 실행의 단위
ex) 하루에 한 번씩 실행되는 배치 Job이 있다고 가정할 때 하루 하나의 JobInstance가 존재.
4. JobExecution
: JobInstance에 대한 한 번의 실행을 나타내는 객체
JobExecution Properties
- Status : BatchStatus 실행 상태를 나타내는 객체 (STARTED , FAILED , COMPLETED)
- startTime : 작업이 시작되었을 때 현재 시스템 시간
- endTime : 작업 성공 여부와 관계없이 작업이 끝났을 때 현재 시스템 시간
- exitStatus : 실행의 결과를 나타내는 상태로 호출 대상에게 반환할 exitCode를 포함하고 있음 (중요 속성)
- createTime : JobExecution이 처음 지속된 현재 시스템 시간
- lastUpdated : JobExecution이 마지막으로 지속된 현재 시스템 시간
- executionContext : 실행과 실행 사이에 유지되어야하는 유저 정보를 포함하는 속성 데이터 더미
- failureExceptions : 작업 실행 중 발생한 예외 목록
5. JobExecutionContext
: Job 실행 중 지속적으로 유지되었으면 하는 데이터를 저장하는 Data Collection이다. Framework에 의해 유지 및 관리되고 실행되는 중간 커밋지점에서 주기적으로 저장된다.
→ 이를 사용하면 Job 실행 중 치명적인 오류가 발생한 경우에도 상태를 유지할 수 있게 된다.
6. JobParameters
: 배치 Job이 실행될 때 필요한 파라미터 셋을 가지고 있는 객체
: JobParameters < - > JobInstance는 1:1 관계 → JobParameters는 JobInstance를 구분하는 기준
7. JobParameters와 Scope
: JobParameters를 사용하기 위해서는 JobScope / StepScope를 함께 사용해줘야 한다.
→ JobParameters는 Scope Bean의 생성 시점에만 함께 생성될 수 있기 때문
7.1. JobParameters 사용 예제
// .. 생략
@Slf4j
@StepScope
@RequiredArgsConstructor
public class TutorialTasklet implements Tasklet {
// JobParameters 사용
@Value("#{jobParameters[datetime]}")
private String datetime;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
log.debug("# executed tasklet !!");
log.debug("datetime: {}", datetime);
return RepeatStatus.FINISHED;
}
}
8. Step
8.1. StepExecution
: Step 실행 정보를 담고 있는 객체
StepExecution Properties
- Status
- startTime
- endTime
- exitStatus
- executionContext
- readCount
- writeCount
- commitCount
- rollbackCount
- readSkipCount
- processSkipCount
- filterCount
- writeSkipCount
8.2. StepExecutionContext
각 Step에 대해서 개발자가 지정한 데이터를 저장
9. JobRepository
: 배치 처리 과정 중 Framework에서 사용하는 메타데이터 정보를 액세스하는 Facade 클래스이다.
10. JobLauncher
: 작업의 시작과 실제 실행을 관리하는 인터페이스로 JobRunner에 의해 인스턴스화되고, JobParameters와 함께 배치를 실행하는 주체
11. JobLocator
: 파라미터로 전달된 작업에 대한 구현 계획과 같은 설정 정보를 가져오는 책임이 있는 Class (JobRunner와 함께 작동)
12. Tasklet
: 배치의 특정 작업을 개발하기 위해 Step의 기본 단위를 만들 수 있는 클래스
13. ItemReader
: 청크 구조에서 사용되는 컴포넌트로 배치 작업에서 모든 데이터에 대한 처리가 될 때까지 DB 등의 소스에서 반복적으로 읽는데 사용하는 인터페이스
→ Framework에서는 Reader 셋을 제공하지만 필요할 경우 개발자가 직접 개발할 수도 있음
14. ItemProcessor
: 청크 구조에서 사용되는 컴포넌트로 Reader에서 읽어온 데이터를 변환하기 위한 역할을 수행한다.
15. ItemWriter
: 청크 구조에서 사용되는 컴포넌트로 배치에서 데이터를 DB , Redis 등에 저장하기 위한 인터페이스
→ Framework에서 기본 제공하나 개발자가 직접 개발할 수도 있다.
'Programming > SpringBoot' 카테고리의 다른 글
[SpringBoot] 간단한 게시판 만들기 #7 - Thymeleaf를 사용한 Fornt view 구현 (5) | 2022.01.03 |
---|---|
[SpringBoot] 간단한 게시판 만들기 #6 - SpringSecurity 개념 및 구현 (2) | 2022.01.03 |
[SpringBoot] 간단한 게시판 만들기 #5 - Service 구현 (0) | 2022.01.03 |
[SpringBoot] 간단한 게시판 만들기 #4 - DTO, Repository 구현 (0) | 2022.01.03 |
[SpringBoot] 간단한 게시판 만들기 #3 - domain(Entity) 구현 (0) | 2022.01.03 |