아래의 링크를 참고하여 배치에서 사용하는 도메인을 정리합니다.
아직 부족한 실력이어서 틀린 부분이 있을 수 있습니다.
틀린 부분이 있다면 댓글이나 robin00q@naver.com으로 이메일주시면 반영하겠습니다.
docs.spring.io/spring-batch/docs/current/reference/html/domain.html#domainLanguageOfBatch
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 에 실행되는 JobInstance / 2020/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)
- 현재 첫번째 실행한 JobExecution이 실패했다는 가정입니다.
- 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 로 구성되어있다.
- JOB_EXEC_ID, JOB_INST_ID를 보면
- 3개의 JobExecution이 실행되었다.
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 |
---|