본문 바로가기
Batch

간단한 Batch Domain 알아보기

by 이석준석이 2020. 11. 14.

아래의 링크를 참고하여 배치에서 사용하는 도메인을 정리합니다.

 

아직 부족한 실력이어서 틀린 부분이 있을 수 있습니다.

틀린 부분이 있다면 댓글이나 robin00q@naver.com으로 이메일주시면 반영하겠습니다.

 

docs.spring.io/spring-batch/docs/current/reference/html/domain.html#domainLanguageOfBatch

 

The Domain Language of Batch

This section describes stereotypes relating to the concept of a batch job. A Job is an entity that encapsulates an entire batch process. As is common with other Spring projects, a Job is wired together with either an XML configuration file or Java-based co

docs.spring.io


0. 개요

 

스프링 배치에는

  • Job
  • Step
  • 개발자가 제공할 수 있는 processing unit인 ItemReader / ItemProcessor 가 존재합니다.

 

  • 하나의 Step에는 
    • 하나의 ItemReader
    • 하나의 ItemProcessor
    • 하나의 ItemWriter 가 존재합니다.
  • Job은
    • 여러개의 Step을 가질 수 있습니다.
    • Job은 JobLauncher와 같이 실행됩니다.
  • 현재 실행중인 프로세스의 메타데이터는 JobRepository에 저장해야 합니다.

1.0. Job이란

 

Job은 여러개의 Step Instance들을 갖고있는 컨테이너입니다.

  • Configuration을 통해 
    • 여러 Step들의 flow
    • 다시 시작하는 여부 등을 설정할 수 있습니다.

1.1. JobInstance

  • 하나의 'EndofDay' Job 이 있다는 가정하에
    • 1일에 한 번 씩 해당 Job을 JobInstance 라고 할 수 있습니다.
    • 예를 들어
      • 2007/05/05에 실행되는 JobInstance
      • 2007/05/06에 실행되는 JobInstance ...
  • JobInstance의 실행을 위한 데이터 load 과정은 위에서 설명한 ItemReader가 전담합니다.

1.2. JobParameters

 

  • 여러개의 JobInstance는 어떻게 구분하는걸까요?
    • JobParameters를 통해 구분합니다.
    • JobParameters는 JobInstance가 시작할 때 필요한 파라미터들을 갖고있습니다.
      • 위의 그림에서는 schedule.date

간단한 예로

  • 2020/01/01 에 실행되는 JobInstance2020/01/02 에 실행되는 JobInstance
    • 두개는 하나의 Job에서 파생된 JobInstance이며
    • 다른 실행일자 파라미터를 갖고 있는 것입니다.
  • 결론적으로 JobInstance = Job + JobParameters 로 볼 수 있습니다.

1.3. JobExcecutions

 

2020/01/01에 실행되는 JobInstance가 있다고 가정하겠습니다.

  • JobInstance는 여러개의 JobExecution을 갖습니다.
  • 2020/01/01 오전에 실행한 JobExecution 이 실패하면 2020/01/01 오후에 JobExecution을 실행시킨다는 개념으로 생각하면 편합니다.

 

결론적으로

  • Job
    • 해당 Job이 무엇인지, 어떻게 실행되는지에 대한 정보를 담고있습니다.
    • 여러개의 JobInstance를 갖습니다.
  • JobInstance
    • Job + JobParameter의 개념으로 보면 쉽습니다.
    • 여러개의 JobExecution을 갖습니다.
  • JobExecution
    • 실제로 수행되는 단위입니다.
    • 아래와 같은 property 들을 갖고있습니다.
프로퍼티 명 설명
Status 현재 상태를 가리킵니다.

BatchStatus#STARTED : 현재 실행중이라면 Started 상태입니다.
BatchStatus#FAILED : 배치가 실패한 경우입니다.
BatchStatus#COMPLETED : 배치가 성공한 경우입니다.
startTime Java.util.Date 형식입니다.

시작되지 않았다면 해당 필드는 비어있습니다.
시작했다면 Java.util.Date 형식의 데이터가 들어있습니다.
endTime Java.util.Date 형식입니다.

끝나지 않았다면 해당 필드는 비어있습니다.
끝났다면 Java.util.Date 형식의 데이터가 들어있습니다.
exitStatus 가장 중요한 부분입니다.
- 왜? 실행이 어떻게 끝났는지에 대한 Status 코드를 갖고 있기 때문입니다.
- (Status 코드에 대해서는 나중에 따로 글을 쓰겠습니다.)

