Spring Batch
์ ์์๋์ Spring Boot ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ๋ Spring Batch ๊ฐ์๋ฅผ ์์ฝํ ๋ด์ฉ์ ๋๋ค.
Intro
docker mysql
# download mysql image
docker pull --platform linux/amd64 mysql:8.0.28
# check images
docker images
# create conatiner
docker run --platform linux/amd64 --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0.28
# execute mysql
docker exec -it mysql bash
# root login
mysql -uroot -p1234
# checker process
docker ps
# stop conatiner
docker stop mysql๊ฐ์
ํต์ฌ ํจํด
Read: ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ์ผ, ํ์์ ๋ค๋์ ๋ฐ์ดํฐ ์กฐํ
Process: ํน์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ ๊ฐ๊ณต
Write: ์์ ๋ ์์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ์ฅ
์ํคํ ์ฒ
Application
๋ชจ๋ ๋ฐฐ์น Job, ์ปค์คํ ์ฝ๋ ํฌํจ
์ ๋ฌด๋ก์ง ๊ตฌํ์๋ง ์ง์คํ๊ณ ๊ณตํต ๊ธฐ์ ์ ํ๋ ์์ํฌ๊ฐ ๋ด๋น
Batch Core
Job ์คํ, ๋ชจ๋ํฐ๋ง, ๊ด๋ฆฌ API๋ก ๊ตฌ์ฑ
JobLauncher, Job, Step, Flow ..
Batch Infrastructure
Application, Core ๋ชจ๋ ๊ณตํต Infrastructure ์์์ ๋น๋
Job ์คํ ํ๋ฆ๊ณผ ์ฒ๋ฆฌ๋ฅผ ์ํ ํ ์ ๊ณต
Reader, Processor Writer, Skip, Retry ..
์คํ๋ง ๋ฐฐ์น ํ์ฑํ
@EnableBatchProcessing์ด 4๊ฐ์ ์ค์ ํด๋์ค๋ฅผ ์คํ์ํค๋ฉฐ ์คํ๋ง ๋ฐฐ์น์ ๋ชจ๋ ์ด๊ธฐํ ๋ฐ ์คํ ๊ตฌ์ฑ
BatchAutoConfiguration์คํ๋ง ๋ฐฐ์น๊ฐ ์ด๊ธฐํ ๋ ๋ ์๋์ผ๋ก ์คํ๋๋ ์ค์ ํด๋์ค
Job์ ์ํํ๋ JobLauncherApplicationRunner ๋น ์์ฑ
SimpleBatchConfigurationJobBuilderFactory ์ StepBuilderFactory ์์ฑ
์คํ๋ง ๋ฐฐ์น์ ์ฃผ์ ๊ตฌ์ฑ ์์ ์์ฑ -> ํ๋ก์ ๊ฐ์ฒด๋ก ์์ฑ
BatchConfigurerConfiguration
BasicBatchConfigurerSimpleBatchConfiguration ์์ ์์ฑํ ํ๋ก์ ๊ฐ์ฒด์ ์ค์ ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ค์ ํด๋์ค
๋น์ผ๋ก ์์กด์ฑ ์ฃผ์ ๋ฐ์์ ์ฃผ์ ๊ฐ์ฒด๋ค์ ์ฐธ์กฐํด์ ์ฌ์ฉ
JpaBatchConfigurerJPA ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ค์ ํด๋์ค
์คํ๋ง ๋ถํธ ๋ฐฐ์น์ ์๋ ์ค์ ํด๋์ค๊ฐ ์คํ๋จ์ผ๋ก ๋น์ผ๋ก ๋ฑ๋ก๋ ๋ชจ๋ Job์ ๊ฒ์ํด์ ์ด๊ธฐํ์ ๋์์ Job์ ์ํํ๋๋ก ๊ตฌ์ฑ
๊ธฐ๋ณธ ์ฝ๋
DB ์คํค๋ง
์คํ๋ง ๋ฐฐ์น์ ์คํ/๊ด๋ฆฌ๋ฅผ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฌ ๋๋ฉ์ธ(Job, Step, JobParameters..)์ ์ ๋ณด๋ค์ ์ ์ฅ/์ ๋ฐ์ดํธ/์กฐํํ ์ ์๋ ์คํค๋ง ์ ๊ณต
๊ณผ๊ฑฐ, ํ์ฌ์ ์คํ์ ๋ํ ์ ๋ณด, ์ฑ๊ณต๊ณผ ์คํจ ์ฌ๋ถ ๋ฑ์ ๊ด๋ฆฌํ์ฌ ๋ฐฐ์น์ด์ฉ ๋ฆฌ์คํฌ ๋ฐ์ ์ ๋น ๋ฅธ ๋์ฒ ๊ฐ๋ฅ
DB ์ฐ๋ ์ ๋ฉํ ํ ์ด๋ธ ์์ฑ ํ์
DB ์คํค๋ง๋ ์ ํ๋ณ๋ก ์ ๊ณต (/org/springframework/batch/core/schema-*.sql)
์คํค๋ง๋ ์๋ ๋๋ ์๋์ผ๋ก ์์ฑ ๊ฐ๋ฅ(์๋ ์์ฑ ์ spring.batch.jdbc.initialize-schema ์ค์ )
ALWAYS: ์คํฌ๋ฆฝํธ ํญ์ ์คํ(RDBMS ์ค์ ์ด ๋์ด ์์ ๊ฒฝ์ฐ ๋ด์ฅ DB ๋ณด๋ค ๋จผ์ ์คํ)EMBEDDED: ๋ด์ฅ DB์ผ ๋๋ง ์คํ, ์คํค๋ง ์๋ ์์ฑ(default)NEVER: ์คํฌ๋ฆฝํธ ํญ์ ์คํ ์ํจ(๋ด์ฅ DB์ผ๊ฒฝ์ฐ ์คํฌ๋ฆฝํธ๊ฐ ์์ฑ๋์ง ์์ผ๋ฏ๋ก ์ค๋ฅ ๋ฐ์)์ด์์์ ์๋์ผ๋ก ์คํฌ๋ฆฝํธ ์์ฑ ํ ์ค์ ๊ถ์ฅ

๊ด๋ จ ํ ์ด๋ธ
Job ๊ด๋ จ ํ ์ด๋ธ
BATCH_JOB_INSTANCEJob ์ด ์คํ๋ ๋ JobInstance ์ ๋ณด๊ฐ ์ ์ฅ๋๋ฉฐ job_name๊ณผ job_key๋ฅผ ํค๋ก ํ์ฌ ํ๋์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ
๋์ผํ job_name ๊ณผ job_key ๋ก ์ค๋ณต ์ ์ฅ๋ ์ ์๋ค
1,0,Job,0c5cf62846f98c894b8dce3de3433509
BATCH_JOB_EXECUTIONjob ์ ์คํ์ ๋ณด๊ฐ ์ ์ฅ๋๋ฉฐ Job ์์ฑ, ์์, ์ข ๋ฃ ์๊ฐ, ์คํ์ํ, ๋ฉ์์ง ๋ฑ์ ๊ด๋ฆฌ
1,2,1,2023-01-23 00:16:14.365000,2023-01-23 00:16:14.452000,2023-01-23 00:16:14.645000,COMPLETED,COMPLETED,"",2023-01-23 00:16:14.646000,
BATCH_JOB_EXECUTION_PARAMSJob๊ณผ ํจ๊ป ์คํ๋๋ JobParameter ์ ๋ณด๋ฅผ ์ ์ฅ
2,STRING,name,user1,1970-01-01 09:00:00,0,0,Y
2,LONG,seq,"",1970-01-01 09:00:00,1,0,Y
2,DATE,date,"",2023-01-23 00:16:14.666000,0,0,Y
2,DOUBLE,age,"",1970-01-01 09:00:00,0,29.5,Y
BATCH_JOB_EXECUTION_CONTEXTJob ์ ์คํ๋์ ์ฌ๋ฌ๊ฐ์ง ์ํ์ ๋ณด, ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ (Json ํ์) ํด์ ์ ์ฅ
Step ๊ฐ ์๋ก ๊ณต์ ๊ฐ๋ฅํจ
1,"{""@class"":""java.util.HashMap""}",
Step ๊ด๋ จ ํ ์ด๋ธ
BATCH_STEP_EXECUTIONStep ์ ์คํ์ ๋ณด๊ฐ ์ ์ฅ๋๋ฉฐ ์์ฑ, ์์, ์ข ๋ฃ ์๊ฐ, ์คํ์ํ, ๋ฉ์์ง ๋ฑ์ ๊ด๋ฆฌ
1,3,step1,1,2023-01-23 00:16:14.507000,2023-01-23 00:16:14.551000,COMPLETED,1,0,0,0,0,0,0,0,COMPLETED,"",2023-01-23 00:16:14.552000
BATCH_STEP_EXECUTION_CONTEXTStep ์ ์คํ๋์ ์ฌ๋ฌ๊ฐ์ง ์ํ์ ๋ณด, ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ (Json ํ์) ํด์ ์ ์ฅ
Step ๋ณ๋ก ์ ์ฅ๋๋ฉฐ Step ๊ฐ ์๋ก ๊ณต์ ํ ์ ์์
1,"{""@class"":""java.util.HashMap"",""batch.taskletType"":""io.springbatch.springbatchlecture.job.JobConfiguration$1"",""batch.stepType"":""org.springframework.batch.core.step.tasklet.TaskletStep""}",
์คํ๋ง ๋ฐฐ์น ๋๋ฉ์ธ
Job
Job
๋ฐฐ์น ๊ณ์ธต ๊ตฌ์กฐ์์ ๊ฐ์ฅ ์์์ ์๋ ๊ฐ๋ ์ผ๋ก ํ๋์ ๋ฐฐ์น์์ ์์ฒด๋ฅผ ์๋ฏธ
Job Configuration ์ ํตํด ์์ฑ๋๋ ๊ฐ์ฒด ๋จ์๋ก, ๋ฐฐ์น์์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๊ณ ์คํํ ๊ฒ์ธ์ง ์ ์ฒด์ ์ผ๋ก ์ค์ ํ๊ณ ๋ช ์ธํด ๋์ ๊ฐ์ฒด
๋ฐฐ์น Job ๊ตฌ์ฑ์ ์ํ ์ต์์ ์ธํฐํ์ด์ค, ์คํ๋ง ๋ฐฐ์น๊ฐ ๊ธฐ๋ณธ ๊ตฌํ์ฒด ์ ๊ณต
์ฌ๋ฌ Step ์ ํฌํจํ๋ ์ปจํ ์ด๋, ๋ฐ๋์ ํ ๊ฐ ์ด์์ Step์ผ๋ก ๊ตฌ์ฑ
๊ธฐ๋ณธ ๊ตฌํ์ฒด
SimpleJob
์์ฐจ์ ์ผ๋ก Step ์ ์คํ์ํค๋ Job
๋ชจ๋ Job์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ํ์ค ๊ธฐ๋ฅ์ ๊ฐ์
FlowJob
ํน์ ํ ์กฐ๊ฑด๊ณผ ํ๋ฆ์ ๋ฐ๋ผ Step ์ ๊ตฌ์ฑํ์ฌ ์คํ์ํค๋ Job
Flow ๊ฐ์ฒด๋ฅผ ์คํ์์ผ์ ์์ ์ ์งํ

