본문 바로가기

Programming/SpringBoot

[SpringBatch] 스프링배치 개념을 알아보자.

반응형

출처 : 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에서 기본 제공하나 개발자가 직접 개발할 수도 있다.

 

반응형