아직 실행이 끝나지 않았다면 비어있습니다.
createTime Java.util.Date 형식입니다.

아래에서 설명하게 될, JobRepository에 persisted (영속, 간단하게 말하면 저장) 된 시간을 말합니다.
lastUpdated Java.util.Date 형식입니다.

가장 마지막에 JobRepository에 persisted된 시간을 말합니다.
executionContext 아래에서 설명합니다.
failedExceptions 실행하면서 마주한 Exception들의 List입니다.

실패시킨 이유가 있으므로 중요한 정보입니다.

 


1.4 그림을 통한 설명

  • 가정
    • 현재 첫번째 실행한 JobExecution이 실패했다는 가정입니다.
      • 1월 1일 21시에 실행한 JobExecution이 실패했으며 (JOB_EXECUTION_ID = 1)
      • 1월 2일 21시에 실패한 JobExecution을 실행했고,  (JOB_EXECUTION_ID = 2)
      • 원래 1월 2일 21시에 실행하기로 한 JobExecution이 실행됐습니다. (JOB_EXECUTION_ID = 3)
  • Job (EndOfDayJob)
    • 2개의 JobInstance를 갖고 있다. (JOB_INST_ID 로 구분되고 있다.)
  • JobInstance
    • 3개의 JobExecution을 갖고 있다. (JOB_EXECUTION_ID로 구분되고 있다.)
  • JobExecution
    • 3개의 JobExecution이 실행되었다.
      • JOB_EXEC_ID, JOB_INST_ID를 보면 
        • 1 / 1
        • 2 / 1
        • 3 / 2 로 구성되어있다.

2.0. Step 이란

 

  • Step은 Job의 순차적인 단계입니다.
  • Job과 마찬가지로 수행하는 개별 StepExecution (JobExecution과 함께 행동하는) 을 갖고 있습니다.

2.1. StepExecution

 

  • Step이 실행될 때 하나의 StepExecution이 생성됩니다.
  • 아래와 같은 property들을 갖고있습니다.
프로퍼티 명 설명
Status 위와 동일합니다.
startTime 위와 동일합니다.
endTime 위와 동일합니다.
exitStatus 위와 동일합니다.
executionContext 위와 동일합니다.
readCount 성공적으로 read된 Item(아래에서 설명) 개수(count)를 갖고있습니다.
writeCount 성공적으로 write된 Item(아래에서 설명) 개수를 갖고있습니다.
commitCount transaction 내에 commit된 execution의 개수를 갖고있습니다.
rollbackCount 롤백된 Step의 개수를 갖고있습니다.
readSkipCount Skip으로 인해 실패한 read의 개수를 갖고있습니다.
processSkipCount 실패한 process의 개수를 갖고있습니다.
filterCount ItemProcessor(아래에서 설명) 에 의해 필터링된 개수를 갖고있습니다.
writeSkipCount Skip으로 실패한 write의 개수를 갖고있습니다.

3.0. ExecutionContext

 

  • JobExecution / StepExecution의 값을 저장하는 key/value 쌍의 컬렉션입니다.

  • 주기적으로 커밋지점에 ExecutionContext를 유지하여, ItemReader가 오류로 실패한 경우, 상태를 저장할 수 있습니다.

  • 가정
    • file을 읽어서 database에 저장하는 시나리오
  • 위의 그림처럼, STEP_EXEC_ID 를 30분동안 수행하던 중, FAILED가 됐습니다.
    • "piece.count=40321 [ 40321번째 piece (해당 가정에서는 40321번째 파일이거나 라인이겠죠) 에서 실패했다." 라는 정보가 들어있습니다.

4.0 JobRepository

 

  • JobLauncher / Job / Step 등을 persistence 하는 저장소입니다. (CRUD)
  • @EnableBatchProcessing 을 통해 제공됩니다.

5.0 ItemReader

 

  • Step에 대한 Input을 제공합니다.
  • File / XML / Json 등 데이터를 읽어들입니다.

6.0 ItemReader

 

  • Step에 대한 Output을 출력하는 기능을 제공합니다.

7.0 ItemProcessor

 

  • ItemReader에서 읽어온 데이터를 처리합니다.

  • 처리 이후 ItemWriter에게 제공합니다.

'Batch' 카테고리의 다른 글

스프링배치 scope  (0) 2021.04.04