JobInstance
BATCH_JOB_INSTANCE
Job ์คํ ์(SimpleJob) ์์ฑ๋๋ Job ์ ๋ ผ๋ฆฌ์ ์คํ ๋จ์ ๊ฐ์ฒด (๊ณ ์ ํ๊ฒ ์๋ณ ๊ฐ๋ฅํ ์์ ์คํ์ ๋ํ๋)
Job ๊ณผ ์ค์ /๊ตฌ์ฑ์ ๋์ผํ์ง๋ง, Job ์คํ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ด์ฉ์ ๋ค๋ฅด๋ฏ๋ก Job ์คํ ๊ตฌ๋ถ์ด ํ์
ex. ํ๋ฃจ ํ ๋ฒ์ฉ ๋ฐฐ์น Job์ด ์คํ๋๋ค๋ฉด, ๋งค์ผ ์คํ๋๋ ๊ฐ๊ฐ์ Job ์ JobInstance ๋ก ํํ
JobInstance ์์ฑ ๋ฐ ์คํ
์ฒ์ ์์ : [Job + JobParameter] ์ ์๋ก์ด JobInstance ์์ฑ
์ด์ ๊ณผ ๋์ผํ [Job + JobParameter] ์ผ๋ก ์คํ : ์ด๋ฏธ ์กด์ฌํ๋ JobInstance ๋ฆฌํด -> ์์ธ ๋ฐ์ ๋ฐ ๋ฐฐ์น ์คํจ
JobName + jobKey(jobParametes ์ ํด์๊ฐ) ๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ ์ค๋ณต ์ ์ฅ ๋ถ๊ฐ
Job : 1 - JobInstance : N

JobParameters
BATCH_JOB_EXECUTION_PARAMS
job ์คํ ์ ํจ๊ป ํฌํจ๋์ด ์ฌ์ฉ๋๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ๋๋ฉ์ธ ๊ฐ์ฒด
ํ๋์ Job์ ์กด์ฌํ ์ ์๋ ์ฌ๋ฌ๊ฐ์ JobInstance ๊ตฌ๋ถ
JobParameters : 1 - JobInstance : 1
์์ฑ ๋ฐ ๋ฐ์ธ๋ฉ
์ดํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ฃผ์
Java -jar LogBatch.jar requestDate(date)=2021/01/01 name=user seq(long)=2L age(double)=29.5
์ฝ๋๋ก ์์ฑ
JobParameterBuilder, DefaultJobParametersConverter
SpEL ์ด์ฉ
@Value(โ#{jobParameter[requestDate]}โ), @JobScope, @StepScope ์ ์ธ ํ์
JOB_EXECUTION : 1 - BATCH_JOB_EXECUTION_PARAM : N
์คํ ์ Arguments : job.name=JobParameter date(date)=2021/01/01 name=user seq(long)=2L age(double)=29.5

JobExecution
BATCH_JOB_EXECUTION
JobIstance(๋์ผํ JobParameter)์ ๋ํ ํ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด
Job ์คํ ์ค ๋ฐ์ํ ์ ๋ณด๋ค์ ์ ์ฅ -> ์์์๊ฐ, ์ข ๋ฃ์๊ฐ, ์ํ(์์/์๋ฃ/์คํจ), ์ข ๋ฃ์ํ
JobExecution ์ 'FAILED' ๋๋ 'COMPLETEDโ ๋ฑ์ Job ์คํ ๊ฒฐ๊ณผ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์
์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ 'COMPLETEDโ ์ผ ๊ฒฝ์ฐ, JobInstance ์คํ์ด ์๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํด์ ์ฌ ์คํ ๋ถ๊ฐ
์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ 'FAILEDโ ์ผ ๊ฒฝ์ฐ, JobInstance ์คํ์ด ์๋ฃ๋์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํด์ ์ฌ์คํ ๊ฐ๋ฅ
์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ 'COMPLETEDโ ๋ ๋๊น์ง ํ๋์ JobInstance ๋ด์์ ์ฌ๋ฌ ๋ฒ์ ์๋ ๋ฐ์ ๊ฐ๋ฅ
BATCH_JOB_INSTANCE : 1 - BATCH_JOB_EXECUTION : N๊ด๊ณ๋ก์
JobInstance ์ ๋ํ ์ฑ๊ณต/์คํจ์ ๋ด์ญ์ ๋ณด์
JobExecution.java

Step
Step
Batch job์ ๊ตฌ์ฑํ๋ ๋ ๋ฆฝ์ ์ธ ํ๋์ ๋จ๊ณ
์ค์ ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ์ ์ํ๊ณ ์ปจํธ๋กคํ๋๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋๋ฉ์ธ ๊ฐ์ฒด
๋จ์ํ ๋จ์ผ ํ์คํฌ ๋ฟ ์๋๋ผ, ์ ๋ ฅ, ์ฒ๋ฆฌ, ์ถ๋ ฅ ๊ด๋ จ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ๋ ๋ชจ๋ ์ค์ ๋ค์ ๋ด์
๋ฐฐ์น์์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๊ณ ์คํํ ๊ฒ์ธ์ง Job์ ์ธ๋ถ ์์ ์ Task ๊ธฐ๋ฐ์ผ๋ก ์ค์ ํ๊ณ ๋ช ์ธ
๋ชจ๋ Job์ ํ๋ ์ด์์ step์ผ๋ก ๊ตฌ์ฑ
๊ธฐ๋ณธ ๊ตฌํ์ฒด
TaskletStep
๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ํด๋์ค. Tasklet ํ์ ๊ตฌํ์ฒด๋ค์ ์ ์ด
์ง์ ์์ฑํ Tasklet ์คํ
ChunkOrientedTasklet ์ ์คํ
PartitionStep
๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก Step์ ์ฌ๋ฌ ๊ฐ๋ก ๋ถ๋ฆฌํด์ ์คํ
JobStep
Step ๋ด์์ Job ์คํ
FlowStep
Step ๋ด์์ Flow ์คํ

StepExecution
BATCH_STEP_EXECUTION
Step์ ๋ํ ํ ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด (Step ์คํ ์ค ๋ฐ์ํ ์ ๋ณด๋ค์ ์ ์ฅ)
์์์๊ฐ, ์ข ๋ฃ์๊ฐ, ์ํ(์์,์๋ฃ,์คํจ), commit count, rollback count ๋ฑ์ ์์ฑ์ ๊ฐ์ง
Step์ด ๋งค๋ฒ ์๋๋ ๋๋ง๋ค ์์ฑ๋๋ฉฐ ๊ฐ Step ๋ณ๋ก ์์ฑ
Job์ด ์ฌ์์ ํ๋๋ผ๋ ์ด๋ฏธ ์๋ฃ๋ Step์ ์ฌ์คํ๋์ง ์๊ณ ์คํจํ Step๋ง ์คํ
์ด์ ๋จ๊ณ Step์ด ์คํจํด์ ํ์ฌ Step์ ์คํํ์ง ์์๋ค๋ฉด StepExecution์ ์์ฑํ์ง ์๊ณ , ์์๋์์ ๋๋ง StepExecution ์์ฑ
JobExecution
Step์ StepExecution ์ด ๋ชจ๋ ์ ์์ ์ผ๋ก ์๋ฃ๋์ด์ผ JobExecution ์ ์ ์๋ฃ(COMPLETED)
Step์ StepExecution ์ค ํ๋๋ผ๋ ์คํจํ๋ฉด JobExecution ์คํจ(FAILED)
BATCH_JOB_EXECUTION : 1 - BATCH_STEP_EXECUTION : N
StepExecution.java

Job: ํ๋์ ๋ฐฐ์น์์ ์์ฒด (๋ ๊ฐ์ Step์ผ๋ก ๊ตฌ์ฑ)
JobInstance: Job ์คํ ์ ์์ฑ๋๋ Job ์ ๋ ผ๋ฆฌ์ ์คํ ๋จ์ ๊ฐ์ฒด
JobExecution: JobIstance ์ ๋ํ ํ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด
StepExecution: Step์ ๋ํ ํ ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด
StepContribution
์ฒญํฌ ํ๋ก์ธ์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฒํผ๋ง ํ ํ StepExecution ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋๋ฉ์ธ ๊ฐ์ฒด
์ฒญํฌ ์ปค๋ฐ ์ง์ ์ StepExecution apply ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ํ๋ฅผ ์ ๋ฐ์ดํธ
ExitStatus ๊ธฐ๋ณธ ์ข ๋ฃ์ฝ๋ ์ธ ์ฌ์ฉ์ ์ ์ ์ข ๋ฃ์ฝ๋๋ฅผ ์์ฑํด์ ์ ์ฉ ๊ฐ๋ฅ
StepContribution.java

ExecutionContext
BATCH_STEP_EXECUTION_CONTEXT, BATCH_STEP_EXECUTION_CONTEXT
ํ๋ ์์ํฌ์์ ์ ์ง/๊ด๋ฆฌํ๋ ํค/๊ฐ ์ปฌ๋ ์
StepExecution ๋๋ JobExecution ๊ฐ์ฒด์ ์ํ ์ ์ฅ ๊ณต์ ๊ฐ์ฒด
DB์ ์ง๋ ฌํ๋ ๊ฐ์ผ๋ก ์ ์ฅ (ex. { โkeyโ : โvalueโ})
๊ณต์ ๋ฒ์
Step: ๊ฐ Step์ StepExecution์ ์ ์ฅ๋๋ฉฐ Step ๊ฐ ์๋ก ๊ณต์ ๋ถ๊ฐ
Job: ๊ฐ Job์ JobExecution์ ์ ์ฅ๋๋ฉฐ Job ๊ฐ ์๋ก ๊ณต์ ๋ถ๊ฐํ์ง๋ง, ํด๋น Job์ Step ๊ฐ ์๋ก ๊ณต์ ๊ฐ๋ฅ
Job ์ฌ์์ ์ ์ด๋ฏธ ์ฒ๋ฆฌํ Row ๋ฐ์ดํฐ๋ ๊ฑด๋๋ฐ๊ณ , ์ดํ ์ํ ์ ์ํ ์ ๋ณด ํ์ฉ
ExecutionContext.java
ExecutionContext ์ Job, Step ์ ๋ณด ์กฐํ

JobRepository
๋ฐฐ์น ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ ์ฅ์
Job์ ์ํ, ์ข ๋ฃ, ์คํ ํ์, ๊ฒฐ๊ณผ ๋ฑ ๋ฐฐ์น ์์ ์ ์ํ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ meta data ์ ์ฅ
JobLauncher, Job, Step ๊ตฌํ์ฒด ๋ด๋ถ์์ CRUD ๊ธฐ๋ฅ ์ฒ๋ฆฌ
@EnableBatchProcessing ์ ์ธ ์ ์๋์ผ๋ก ๋น ์์ฑ
BatchConfigurer ์ธํฐํ์ด์ค ๊ตฌํ, BasicBatchConfigurer ์์์ผ๋ก JobRepository ์ค์ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ
JDBC ๋ฐฉ์ ์ค์ : JobRepositoryFactoryBean
๋ด๋ถ์ ์ผ๋ก AOP ๊ธฐ์ ์ ํตํด ํธ๋์ญ์ ์ฒ๋ฆฌ
ํธ๋์ญ์ isolation ๊ธฐ๋ณธ๊ฐ์ ์ต๊ณ ์์ค์ธ SERIALIZEBLE (๋ค๋ฅธ ๋ ๋ฒจ๋ก ์ง์ ๊ฐ๋ฅ)
๋ฉํํ ์ด๋ธ์ Table Prefix ๋ณ๊ฒฝ ๊ฐ๋ฅ (๊ธฐ๋ณธ ๊ฐ์ "BATCH_")
In Memory ๋ฐฉ์ ์ค์ โ MapJobRepositoryFactoryBean
์ฑ๋ฅ ๋ฑ ์ด์ ๋ก ๋๋ฉ์ธ ์ค๋ธ์ ํธ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ
๋ณดํต Test, ํ๋กํ ํ์ ๋น ๋ฅธ ๊ฐ๋ฐ ์ ์ฌ์ฉ
JobRepository interface
JobLauncher
๋ฐฐ์น Job์ ์คํ์ํค๋ ์ญํ
Job, Job Parameters๋ฅผ ์ธ์๋ก ๋ฐ์ ์์ฒญ๋ ๋ฐฐ์น ์์ ์ํ ํ ์ต์ข client ์๊ฒ JobExecution ๋ฐํ
์คํ๋ง ๋ถํธ ๋ฐฐ์น๊ฐ ๊ตฌ๋๋๋ฉด JobLauncher Bean ์๋ ์์ฑ
Job ์คํ
JobLanucher.run(Job, JobParameters)
์คํ๋ง ๋ถํธ ๋ฐฐ์น์์ JobLauncherApplicationRunner๊ฐ ์๋์ผ๋ก JobLauncher ์คํ
๋๊ธฐ์ ์คํ
taskExecutor๋ฅผ SyncTaskExecutor๋ก ์ค์ ์(default. SyncTaskExecutor)
JobExecution ํ๋ ํ, ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ์ต์ข ์๋ฃํ ์ดํ Client์๊ฒ JobExecution ๋ฐํ
๋ฐฐ์น ์ฒ๋ฆฌ ์๊ฐ์ด ๊ธธ์ด๋ ์๊ด์๊ฑฐ๋, ์ค์ผ์ค๋ฌ์ ์ํ ๋ฐฐ์น์ฒ๋ฆฌ์ ์ ํฉ
๋น๋๊ธฐ์ ์คํ
taskExecutor๊ฐ SimpleAsyncTaskExecutor๋ก ์ค์ ํ ๊ฒฝ์ฐ
JobExecution ํ๋ ํ, Client์๊ฒ ๋ฐ๋ก JobExecution ๋ฐํ ๋ฐ ๋ฐฐ์น์ฒ๋ฆฌ ์๋ฃ
๋ฐฐ์น์ฒ๋ฆฌ ์๊ฐ์ด ๊ธธ ๊ฒฝ์ฐ ์๋ต์ด ๋ฆ์ด์ง์ง ์๋๋ก ํ๊ณ , HTTP ์์ฒญ์ ์ํ ๋ฐฐ์น์ฒ๋ฆฌ์ ์ ํฉ
์คํ๋ง ๋ฐฐ์น ์คํ
Job
๋ฐฐ์น ์ด๊ธฐํ ์ค์
JobLauncherApplicationRunner
Spring Batch ์์ ์ ์์ํ๋ ApplicationRunner(BatchAutoConfiguration์์ ์์ฑ)
์คํ๋ง ๋ถํธ ์ ๊ณต ApplicationRunner ๊ตฌํ์ฒด๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ๊ตฌ๋ ํ ์คํ
๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ผ๋ก ๋ฑ๋ก๋ ๋ชจ๋ job ์คํ
BatchProperties
Spring Batch ํ๊ฒฝ ์ค์ ํด๋์ค
Job name, ์คํค๋ง ์ด๊ธฐํ ์ค์ , ํ ์ด๋ธ Prefix ๋ฑ์ ์ค์
application.yml
Job ์คํ ์ต์
์ง์ ํ Batch Job๋ง ์คํํ๋๋ก ์ค์ ๊ฐ๋ฅ
spring.batch.job.names: ${job.name:NONE}
Program arguments ์ฌ์ฉ ์
JobBuilderFactory
JobBuilder ๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ ํด๋์ค
jobBuilderFactory.get("jobName") : ์คํ๋ง ๋ฐฐ์น๊ฐ Job ์คํ ์ ์ฐธ์กฐํ๋ Job ์ด๋ฆ
JobBuilder
Job ๊ตฌ์ฑ ์ค์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ๊ฐ์ ํ์ ๋น๋ ํด๋์ค๋ฅผ ์์ฑํ๊ณ ์ค์ Job ์์ฑ ์์
SimpleJobBuilder
SimpleJob ์ ์์ฑํ๋ Builder ํด๋์ค
Job ์คํ ๊ด๋ จ ์ฌ๋ฌ ์ค์ API ์ ๊ณต
FlowJobBuilder
FlowJob ์ ์์ฑํ๋ Builder ํด๋์ค
๋ด๋ถ์ ์ผ๋ก FlowBuilder ๋ฅผ ๋ฐํํ๋ฉฐ Flow ์คํ ๊ด๋ จ ์ฌ๋ฌ ์ค์ API ์ ๊ณต

JobBuilderFactory ํด๋์ค ์์ ๊ตฌ์กฐ

SimpleJob
JobBuilderFactory > JobBuilder > SimpleJobBuilder > SimpleJob
Step ์ ์คํ์ํค๋ Job ๊ตฌํ์ฒด(SimpleJobBuilder ์ ์ํด ์์ฑ)
์ฌ๋ฌ ๋จ๊ณ์ Step ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ Step ์ ์์ฐจ์ ์ผ๋ก ์คํ
๋ชจ๋ Step ์คํ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ด์ผ Job ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ
๋งจ ๋ง์ง๋ง ์คํ Step ์ BatchStatus ๊ฐ Job ์ ์ต์ข BatchStatus
SimpleJob API
jobBuilderFactory.
get("batchJob") // JobBuilder ์์ฑ ํฉํ ๋ฆฌ, Job ์ด๋ฆ์ - ๋งค๊ฐ๋ณ์๋ก.
start(Step) // ์ฒ์ ์คํ ํ Step ์ค์ , ์ต์ด ํ๋ฒ ์ค์ , ์คํ ์ SimpleJobBuilder ๋ฐํ.
next(Step) // ๋ค์ ์คํ ํ Step ์ค์ , ํ์๋ ์ ํ ์์ผ๋ฉฐ ๋ชจ๋ next()์ Step์ด ์ข ๋ฃ๋๋ฉด Job ์ข ๋ฃ.
incrementer(JobParametersIncrementer) // Job ์คํ๋ง๋ค JobParameter ๊ฐ ์๋ ์ฆ๊ฐ ์ค์ JobParameters ์ ํ์ํ ๊ฐ์ ์ฆ๊ฐ์์ผ ๋ค์ ์ฌ์ฉ๋ JobParameters ์ค๋ธ์ ํธ ๋ฆฌํด
๊ธฐ์กด JobParameter ๋ณ๊ฒฝ์์ด Job ์ ์ฌ๋ฌ ๋ฒ ์์ํ๊ณ ์ ํ ๊ฒฝ์ฐ ์ฌ์ฉ
RunIdIncrementer ๊ตฌํ์ฒด๋ฅผ ์ง์ํ๋ฉฐ ์ธํฐํ์ด์ค ์ง์ ๊ตฌํ ๊ฐ๋ฅ
.
preventRestart(true) // Job ์ฌ์์ ๊ฐ๋ฅ ์ฌ๋ถ ์ค์ (default. true)Job ์ฌ์์ ์ฌ๋ถ ์ค์
Job ์คํ์ด ์ฒ์์ด ์๋ ๊ฒฝ์ฐ Job ์ฑ๊ณต/์คํจ์ ์๊ด์์ด preventRestart ์ค์ ์ ๋ฐ๋ผ ์คํ ์ฌ๋ถ ํ๋จ
.
validator(JobParameterValidator) // ์คํ ์ JobParameter ๊ฒ์ฆ ์ค์ DefaultJobParametersValidator ๊ตฌํ์ฒด ์ง์. ์ธํฐํ์ด์ค ์ง์ ๊ตฌํ ๊ฐ๋ฅ
Job Repository ์์ฑ ์ (SimpleJobLauncher), Job ์ํ ์ (AbstractJob) ๊ฒ์ฆ
.
listener(JobExecutionListener) // Job ๋ผ์ดํ ์ฌ์ดํด์ ํน์ ์์ ์ ์ฝ๋ฐฑ์ - ์ ๊ณต๋ฐ๋๋ก ์ค์ .build(); // SimpleJob ์์ฑ

Step
StepBuilderFactory
StepBuilder ๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ ํด๋์ค
StepBuilder
Step ์ ๊ตฌ์ฑํ๋ ์ค์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค์ฏ ๊ฐ์ ํ์ ๋น๋ ํด๋์ค ์์ฑ ๋ฐ ์ค์ Step ์์ฑ ์์
TaskletStepBuilder
TaskletStep ์ ์์ฑํ๋ ๊ธฐ๋ณธ ๋น๋ ํด๋์ค
SimpleStepBuilder
TaskletStep ์ ์์ฑํ๋ฉฐ ๋ด๋ถ์ ์ผ๋ก ์ฒญํฌ๊ธฐ๋ฐ์ ์์ ์ ์ฒ๋ฆฌํ๋ ChunkOrientedTasklet ํด๋์ค ์์ฑ
PartitionStepBuilder
PartitionStep ์ ์์ฑํ๋ฉฐ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก Job ์คํ
JobStepBuilder
JobStep ์ ์์ฑํ์ฌ Step ์์์ Job ์คํ
FlowStepBuilder
FlowStep ์ ์์ฑํ์ฌ StTaskletStepep ์์์ Flow ์คํ


TaskletStep
StepBuilderFactory > StepBuilder > TaskletStepBuilder > TaskletStep
Step ๊ตฌํ์ฒด. Tasklet ์ ์คํ์ํค๋ ๋๋ฉ์ธ ๊ฐ์ฒด
RepeatTemplate ์ ์ฌ์ฉํด์ Tasklet ๊ตฌ๋ฌธ์ ํธ๋์ญ์ ๊ฒฝ๊ณ ๋ด์์ ๋ฐ๋ณต ์คํ
Step ์ ์คํ ๋จ์๋ก Task ๊ธฐ๋ฐ๊ณผ Chunk ๊ธฐ๋ฐ์ผ๋ก ๋๋์ด์ Tasklet ์คํ
chunk ๊ธฐ๋ฐ
ํ๋์ ํฐ ๋ฉ์ด๋ฆฌ๋ฅผ N๊ฐ์ฉ ๋๋ ์ ์คํ. ๋๋ ์ฒ๋ฆฌ์ ํจ๊ณผ์
ItemReader, ItemProcessor, ItemWriter ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฒญํฌ ๊ธฐ๋ฐ ์ ์ฉ Tasklet ์ธ ChunkOrientedTasklet ๊ตฌํ์ฒด ์ ๊ณต
Task ๊ธฐ๋ฐ
์ฒญํฌ ๊ธฐ๋ฐ ์์ ๋ณด๋ค ๋จ์ผ ์์ ๊ธฐ๋ฐ ์ฒ๋ฆฌ์ ํจ์จ์
์ฃผ๋ก Tasklet ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ
๋๋ ์ฒ๋ฆฌ ์ chunk ๊ธฐ๋ฐ์ ๋นํด ๋ ๋ณต์กํ ๊ตฌํ ํ์

stepBuilderFactory.
get(โbatchStep") : StepBuilder ์์ฑ ํฉํ ๋ฆฌ.
tasklet(Tasklet) : Tasklet ํด๋์ค ์ค์ (Task ๊ธฐ๋ฐ), TaskletStepBuilder ๋ฐํStep ๋ด์์ ๊ตฌ์ฑ๋๊ณ ์คํ๋๋ ๋๋ฉ์ธ ๊ฐ์ฒด(์ฃผ๋ก ๋จ์ผ ํ์คํฌ ์ํ)
TaskletStep ์ ์ํด ๋ฐ๋ณต์ ์ผ๋ก ์ํ๋๋ฉฐ ๋ฐํ๊ฐ(RepeatStatus)์ ๋ฐ๋ผ ๋ฐ๋ณต ํน์ ์ข ๋ฃ
Step ์ ์ค์ง ํ๋์ Tasklet ์ค์ ๊ฐ๋ฅ
.<String, String>
chunk(100) : Chunk ๊ธฐ๋ฐ.
startLimit(10) (default. INTEGER.MAX_VALUE)Step ์คํ ํ์ ์ค์ , ์ค์ ํ ๋งํผ ์คํ๋๊ณ ์ด๊ณผ์ ์ค๋ฅ(StartLimitExceededException) ๋ฐ์
.
allowStartIfComplete(true)Step ์ฑ๊ณต, ์คํจ ์๊ด์์ด ํญ์ Step ์คํ์ ์ํ ์ค์
์คํ ๋ง๋ค ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ฑฐ๋, ์ฌ์ ์์ ์ด ๊ผญ ํ์ํ Step ๋ฑ ์ ์ฉ
.
listener(StepExecutionListener) : Step ๋ผ์ดํ ์ฌ์ดํด ํน์ ์์ ์ ์ฝ๋ฐฑ ์ค์ .
build(); : TaskletStep ์์ฑ

JobStep
Job ์ ์ํ๋ Step ์ค ์ธ๋ถ์ Job ์ ํฌํจํ๊ณ ์๋ Step
์ธ๋ถ Job ์คํจ ์ ํด๋น Step ์ด ์คํจํ๋ฏ๋ก ๊ฒฐ๊ตญ ์ต์ข ๊ธฐ๋ณธ Job ๋ ์คํจ
๋ฉํ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ Job, ์ธ๋ถ Job ๋ณ๋ก ๊ฐ๊ฐ ์ ์ฅ
์ปค๋ค๋ ์์คํ ์ ์์ ๋ชจ๋๋ก ๋ถ๋ฆฌํ๊ณ job ํ๋ฆ์ ๊ด๋ฆฌํ ๊ฒฝ์ฐ ์ฌ์ฉ
.
stepBuilderFactory
.get("jobStep") : StepBuilder ์์ฑ ํฉํ ๋ฆฌ.job(Job) : JobStep ๋ด์์ ์คํ ๋ Job ์ค์ (JobStepBuilder ๋ฐํ).launcher(JobLauncher) : Job ์ ์คํํ JobLauncher ์ค์ .parametersExtractor(JobParametersExtractor) : Step์ ExecutionContext๋ฅผ Job์ด ์คํ๋๋ ๋ฐ ํ์ํ JobParameters๋ก ๋ณํ.build() : JobStep ์ ์์ฑ
Flow
FlowJob
JobBuilderFactory > JobBuilder > JobFlowBuilder > FlowBuilder > FlowJob
Step ์์ฐจ์ ๊ตฌ์ฑ์ด ์๋ ํน์ ์ํ์ ๋ฐ๋ผ ํ๋ฆ์ ์ ํํ๋๋ก ๊ตฌ์ฑ (FlowJobBuilder์ ์ํ ์์ฑ)
Step์ด ์คํจ ํ๋๋ผ๋ Job ์ ์คํจ๋ก ๋๋์ง ์๋๋ก ํด์ผ ํ๋ ๊ฒฝ์ฐ
Step์ด ์ฑ๊ณต ํ์ ๋ ๋ค์์ ์คํํด์ผ ํ Step ์ ๊ตฌ๋ถํด์ ์คํ ํด์ผ ํ๋ ๊ฒฝ์ฐ
ํน์ Step์ ์ ํ ์คํ๋์ง ์๋๋ก ๊ตฌ์ฑ ํด์ผ ํ๋ ๊ฒฝ์ฐ
Flow, Job ํ๋ฆ์ ๊ตฌ์ฑํ๋๋ฐ๋ง ๊ด์ฌํ๊ณ ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ Step ์์ ์ํ
๋ด๋ถ์ ์ผ๋ก SimpleFlow ๊ฐ์ฒด๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ Job ์คํ ์ ํธ์ถ
Flow(start, from, next)๋ ํ๋ฆ์ ์ ์ํ๋ ์ญํ ์ ํ๊ณ , ๋๋จธ์ง Transition๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ํ๋ฆ์ ์ ํ์ํค๋ ์ญํ
jobBuilderFactory
.get(โbatchJob").start(Step) : ์ฒ์ ์คํ Step or Flow ์ค์ flow ์ค์ ์ JobFlowBuilder ๋ฐํ
step ์ค์ ์ SimpleJobBuilder ๋ฐํ
.on(String pattern)Step ์คํ ๊ฒฐ๊ณผ๋ก ๋๋ ค๋ฐ๋ ์ข ๋ฃ์ํ(ExitStatus)๋ฅผ ๋งค์นญ(TransitionBuilder ๋ฐํ)
ExitStatus ๋งค์นญ์ด ๋๋ฉด ๋ค์์ผ๋ก ์คํํ Step ์ง์ ๊ฐ๋ฅ
ํน์๋ฌธ์๋ ๋ ๊ฐ์ง๋ง ํ์ฉ(*, ?)
.to(Step)๋ค์์ผ๋ก ์คํํ Step
.from(Step)์ด์ ๋จ๊ณ์์ ์ ์ํ Step Flow ์ถ๊ฐ ์ ์
.stop()/.fail()/.end()/.stopAndRestart()Flow ์ค์ง/์คํจ/์ข ๋ฃ ์ํ
.next(Step) : ๋ค์์ผ๋ก ์ด๋ํ StepStep or Flow or JobExecutionDecider
.end() : build() ์์ ์์นํ๋ฉด FlowBuilder ์ข ๋ฃ ๋ฐ SimpleFlow ๊ฐ์ฒด ์์ฑ.build() : FlowJob ์์ฑ ๋ฐ flow ํ๋์ SimpleFlow ์ ์ฅ

Transition
Flow ๋ด Step ์กฐ๊ฑด๋ถ ์ ํ ์ ์
on(String pattern) ๋ฉ์๋ ํธ์ถ ์ TransitionBuilder๋ฅผ ๋ฐํํ์ฌ Transition Flow ๊ตฌ์ฑ
Step ์ข ๋ฃ์ํ(ExitStatus)๊ฐ pattern๊ณผ ๋งค์นญ๋์ง ์์ผ๋ฉด ์คํ๋ง ๋ฐฐ์น์์ ์์ธ ๋ฐ์ ๋ฐ Job ์คํจ
๊ตฌ์ฒด์ ์ธ ๊ฒ๋ถํฐ ๊ทธ๋ ์ง ์์ ์์๋ก ์ ์ฉ
on(), to(), stop()/fail()/end()/stopAndRestart()
stop()
FlowExecutionStatus STOPPED ์ํ๋ก ์ข ๋ฃ
Job์ BatchStatus, ExitStatus STOPPED์ผ๋ก ์ข ๋ฃ
fail()
FlowExecutionStatus FAILED ์ํ๋ก ์ข ๋ฃ
Job์ BatchStatus, ExitStatus FAILED์ผ๋ก ์ข ๋ฃ
end()
FlowExecutionStatus COMPLETED ์ํ๋ก ์ข ๋ฃ
Job์ BatchStatus, ExitStatus COMPLETED์ผ๋ก ์ข ๋ฃ
Step์ ExitStatus๊ฐ FAILED ์ด๋๋ผ๋ Job์ BatchStatus๊ฐ COMPLETED๋ก ์ข ๋ฃํ๋๋ก ๊ฐ๋ฅ์ง๋ง Job ์ฌ์์์ ๋ถ๊ฐ๋ฅ
stopAndRestart(Step or Flow or JobExecutionDecider)
stop() transition๊ณผ ๊ธฐ๋ณธ ํ๋ฆ์ ๋์ผ
ํน์ step์์ ์์ ์ ์ค๋จํ๋๋ก ์ค์ ํ๋ฉด ์ค๋จ ์ด์ ์ Step๋ง COMPLETED ์ ์ฅ๋๊ณ ์ดํ์ step์ ์คํ๋์ง ์๊ณ STOPPED ์ํ๋ก Job ์ข ๋ฃ
Job ์ฌ์คํ ์ ์คํํด์ผ ํ step์ restart ์ธ์๋ก ๋๊ธฐ๋ฉด ์ด์ ์ COMPLETED๋ก ์ ์ฅ๋ step์ ๊ฑด๋๋ฐ๊ณ ์ค๋จ ์ดํ step๋ถํฐ ์์
๋ฐฐ์น ์ํ ์ ํ
BatchStatus
JobExecution, StepExecution ์์ฑ์ผ๋ก Job, Step ์ข ๋ฃ ํ ์ต์ข ๊ฒฐ๊ณผ ์ํ ์ ์
SimpleJob
๋ง์ง๋ง Step์ BatchStatus ๊ฐ์ Job ์ต์ข BatchStatus ๊ฐ์ผ๋ก ๋ฐ์
Step ์คํจ ์ ํด๋น Step์ด ๋ง์ง๋ง Step
FlowJob
Flow ๋ด Step์ ExitStatus ๊ฐ์ FlowExecutionStatus ๊ฐ์ผ๋ก ์ ์ฅ
๋ง์ง๋ง Flow์ FlowExecutionStatus ๊ฐ์ Job์ ์ต์ข BatchStatus ๊ฐ์ผ๋ก ๋ฐ์
ExitStatus
JobExecution, StepExecution์ ์์ฑ์ผ๋ก Job, Step ์คํ ํ ์ข ๋ฃ ์ํ ์ ์
๊ธฐ๋ณธ์ ์ผ๋ก ExitStatus๋ BatchStatus์ ๋์ผํ ๊ฐ์ผ๋ก ์ค์
SimpleJob
๋ง์ง๋ง Step์ ExitStatus ๊ฐ์ Job ์ต์ข ExitStatus ๊ฐ์ผ๋ก ๋ฐ์
FlowJob
Flow ๋ด Step ์ ExitStatus ๊ฐ์ FlowExecutionStatus ๊ฐ์ผ๋ก ์ ์ฅ
๋ง์ง๋ง Flow์ FlowExecutionStatus ๊ฐ์ Job์ ์ต์ข ExitStatus ๊ฐ์ผ๋ก ๋ฐ์
FlowExecutionStatus
FlowExecution ์์ฑ์ผ๋ก Flow ์คํ ํ ์ต์ข ๊ฒฐ๊ณผ ์ํ ์ ์
Flow ๋ด Step ์ด ์คํ๋๊ณ ExitStatus ๊ฐ์ FlowExecutionStatus ๊ฐ์ผ๋ก ์ ์ฅ
FlowJob ๋ฐฐ์น ๊ฒฐ๊ณผ ์ํ์ ๊ด์ฌ
์ฌ์ฉ์ ์ ์ ExitStatus
ExitStatus์ ์กด์ฌํ์ง ์๋ exitCode๋ฅผ ์๋กญ๊ฒ ์ ์
StepExecutionListener์ afterStep() ๋ฉ์๋์์ Custom exitCode ์์ฑ ํ ์๋ก์ด ExitStatus ๋ฐํ
Step ์คํ ํ ์๋ฃ ์์ ์์ ํ์ฌ exitCode๋ฅผ ์ฌ์ฉ์ ์ ์ exitCode๋ก ์์ ๊ฐ๋ฅ
JobExecutionDecider
ExitStatus๋ฅผ ์กฐ์ํ๊ฑฐ๋ StepExecutionListener๋ฅผ ๋ฑ๋กํ ํ์ ์์ด Transition ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ์ฉ ํด๋์ค
Step, Transiton ์ญํ ์ ๋ช ํํ ๋ถ๋ฆฌ
Step์ ExitStatus๊ฐ ์๋ JobExecutionDecider์ FlowExecutionStatus ์ํ๊ฐ์ ์๋กญ๊ฒ ์ค์ ํด์ ๋ฐํ

SimpleFlow
JobBuilderFactory > FlowJobBuilder > FlowBuilder > SimpleFlow
Flow ๊ตฌํ์ฒด๋ก์ ๊ฐ ์์(Step, Flow, JobExecutionDecider)๋ค์ ๋ด๊ณ ์๋ State๋ฅผ ์คํ์ํค๋ ๋๋ฉ์ธ ๊ฐ์ฒด
FlowBuilder๋ก ์์ฑํ๋ฉฐ Transition๊ณผ ์กฐํฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ Flow ๋ฐ ์ค์ฒฉ Flow๋ฅผ ๋ง๋ค์ด Job ๊ตฌ์ฑ ๊ฐ๋ฅ
jobBuilderFactory
.get("flowJob").start(flow1()) : Flow ์ ์.on("COMPLETED").to(flow2()) : Flow๋ฅผ transition๊ณผ ํจ๊ป ๊ตฌ์ฑ.end(): SimpleFlow ๊ฐ์ฒด ์์ฑ.build(): FlowJob ๊ฐ์ฒด ์์ฑ

SimpleFlow Architecture
StateMap์ ์ ์ฅ๋์ด ์๋ ๋ชจ๋ State๋ค์ handle ๋ฉ์๋๋ฅผ ํธ์ถํด์ ๋ชจ๋ Step ๋ค์ด ์คํ๋๋๋ก ํจ
ํ์ฌ ํธ์ถ๋๋ State๊ฐ ์ด๋ค ํ์ ์ธ์ง ๊ด์ฌ ์๊ณ , handle ๋ฉ์๋๋ฅผ ์คํํ๊ณ ์ํ๊ฐ์ ์ป์ด์จ๋ค.(์ํ ํจํด)


FlowStep
Step ๋ด์ Flow๋ฅผ ํ ๋นํ์ฌ ์คํ์ํค๋ ๋๋ฉ์ธ ๊ฐ์ฒด
flowStep์ BatchStatus์ ExitStatus๋ Flow ์ต์ข ์ํ๊ฐ์ ๋ฐ๋ผ ๊ฒฐ์
StepBuilderFactory > StepBuilder > FlowStepBuilder > FlowStep
stepBuilderFactory
.get(โflowStep").flow(flow()) : Step ๋ด์์ ์คํ ๋ flow ์ค์ (FlowStepBuilder ๋ฐํ).build(); : FlowStep ๊ฐ์ฒด ์์ฑ

Scope
์คํ๋ง ์ปจํ ์ด๋์์ ๋น์ด ๊ด๋ฆฌ๋๋ ๋ฒ์
singleton, prototype, request, session, application (default. singleton)
Spring Batch Scope
@JobScope, @StepScope
Job, Step ์ ๋น ์์ฑ๊ณผ ์คํ์ ๊ด์ฌ
Proxy ๊ฐ์ฒด์ ์ค์ ๋์์ด ๋๋ Bean ๋ฑ๋ก/ํด์ ์ญํ
์ค์ ๋น์ ์ ์ฅํ๊ณ ์๋ JobContext, StepContext ์์
๋ด๋ถ์ ์ผ๋ก ๋น Proxy ๊ฐ์ฒด ์์ฑ
@Scope(value = "job", proxyMode = ScopedProxyMode.TARGET_CLASS)
@Scope(value = "step", proxyMode = ScopedProxyMode.TARGET_CLASS)
์ดํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ์์ ์๋ ๋น์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ์คํ ์์ ์ ์ค์ ๋น์ ํธ์ถ(AOP)
JobContext, StepContext
์คํ๋ง ์ปจํ ์ด๋์์ ์์ฑ๋ ๋น์ ์ ์ฅํ๋ ์ปจํ ์คํธ ์ญํ
Job ์คํ ์์ ์์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ค์ ๋น ์ฐธ์กฐ์ ์ฌ์ฉ
ํด๋น ์ค์ฝํ๊ฐ ์ ์ธ๋๋ฉด ๋น ์์ฑ์ด ์ดํ๋ฆฌ์ผ์ด์ ๊ตฌ๋์์ ์ด ์๋ ๋น ์คํ์์ ์
@Values ์ฃผ์ ์ผ๋ก ๋น ์คํ ์์ ์ ๊ฐ์ ์ฐธ์กฐํ ์ ์์ผ๋ฉฐ, Lazy Binding ๊ฐ๋ฅ
@Value("#{jobParameters[ํ๋ผ๋ฏธํฐ๋ช ]}"), @Value("#{jobExecutionContext[ํ๋ผ๋ฏธํฐ๋ช ]โ}), @Value("#{stepExecutionContext[ํ๋ผ๋ฏธํฐ๋ช ]โ})
@Values ์ฌ์ฉ ์ ๋น ์ ์ธ๋ฌธ์ @JobScope, @StepScope ๋ฅผ ์ ์ํ์ง ์์ผ๋ฉด ์ค๋ฅ ๋ฐ์
๋ณ๋ ฌ์ฒ๋ฆฌ ์ ๊ฐ ์ค๋ ๋ ๋ง๋ค ์์ฑ๋ ์ค์ฝํ ๋น์ด ํ ๋น๋๊ธฐ ๋๋ฌธ์ ์ค๋ ๋์ ์์ ํ๊ฒ ์คํ ๊ฐ๋ฅ
@JobScope
Step ์ ์ธ๋ฌธ์ ์ ์
@Value : jobParameter, jobExecutionContext ๋ง ์ฌ์ฉ ๊ฐ๋ฅ
@StepScope
Tasklet, ItemReader, ItemWriter, ItemProcessor ์ ์ธ๋ฌธ์ ์ ์
@Value : jobParameter, jobExecutionContext, stepExecutionContext ์ฌ์ฉ ๊ฐ๋ฅ

์คํ๋ง ๋ฐฐ์น ์ฒญํฌ ํ๋ก์ธ์ค
Chunk
์ฌ๋ฌ ๊ฐ์ ์์ดํ ์ ๋ฌถ์ ํ๋์ ๋ฉ์ด๋ฆฌ(๋ธ๋ก)
ํ๋ฒ์ ํ๋์ฉ ์์ดํ ์ ์ ๋ ฅ ๋ฐ์ Chunk ๋จ์์ ๋ฉ์ด๋ฆฌ๋ก ๋ง๋ ํ Chunk ๋จ์๋ก ํธ๋์ญ์ ์ฒ๋ฆฌ
Chunk ๋จ์์ Commit / Rollback ์ํ
์ผ๋ฐ์ ์ผ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋ ์ฒญํฌ ๋จ์๋ก ์ชผ๊ฐ์ด์ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ ์ฌ์ฉ
Chunk<I> vs Chunk<O>
Chunk<I>: ItemReader๋ก ์ฝ์ ํ๋์ ์์ดํ ์ Chunk์์ ์ ํ ๊ฐ์๋งํผ ๋ฐ๋ณตํด์ ์ ์ฅChunk<O>: ItemReader๋ก๋ถํฐ ์ ๋ฌ๋ฐ์Chunk<I>๋ฅผ ์ฐธ์กฐํด์ ItemProcessor์์ ์ ์ ํ๊ฒ ๊ฐ๊ณต/ํํฐ๋งํ ํ ItemWriter์ ์ ๋ฌ

ChunkOrientedTasklet
Tasklet ๊ตฌํ์ฒด๋ก Chunk ์งํฅ ํ๋ก์ธ์ฑ ๋ด๋น
ItemReader, ItemWriter, ItemProcessor ๋ฅผ ์ฌ์ฉํด Chunk ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ ์ถ๋ ฅ ์ฒ๋ฆฌ
TaskletStep ์ ์ํด ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋๋ฉฐ ChunkOrientedTasklet ์ด ์คํ ๋ ๋๋ง๋ค ๋งค๋ฒ ์๋ก์ด ํธ๋์ญ์ ์ด ์์ฑ๋์ด ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง
exception ๋ฐ์ ์, ํด๋น Chunk๋ ๋กค๋ฐฑ ๋๋ฉฐ ์ด์ ์ ์ปค๋ฐํ Chunk ๋ ์๋ฃ ์ํ ์ ์ง
๋ด๋ถ์ ์ผ๋ก ItemReader ๋ฅผ ํธ๋ค๋ง ํ๋
ChunkProvider, ItemProcessor, ItemWriter ๋ฅผ ํธ๋ค๋งํ๋ChunkProcessorํ์ ๊ตฌํ์ฒด๋ฅผ ๊ฐ์ง

StepBuilderFactory > StepBuilder > SimpletepBuilder > TaskletStep
stepBuilderFactory.get("chunkStep")
<I, O>chunk(10) : chunk size(commit interval) ์ค์
<I, O>chunk(CompletionPolicy) : chunk ํ๋ก์ธ์ค๋ฅผ ์๋ฃํ๊ธฐ ์ํ ์ ์ฑ ์ค์ ํด๋์ค
reader(itemReader()) : ์์ค๋ก ๋ถํฐ item์ ์ฝ๊ฑฐ๋ ๊ฐ์ ธ์ค๋ ItemReader ๊ตฌํ์ฒด
writer(itemWriter()) : item์ ๋ชฉ์ ์ง์ ์ฐ๊ฑฐ๋ ๋ณด๋ด๊ธฐ ์ํ ItemWriter ๊ตฌํ์ฒด
processor(itemProcessor()) : item ๋ณํ/๊ฐ๊ณต/ํํฐ๋ง์ ์ํ ItemProcessor ๊ตฌํ์ฒด
stream(ItemStream()) : ์ฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ฝ๋ฐฑ์ ๋ํ ์คํธ๋ฆผ
readerIsTransactionalQueue() : Item์ด JMS, Message Queue Server์ ๊ฐ์ ํธ๋์ญ์ ์ธ๋ถ์์ ์ฝํ์ง๊ณ ์บ์ํ ๊ฒ์ธ์ง ์ฌ๋ถ(default. false)
listener(ChunkListener) : Chunk ํ๋ก์ธ์ค๊ฐ ์งํ๋๋ ํน์ ์์ ์ ์ฝ๋ฐฑ ์ ๊ณต๋ฐ๋๋ก ChunkListener ์ค์
ChunkProvider
ItemReader ๋ก Chunk size ๋งํผ ์์ดํ ์ ์ฝ์ด์ Chunk ๋จ์๋ก ๋ง๋ค์ด ์ ๊ณต
Chunk<I> ๋ฅผ ๋ง๋ค๊ณ ๋ด๋ถ์ ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ ItemReader.read() ๋ฅผ ๊ณ์ ํธ์ถํ๋ฉฐ item ์ Chunk ์ ์ ์ฌ
์ธ๋ถ๋ก ๋ถํฐ ํธ์ถ๋ ๋๋ง๋ค ํญ์ ์๋ก์ด Chunk ์์ฑ
๋ฐ๋ณต๋ฌธ ์ข ๋ฃ ์์
Chunk size ๋งํผ item ์ ์ฝ์ผ๋ฉด ๋ฐ๋ณต๋ฌธ ์ข ๋ฃ๋๊ณ ChunkProcessor ๋ก ์ ๋ฌ
ItemReader ๊ฐ ์ฝ์ item ์ด null ์ผ ๊ฒฝ์ฐ ๋ฐ๋ณต๋ฌธ ์ข ๋ฃ ๋ฐ ํด๋น Step ๋ฐ๋ณต๋ฌธ๊น์ง ์ข ๋ฃ
๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ก์ SimpleChunkProvider, FaultTolerantChunkProvider ์กด์ฌ
ChunkProcessor
ItemProcessor ๋ก Item ๋ณํ/๊ฐ๊ณต/ํํฐ๋งํ๊ณ ItemWriter ๋ก Chunk ๋ฐ์ดํฐ ์ ์ฅ/์ถ๋ ฅ
Chunk<O> ๋ฅผ ๋ง๋ค๊ณ ์์์ ๋์ด์จ Chunk<I> ์ item ์ ํ ๊ฑด์ฉ ์ฒ๋ฆฌํ ํ Chunk<O> ์ ์ ์ฅ
์ธ๋ถ๋ก ๋ถํฐ ํธ์ถ๋ ๋๋ง๋ค ํญ์ ์๋ก์ด Chunk ์์ฑ
ItemProcessor ๋ ์ค์ ์ ์ ํ์ฌํญ์ผ๋ก์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ItemReader ์์ ์ฝ์ item ๊ทธ๋๋ก๊ฐ Chunk<O> ์ ์ ์ฅ
ItemProcessor ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด Chunk<O> ์ ์๋ List<Item> ์ ItemWriter ์๊ฒ ์ ๋ฌ
ItemWriter ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด Chunk ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๊ณ Step ๋ฐ๋ณต๋ฌธ์์ ChunkOrientedTasklet ๊ฐ ์๋กญ๊ฒ ์คํ
ItemWriter ๋ Chunk size ๋งํผ ๋ฐ์ดํฐ๋ฅผ Commit ์ฒ๋ฆฌํ๋ฏ๋ก Chunk size ๋ ๊ณง Commit Interval
๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ก์ SimpleChunkProcessor, FaultTolerantChunkProcessor ์กด์ฌ
ItemReader
๋ค์ํ ์ ๋ ฅ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์ ๊ณต
csv, txt, xml, json, database, MQ, Custom Reader
ChunkOrientedTasklet ์คํ ์ ํ์ ์์
T read()
์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ๋ค์ ๋ฐ์ดํฐ๋ก ์ด๋
์์ดํ ํ๋๋ฅผ ๋ฆฌํดํ๋ฉฐ ๋ ์ด์ ์์ดํ ์ด ์๋ ๊ฒฝ์ฐ null ๋ฆฌํด
๋ ์ด์ ์ฒ๋ฆฌํด์ผ ํ Item ์ด ์์ด๋ ์์ธ๊ฐ ๋ฐ์ํ์ง ์๊ณ ItemProcessor ์ ๊ฐ์ ๋ค์ ๋จ๊ณ๋ก ์ด๋
.
๋ค์์ ๊ตฌํ์ฒด๋ค์ด ItemReader, ItemStream ์ธํฐํ์ด์ค๋ฅผ ๋์์ ๊ตฌํ
ํ์ผ์ ์คํธ๋ฆผ, DB ์ปค๋ฅ์ ์ ์ด๊ฑฐ๋ ์ข ๋ฃ, ์ ๋ ฅ ์ฅ์น ์ด๊ธฐํ ๋ฑ์ ์์
ExecutionContext ์ read ์ ๊ด๋ จ๋ ์ฌ๋ฌ๊ฐ์ง ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํด์ ์ฌ์์ ์ ๋ค์ ์ฐธ์กฐ ํ๋๋ก ์ง์
์ผ๋ถ๋ฅผ ์ ์ธํ๊ณ ํ์ ํด๋์ค๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ ๋์ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์ํ ๋๊ธฐํ ์ฒ๋ฆฌ ํ์(JdbcPagingItemRedaer, JpaPagingItemReader ๋ ์ค๋ ์ค ์์ )

ItemWriter
Chunk ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ผ๊ด ์ถ๋ ฅ ์์
csv, txt, xml, json, database, MQ, Custom Reader
ChunkOrientedTasklet ์คํ ์ ํ์ ์์
void write(List<? extends T> items)
์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์ดํ ๋ฆฌ์คํธ๋ก ๋ฐ์ ์ฒ๋ฆฌ
์ถ๋ ฅ์ด ์๋ฃ๋๊ณ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋ฉด ์๋ก์ด Chunk ๋จ์ ํ๋ก์ธ์ค๋ก ์ด๋
.
๋ค์์ ๊ตฌํ์ฒด๋ค์ด ItemWriter, ItemStream ๋์ ๊ตฌํ
ํ์ผ์ ์คํธ๋ฆผ์, DB ์ปค๋ฅ์ ์ ์ด๊ฑฐ๋ ์ข ๋ฃ, ์ถ๋ ฅ ์ฅ์น ์ด๊ธฐํ ๋ฑ์ ์์
๋ณดํต ItemReader ๊ตฌํ์ฒด์ 1:1 ๋์ ๊ด๊ณ์ธ ๊ตฌํ์ฒด๋ค๋ก ๊ตฌ์ฑ

ItemProcessor
๋ฐ์ดํฐ ์ถ๋ ฅ ์ ์ ๋ฐ์ดํฐ ๊ฐ๊ณต/๋ณํ/ํํฐ๋ง
ItemReader, ItemWriter ์ ๋ถ๋ฆฌ๋์ด ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ
ItemReader ๋ก ๋ฐ์ ์์ดํ ์ ๋ณํํด์ ItemWriter ์ ์ ๋ฌ
ItemReader ๋ก ๋ฐ์ ์์ดํ ๋ค ์ค ํํฐ ๊ณผ์ ์ ๊ฑฐ์ณ ์ํ๋ ์์ดํ ๋ค๋ง ItemWriter ์ ์ ๋ฌ ๊ฐ๋ฅ
ItemProcessor ์์ process() ์คํ๊ฒฐ๊ณผ null์ ๋ฐํํ๋ฉด Chunk<O> ์ ์ ์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์ ItemWriter์ ์ ๋ฌ๋์ง ์์
ChunkOrientedTasklet ์คํ ์ ์ ํ ์์
O process
์์ดํ ํ๋์ฉ ๊ฐ๊ณตํ๋ฉฐ null ๋ฆฌํด ์ ํด๋น ์์ดํ ์ Chunk<O> ์ ์ ์ฅ๋์ง ์์
.
ItemStream ์ ๊ตฌํํ์ง ์์
๋๋ถ๋ถ Customizing ํ์ฌ ์ฌ์ฉํ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ๊ตฌํ์ฒด๊ฐ ์ ์

ItemReader, ItemProcessor, ItemWriter
ItemStream
ItemReader, ItemWriter ์ฒ๋ฆฌ ๊ณผ์ ์ค ์ํ๋ฅผ ์ ์ฅํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์ํ๋ฅผ ์ฐธ์กฐํ์ฌ ์คํจํ ๊ณณ์์ ์ฌ์์ ํ๋๋ก ์ง์
๋ฆฌ์์ค๋ฅผ open/close ๋ฅผ ํตํด ์ ์ถ๋ ฅ ์ฅ์น ์ด๊ธฐํ ๋ฑ์ ์์
open : ๋ฆฌ์์ค ์ด๊ณ ์ด๊ธฐํ, ์ต์ด 1ํ
update : ํ์ฌ ์ํ์ ๋ณด ์ ์ฅ, Chunk size ๋งํผ ๋ฐ๋ณต
cloas : ๋ชจ๋ ๋ฆฌ์์ค ๋ซ์
ExecutionContext ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ํ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธ
ItemReader, ItemWriter ๋ ItemStream ๊ตฌํ ํ์

ItemReader vs ItemProcessor
ItemReader ์์ Chunk size ๋งํผ Item ์ ํ ๊ฐ์ฉ ๋ชจ๋ ์ฝ์ ๋ค์ ItemProcessor ์๊ฒ ์ ๋ฌํ๋ฉด ์ฝ์ Item ๊ฐ์ ๋งํผ ๋ฐ๋ณต ์ฒ๋ฆฌ
๋ฐ๋ณต ๋ฐ ์ค๋ฅ ์ ์ด
Repeat
์คํ๋ง ๋ฐฐ์น๋ ์์ ์ ์ผ๋ง๋ ๋ฐ๋ณตํด์ผ ํ๋์ง ์๋ ค ์ค ์ ์๋ ๊ธฐ๋ฅ ์ ๊ณต
ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ ๋ ๋๊น์ง(๋๋ ํน์ ์กฐ๊ฑด์ด ์์ง ์ถฉ์กฑ๋์ง ์์ ๋๊น์ง) Job ๋๋ Step ์ ๋ฐ๋ณตํ๋๋ก ๊ตฌ์ฑ ๊ฐ๋ฅ
์คํ๋ง ๋ฐฐ์น์์๋ Step, Chunk ๋ฐ๋ณต์ RepeatOperation ์ ์ฌ์ฉํด์ ์ฒ๋ฆฌ
๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ก RepeatTemplate ์ ๊ณต
๋ฐ๋ณต ์ข ๋ฃ ์ฌ๋ถ ํญ๋ชฉ
RepeatStatus
์คํ๋ง ๋ฐฐ์น์ ์ฒ๋ฆฌ๊ฐ ๋๋ฌ๋์ง ํ๋ณํ๊ธฐ ์ํ enum
CONTINUABLE(๋จ์ ์์ ์กด์ฌ), FINISHED(๋ ์ด์ ๋ฐ๋ณต ์์)
CompletionPolicy
RepeatTemplate iterate ๋ฉ์๋ ์์์ ๋ฐ๋ณต ์ค๋จ๊ฒฐ์
์คํ ํ์ ๋๋ ์๋ฃ์๊ธฐ, ์ค๋ฅ ๋ฐ์ ์ ์ํ ํ ์์ ์ ๋ํ ๋ฐ๋ณต์ฌ๋ถ ๊ฒฐ์
์ ์ ์ข ๋ฃ๋ฅผ ์๋ฆฌ๋๋ฐ ์ฌ์ฉ
ExceptionHandler
RepeatCallback ์์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด RepeatTemplate ๊ฐ ExceptionHandler ๋ฅผ ์ฐธ์กฐํด์ ์์ธ๋ฅผ ๋ค์ ๋์ง์ง ์ฌ๋ถ ๊ฒฐ์
์์ธ๋ฅผ ๋ฐ์์ ๋ค์ ๋์ง๊ฒ ๋๋ฉด ๋ฐ๋ณต ์ข ๋ฃ
๋น์ ์ ์ข ๋ฃ๋ฅผ ์๋ฆฌ๋๋ฐ ์ฌ์ฉ

FaultTolerant
Job ์คํ ์ค ์ค๋ฅ ๋ฐ์ ์ ์ฅ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณต -> ์ด๋ฅผ ํตํด ๋ณต์๋ ฅ ํฅ์
์ค๋ฅ๊ฐ ๋ฐ์ํด๋ Step ์ด ์ฆ์ ์ข ๋ฃ๋์ง ์๊ณ , Retry ํน์ Skip ๊ธฐ๋ฅ์ ํ์ฑํ ํจ์ผ๋ก์จ ๋ด๊ฒฐํจ์ฑ ์๋น์ค ๊ฐ๋ฅ
๋ด๊ฒฐํจ์ฑ์ ์ํด Skip, Retry ๊ธฐ๋ฅ ์ ๊ณต
Skip : ItemReader / ItemProcessor / ItemWriter ์ ์ ์ฉ ๊ฐ๋ฅ
Retry : ItemProcessor / ItemWriter ์ ์ ์ฉ ๊ฐ๋ฅ
FaultTolerant ๊ตฌ์กฐ๋ ์ฒญํฌ ๊ธฐ๋ฐ์ ํ๋ก์ธ์ค ๊ธฐ๋ฐ์์ Skip, Retry ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด ์ฌ์ ์
StepBuilderFactory > StepBuilder > FaultTolerantStepBuilder > TaskletStep

Skip
๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ ์ค์ ๋ Exception ๋ฐ์ ์, ํด๋น ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๊ฑด๋๋ฐ๋ ๊ธฐ๋ฅ
๋ฐ์ดํฐ์ ์ฌ์ํ ์ค๋ฅ์ ๋ํด Step ์คํจ์ฒ๋ฆฌ ๋์ Skip์ ํตํด ๋ฐฐ์น์ํ์ ๋น๋ฒํ ์คํจ ๊ฐ์
์ค๋ฅ ๋ฐ์ ์ ์คํต ์ค์ ์ ์ํด์ Exception ๋ฐ์ ๊ฑด์ ๊ฑด๋๋ฐ๊ณ ๋ค์ ๊ฑด๋ถํฐ ๋ค์ ์ฒ๋ฆฌ
ItemReader๋ ์์ธ ๋ฐ์ ์ ํด๋น ์์ดํ ๋ง ์คํตํ๊ณ ๊ณ์ ์งํ
ItemProcessor, ItemWriter๋ ์์ธ ๋ฐ์ ์ Chunk ์ฒ์์ผ๋ก ๋์๊ฐ์ ์คํต๋ ์์ดํ ์ ์ ์ธํ ๋๋จธ์ง ์์ดํ ๋ค์ ๊ฐ์ง๊ณ ์ฒ๋ฆฌ
์คํต ์ ์ฑ ์ ๋ฐ๋ผ ์์ดํ ์ skip ์ฌ๋ถ๋ฅผ ํ๋จํํ๋ ํด๋์ค(SkipPolicy ๊ตฌํ์ฒด)
AlwaysSkipItemSkipPolicy : ํญ์ Skip
ExceptionClassifierSkipPolicy : ์์ธ๋์์ ๋ถ๋ฅํ์ฌ skip ์ฌ๋ถ๋ฅผ ๊ฒฐ์
CompositeSkipPolicy : ์ฌ๋ฌ SkipPolicy ํ์ํ๋ฉด์ skip ์ฌ๋ถ๋ฅผ ๊ฒฐ์
LimitCheckingItemSkipPolicy : Skip ์นด์ดํฐ ๋ฐ ์์ธ ๋ฑ๋ก ๊ฒฐ๊ณผ์ ๋ฐ๋ผ skip ์ฌ๋ถ๋ฅผ ๊ฒฐ์ (default)
NeverSkipItemSkipPolicy : skip ํ์ง ์์

Retry
ItemProcess, ItemWriter ์์ ์ค์ ๋ Exception ๋ฐ์ ์ ์ง์ ํ ์ ์ฑ ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ฌ์๋ํ๋ ๊ธฐ๋ฅ
Skip๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Retry๋ฅผ ํตํด ๋ฐฐ์น์ํ์ ๋น๋ฒํ ์คํจ ๊ฐ์
์ค๋ฅ ๋ฐ์ ์ ์ฌ์๋ ์ค์ ์ ์ํด์ Chunk ๋จ๊ณ ์ฒ์๋ถํฐ ๋ค์ ์์
์์ดํ ์ ItemReader์์ ์บ์๋ก ์ ์ฅํ ๊ฐ ์ฌ์ฉ
์ฌ์๋ ์ ์ฑ ์ ๋ฐ๋ผ ์์ดํ ์ retry ์ฌ๋ถ๋ฅผ ํ๋จํํ๋ ํด๋์ค(RetryPolicy ๊ตฌํ์ฒด)
AlwaysRetryPolicy : ํญ์ ์ฌ์๋๋ฅผ ํ์ฉ
ExceptionClassifierRetryPolicy : ์์ธ๋์์ ๋ถ๋ฅํ์ฌ ์ฌ์๋ ์ฌ๋ถ๋ฅผ ๊ฒฐ์
CompositeRetryPolicy : ์ฌ๋ฌ RetryPolicy ๋ฅผ ํ์ํ๋ฉด์ ์ฌ์๋ ์ฌ๋ถ๋ฅผ ๊ฒฐ์
SimpleRetryPolicy : ์ฌ์๋ ํ์ ๋ฐ ์์ธ ๋ฑ๋ก ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ฌ์๋ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ (default)
MaxAttemptsRetryPolicy : ์ฌ์๋ ํ์์ ๋ฐ๋ผ ์ฌ์๋ ์ฌ๋ถ๋ฅผ ๊ฒฐ์
TimeoutRetryPolicy : ์ฃผ์ด์ง ์๊ฐ๋์ ์ฌ์๋๋ฅผ ํ์ฉ
NeverRetryPolicy : โข ์ต์ด ํ๋ฒ๋ง ํ์ฉํ๊ณ ๊ทธ ์ดํ๋ก๋ ํ์ฉํ์ง ์์

Skip & Retry Architecture
ItemReader

ItemProcessor

ItemWriter

Multi Thread Processing
์์ ์ฒ๋ฆฌ์ ์์ด์ ๋จ์ผ ์ค๋ ๋, ๋ฉํฐ ์ค๋ ๋์ ์ ํ ๊ธฐ์ค์ ์ด๋ค ๋ฐฉ์์ด ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ฑ๋ฅ์ฒ๋ฆฌ์ ์ ๋ฆฌํ๊ฐ์ ์ฐจ์ด
์ผ๋ฐ์ ์ผ๋ก ๋ณต์กํ ์ฒ๋ฆฌ๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์์ ์ผ ๊ฒฝ์ฐ ์ ์ฒด ์์ ์๊ฐ ๋ฐ ์ฑ๋ฅ์์ ์ด์ ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ ์ ํ (๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐ Scale out ๊ธฐ๋ฅ ์ ๊ณต)
๋ฉํฐ ์ค๋ ๋ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ฐ์ดํฐ ๋๊ธฐํ ์ด์๊ฐ ์กด์ฌ ํ๊ธฐ ๋๋ฌธ์ ์ต๋ํ ๊ณ ๋ คํด์ ๊ฒฐ์ ํ์

AsyncItemProcessor / AsyncItemWriter
ItemProcessor ์๊ฒ ๋ณ๋์ ์ค๋ ๋๊ฐ ํ ๋น๋์ด ์์ ์ ์ฒ๋ฆฌ(Step ์์์ ItemProcessor ๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋์)
AsyncItemProcessor, AsyncItemWriter ๊ฐ ํจ๊ป ๊ตฌ์ฑ ํ์
AsyncItemProcessor ๋ก๋ถํฐ AsyncItemWriter ๊ฐ ๋ฐ๋ ์ต์ข ๊ฒฐ๊ณผ๊ฐ์
List<Future<T>>ํ์ ์ด๋ฉฐ ๋น๋๊ธฐ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐspring-batch-integration ์์กด์ฑ ํ์


AsyncItemProcessor / AsyncItemWriter
Multi-threaded Step
Step ๋ด์์ ๋ฉํฐ ์ค๋ ๋๋ก Chunk ๊ธฐ๋ฐ ์ฒ๋ฆฌ(ItemReader, ItemProcessor, ItemWriter)๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ตฌ์กฐ
TaskExecutorRepeatTemplate ์ด ๋ฐ๋ณต์๋ก ์ฌ์ฉ๋๋ฉฐ ์ค์ ํ ๊ฐ์(throttleLimit) ๋งํผ์ ์ค๋ ๋๋ฅผ ์์ฑํ์ฌ ์ํ
Thread-safe ItemReader ๋ก JdbcPagingItemReader ๋๋ JpaPagingItemReader ํ์ฉ

Remote Chunking
๋ถ์ฐํ๊ฒฝ์ฒ๋ผ Step ์ฒ๋ฆฌ๊ฐ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ก ๋ถํ ๋์ด ์ธ๋ถ์ ๋ค๋ฅธ ์๋ฒ๋ก ์ ์ก๋์ด ์ฒ๋ฆฌ
Parallel Steps
Step ๋ง๋ค ์ค๋ ๋๊ฐ ํ ๋น๋์ด ์ฌ๋ฌ๊ฐ์ Step์ ๋ณ๋ ฌ๋ก ์คํ
SplitState ๋ฅผ ์ฌ์ฉํด์ ์ฌ๋ฌ ๊ฐ์ Flow ๋ค์ ๋ณ๋ ฌ์ ์ผ๋ก ์คํํ๋ ๊ตฌ์กฐ
์คํ ์๋ฃ ํ FlowExecutionStatus ๊ฒฐ๊ณผ๋ค์ ์ทจํฉํด์ ๋ค์ ๋จ๊ณ ๊ฒฐ์
Partitioning
MasterStep์ด SlaveStep ์ ์คํ์ํค๋ ๊ตฌ์กฐ
SlaveStep์ ๊ฐ ์ค๋ ๋์ ์ํด ๋ ๋ฆฝ์ ์ผ๋ก ์คํ
SlaveStep์ ๋ ๋ฆฝ์ ์ธ StepExecution ํ๋ผ๋ฏธํฐ ํ๊ฒฝ์ ๊ตฌ์ฑ
SlaveStep์ ItemReader/ItemProcessor/ItemWriter ๋ฑ์ ๊ฐ์ง๊ณ ๋์ํ๋ฉฐ ์์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ
MasterStep์ PartitionStep์ด๋ฉฐ SlaveStep์ TaskletStep, FlowStep ๋ฑ์ด ์ฌ ์ ์์


SynchronizedItemStreamReader
Thread-safe ํ์ง ์์ ItemReader๋ฅผ Thread-safeํ๊ฒ ์ฒ๋ฆฌํ๋๋ก ์ง์(Spring Batch 4.0 ๋ถํฐ)
Event Listener
๋ฐฐ์น ํ๋ฆ ์ค Job/Step/Chunk ๋จ๊ณ์ ์คํ ์ ํ์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฉ๋์ ๋ง๊ฒ ํ์ฉํ ์ ์๋๋ก ์ ๊ณต
๊ฐ ๋จ๊ณ๋ณ๋ก ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฑฐ๋ ์์๋ ์๊ฐ์ ๊ณ์ฐํ๊ฑฐ๋ ์คํ์ํ ์ ๋ณด๋ค์ ์ฐธ์กฐ ๋ฐ ์กฐํ ๊ฐ๋ฅ
์ด๋ฒคํธ๋ฅผ ๋ฐ๊ธฐ ์ํด Listener ๋ฑ๋ก์ด ํ์ํ๋ฉฐ ๋ฑ๋ก์ API ์ค์ ์์ ๊ฐ ๋จ๊ณ๋ณ๋ก ์ง์ ๊ฐ๋ฅ
์ด๋ ธํ ์ด์ ๋ฐฉ์๊ณผ ์ธํฐํ์ด์ค ๊ตฌํ ๋ฐฉ๋ฒ ์กด์ฌ
.
Job
JobExecutionListener : Job ์คํ ์ /ํ
Job ์ฑ๊ณต์ฌ๋ถ์ ์๊ด์์ด ํธ์ถ
JobExecution๋ฅผ ํตํด ์ฑ๊ณต/์คํจ ์ฌ๋ถ ํ์ธ ๊ฐ๋ฅ
Step
StepExecutionListener : Step ์คํ ์ /ํ
Step ์ฑ๊ณต์ฌ๋ถ์ ์๊ด์์ด ํธ์ถ
StepExecution๋ฅผ ํตํด ์ฑ๊ณต/์คํจ ์ฌ๋ถ ํ์ธ ๊ฐ๋ฅ
ChunkListener : Chunk(Tasklet) ์คํ ์ /ํ, ์ค๋ฅ ์์
ItemReadListener : ItemReader ์คํ ์ /ํ, ์ค๋ฅ ์์ , item null ์ผ ๊ฒฝ์ฐ ํธ์ถ ์๋จ
ItemProcessListener : ItemProcessor ์คํ ์ /ํ, ์ค๋ฅ ์์ , item null ์ผ ๊ฒฝ์ฐ ํธ์ถ ์๋จ
ItemWriteListener : ItemWriter ์คํ ์ /ํ, ์ค๋ฅ ์์ , item null ์ผ ๊ฒฝ์ฐ ํธ์ถ ์๋จ
JobExecutionListener / StepExecutionListener
ChunkListener/ItemReadListener/ItemProcessListener/ItemWriteListener
Skip
SkipListener : ์ฝ๊ธฐ, ์ฐ๊ธฐ, ์ฒ๋ฆฌ Skip ์คํ ์์ , Item ์ฒ๋ฆฌ๊ฐ Skip ๋ ๊ฒฝ์ฐ Skip ๋ item ์ถ์
Retry
RetryListener : Retry ์์, ์ข ๋ฃ, ์๋ฌ ์์

SkipListener

RetryListener

Test
@SpringBatchTest
dependency: spring-batch-test
ApplicatonContext์ ํ ์คํธ์ ํ์ํ ์ฌ๋ฌ ์ ํธ Bean์ ์๋์ผ๋ก ๋ฑ๋ก
JobLauncherTestUtils
launchJob(), launchStep()๊ณผ ๊ฐ์ ์คํ๋ง ๋ฐฐ์น ํ ์คํธ์ ํ์ํ ์ ํธ์ฑ ๋ฉ์๋ ์ง์
JobRepositoryTestUtils
JobRepository๋ฅผ ์ฌ์ฉํด์ JobExecution ์์ฑ/์ญ์ ๋ฉ์๋ ์ง์
StepScopeTestExecutionListener
@StepScope ์ปจํ ์คํธ๋ฅผ ์์ฑ. ํด๋น ์ปจํ ์คํธ๋ฅผ ํตํด JobParameter ๋ฑ์ ๋จ์ ํ ์คํธ์์ DI ๋ฐ์ ์ ์๋๋ก ์ง์
JobScopeTestExecutionListener
@JobScope ์ปจํ ์คํธ๋ฅผ ์์ฑ. ํด๋น ์ปจํ ์คํธ๋ฅผ ํตํด JobParameter ๋ฑ์ ๋จ์ ํ ์คํธ์์ DI ๋ฐ์ ์ ์๋๋ก ์ง์
Operation
JobExplorer
JobRepository readonly ๋ฒ์
์คํ์ค์ธ Job ์คํ ์ ๋ณด์ธ JobExecution ๋๋ Step ์คํ ์ ๋ณด์ธ StepExecution ์กฐํ ๊ฐ๋ฅ
JobRegistry
์์ฑ๋ Job ์๋ ๋ฑ๋ก, ์ถ์ , ๊ด๋ฆฌํ๋ฉฐ ์ฌ๋ฌ ๊ณณ์์ job์ ์์ฑํ ๊ฒฝ์ฐ ApplicationContext์์ job์ ์์งํด์ ์ฌ์ฉ ๊ฐ๋ฅ
๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ก map ๊ธฐ๋ฐ์ MapJobRegistry ํด๋์ค ์ ๊ณต
jobName์ Key๋ก, job์ value๋ก ๋งคํ
Job ๋ฑ๋ก
JobRegistryBeanPostProcessor โ BeanPostProcessor ๋จ๊ณ์์ bean ์ด๊ธฐํ ์ ์๋์ผ๋ก JobRegistry์ Job ๋ฑ๋ก
JobOperator
JobExplorer, JobRepository, JobRegistry, JobLauncher ์ ํฌํจํ๋ฉฐ, ๋ฐฐ์น์ ์ค๋จ, ์ฌ์์, job ์์ฝ ๋ฑ์ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ
๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ก SimpleJobOprerator ํด๋์ค ์ ๊ณต
Application
๋ง๋ฌด๋ฆฌ
๋๋ฉ์ธ ์ดํด : JobInstance, JobExecution, StepExecution, ExecutionContext, JobParameter, JobRepository, JobLauncher
Job ๊ตฌ์ฑ ๋ฐ API ํ์ฉ : Job, Step, Flow, Tasklet
Chunk ํ๋ก์ธ์ค : Chunk, ItemReader, ItemProcessor, ItemWriter
๋ฐ๋ณต ๋ฐ ๋ด๊ฒฐํจ์ฑ : Repeat, Skip, Retry, Listener
์ด๋ฒคํธ ๋ฆฌ์ค๋ : JobExecutionListener, StepListener, RetriyListner, SkipListener
๋ฉํฐ ์ค๋ ๋ ๋ฐฐ์น ์ฒ๋ฆฌ : MultiThread Batch Process
ํ ์คํธ ๋ฐ ์ด์ : TDD & JobExeplorer, JobRegistry, JobOperator
ํ์ ์ ์ถ๊ฐ ์๊ฐ
์คํ๋ง ๋ฐฐ์น ์ฒญํฌ ํ๋ก์ธ์ค ํ์ฉ ItemReader / ItemWriter / ItemProcessor
Last updated