Spring Batch

์ •์ˆ˜์›๋‹˜์˜ Spring Boot ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” Spring Batcharrow-up-right ๊ฐ•์˜๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

Projectarrow-up-right

Reference Sourcearrow-up-right

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 ๋นˆ ์ƒ์„ฑ

      • SimpleBatchConfiguration

        • JobBuilderFactory ์™€ StepBuilderFactory ์ƒ์„ฑ

        • ์Šคํ”„๋ง ๋ฐฐ์น˜์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ ์ƒ์„ฑ -> ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ

      • BatchConfigurerConfiguration

        • BasicBatchConfigurer

          • SimpleBatchConfiguration ์—์„œ ์ƒ์„ฑํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ ์‹ค์ œ ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์„ค์ • ํด๋ž˜์Šค

          • ๋นˆ์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐ›์•„์„œ ์ฃผ์š” ๊ฐ์ฒด๋“ค์„ ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉ

        • JpaBatchConfigurer

          • JPA ๊ด€๋ จ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์„ค์ • ํด๋ž˜์Šค

    • ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฐฐ์น˜์˜ ์ž๋™ ์„ค์ • ํด๋ž˜์Šค๊ฐ€ ์‹คํ–‰๋จ์œผ๋กœ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ ๋ชจ๋“  Job์„ ๊ฒ€์ƒ‰ํ•ด์„œ ์ดˆ๊ธฐํ™”์™€ ๋™์‹œ์— Job์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌ์„ฑ

img. enable-batch-processingarrow-up-right

๊ธฐ๋ณธ ์ฝ”๋“œ

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์ผ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ)

        • ์šด์˜์—์„œ ์ˆ˜๋™์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ ํ›„ ์„ค์ • ๊ถŒ์žฅ

Result

Meta-Data Schemaarrow-up-right

๊ด€๋ จ ํ…Œ์ด๋ธ”

Job ๊ด€๋ จ ํ…Œ์ด๋ธ”

  • BATCH_JOB_INSTANCE

    • Job ์ด ์‹คํ–‰๋  ๋•Œ JobInstance ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋ฉฐ job_name๊ณผ job_key๋ฅผ ํ‚ค๋กœ ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ

    • ๋™์ผํ•œ job_name ๊ณผ job_key ๋กœ ์ค‘๋ณต ์ €์žฅ๋  ์ˆ˜ ์—†๋‹ค

      • 1,0,Job,0c5cf62846f98c894b8dce3de3433509

  • BATCH_JOB_EXECUTION

    • job ์˜ ์‹คํ–‰์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋ฉฐ 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_PARAMS

    • Job๊ณผ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋Š” 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_CONTEXT

    • Job ์˜ ์‹คํ–‰๋™์•ˆ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ƒํƒœ์ •๋ณด, ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™” (Json ํ˜•์‹) ํ•ด์„œ ์ €์žฅ

    • Step ๊ฐ„ ์„œ๋กœ ๊ณต์œ  ๊ฐ€๋Šฅํ•จ

      • 1,"{""@class"":""java.util.HashMap""}",

Step ๊ด€๋ จ ํ…Œ์ด๋ธ”

  • BATCH_STEP_EXECUTION

    • Step ์˜ ์‹คํ–‰์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋ฉฐ ์ƒ์„ฑ, ์‹œ์ž‘, ์ข…๋ฃŒ ์‹œ๊ฐ„, ์‹คํ–‰์ƒํƒœ, ๋ฉ”์‹œ์ง€ ๋“ฑ์„ ๊ด€๋ฆฌ

      • 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_CONTEXT

    • Step ์˜ ์‹คํ–‰๋™์•ˆ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ƒํƒœ์ •๋ณด, ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™” (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 ๊ฐ์ฒด๋ฅผ ์‹คํ–‰์‹œ์ผœ์„œ ์ž‘์—…์„ ์ง„ํ–‰

Result

Jobarrow-up-right

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

Result

JobInstancearrow-up-right

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

Result

JobParametersarrow-up-right

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

Result

JobExecutionarrow-up-right

Step

Step

  • Batch job์„ ๊ตฌ์„ฑํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ํ•˜๋‚˜์˜ ๋‹จ๊ณ„

  • ์‹ค์ œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ปจํŠธ๋กคํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด

  • ๋‹จ์ˆœํ•œ ๋‹จ์ผ ํƒœ์Šคํฌ ๋ฟ ์•„๋‹ˆ๋ผ, ์ž…๋ ฅ, ์ฒ˜๋ฆฌ, ์ถœ๋ ฅ ๊ด€๋ จ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ์„ค์ •๋“ค์„ ๋‹ด์Œ

  • ๋ฐฐ์น˜์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•  ๊ฒƒ์ธ์ง€ Job์˜ ์„ธ๋ถ€ ์ž‘์—…์„ Task ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ๋ช…์„ธ

  • ๋ชจ๋“  Job์€ ํ•˜๋‚˜ ์ด์ƒ์˜ step์œผ๋กœ ๊ตฌ์„ฑ

๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด

  • TaskletStep

    • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํด๋ž˜์Šค. Tasklet ํƒ€์ž… ๊ตฌํ˜„์ฒด๋“ค์„ ์ œ์–ด

    • ์ง์ ‘ ์ƒ์„ฑํ•œ Tasklet ์‹คํ–‰

    • ChunkOrientedTasklet ์„ ์‹คํ–‰

  • PartitionStep

    • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ Step์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์‹คํ–‰

  • JobStep

    • Step ๋‚ด์—์„œ Job ์‹คํ–‰

  • FlowStep

    • Step ๋‚ด์—์„œ Flow ์‹คํ–‰

Result

Steparrow-up-right

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

Result
  • Job: ํ•˜๋‚˜์˜ ๋ฐฐ์น˜์ž‘์—… ์ž์ฒด (๋‘ ๊ฐœ์˜ Step์œผ๋กœ ๊ตฌ์„ฑ)

  • JobInstance: Job ์‹คํ–‰ ์‹œ ์ƒ์„ฑ๋˜๋Š” Job ์˜ ๋…ผ๋ฆฌ์  ์‹คํ–‰ ๋‹จ์œ„ ๊ฐ์ฒด

  • JobExecution: JobIstance ์— ๋Œ€ํ•œ ํ•œ๋ฒˆ์˜ ์‹œ๋„๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฐ์ฒด

  • StepExecution: Step์— ๋Œ€ํ•œ ํ•œ ๋ฒˆ์˜ ์‹œ๋„๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฐ์ฒด

StepContribution

  • ์ฒญํฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฒ„ํผ๋ง ํ•œ ํ›„ StepExecution ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด

  • ์ฒญํฌ ์ปค๋ฐ‹ ์ง์ „์— StepExecution apply ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ

  • ExitStatus ๊ธฐ๋ณธ ์ข…๋ฃŒ์ฝ”๋“œ ์™ธ ์‚ฌ์šฉ์ž ์ •์˜ ์ข…๋ฃŒ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ ์šฉ ๊ฐ€๋Šฅ

StepContribution.java

Result

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 ์ •๋ณด ์กฐํšŒ

Result

ExecutionContextarrow-up-right

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

JobRepositoryarrow-up-right

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 ์š”์ฒญ์— ์˜ํ•œ ๋ฐฐ์น˜์ฒ˜๋ฆฌ์— ์ ํ•ฉ

JobLauncherarrow-up-right

์Šคํ”„๋ง ๋ฐฐ์น˜ ์‹คํ–‰

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 ์ œ๊ณต

Result

JobBuilderFactory ํด๋ž˜์Šค ์ƒ์† ๊ตฌ์กฐ

Result

JobBuilderFactoryarrow-up-right


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 ์ƒ์„ฑ

SimpleJob.validator()arrow-up-right

SimpleJob.preventRestart()arrow-up-right

SimpleJob.incrementer()arrow-up-right

Result

Step

StepBuilderFactory

  • StepBuilder ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค

StepBuilder

  • Step ์„ ๊ตฌ์„ฑํ•˜๋Š” ์„ค์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค์„ฏ ๊ฐœ์˜ ํ•˜์œ„ ๋นŒ๋” ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐ ์‹ค์ œ Step ์ƒ์„ฑ ์œ„์ž„

    • TaskletStepBuilder

      • TaskletStep ์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋นŒ๋” ํด๋ž˜์Šค

    • SimpleStepBuilder

      • TaskletStep ์„ ์ƒ์„ฑํ•˜๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒญํฌ๊ธฐ๋ฐ˜์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ChunkOrientedTasklet ํด๋ž˜์Šค ์ƒ์„ฑ

    • PartitionStepBuilder

      • PartitionStep ์„ ์ƒ์„ฑํ•˜๋ฉฐ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ Job ์‹คํ–‰

    • JobStepBuilder

      • JobStep ์„ ์ƒ์„ฑํ•˜์—ฌ Step ์•ˆ์—์„œ Job ์‹คํ–‰

    • FlowStepBuilder

      • FlowStep ์„ ์ƒ์„ฑํ•˜์—ฌ StTaskletStepep ์•ˆ์—์„œ Flow ์‹คํ–‰

Result
Result

StepBuilderFactoryarrow-up-right

TaskletStep

StepBuilderFactory > StepBuilder > TaskletStepBuilder > TaskletStep

  • Step ๊ตฌํ˜„์ฒด. Tasklet ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด

  • RepeatTemplate ์„ ์‚ฌ์šฉํ•ด์„œ Tasklet ๊ตฌ๋ฌธ์„ ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ๋‚ด์—์„œ ๋ฐ˜๋ณต ์‹คํ–‰

  • Step ์˜ ์‹คํ–‰ ๋‹จ์œ„๋กœ Task ๊ธฐ๋ฐ˜๊ณผ Chunk ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ Tasklet ์‹คํ–‰

    • chunk ๊ธฐ๋ฐ˜

      • ํ•˜๋‚˜์˜ ํฐ ๋ฉ์–ด๋ฆฌ๋ฅผ N๊ฐœ์”ฉ ๋‚˜๋ˆ ์„œ ์‹คํ–‰. ๋Œ€๋Ÿ‰ ์ฒ˜๋ฆฌ์— ํšจ๊ณผ์ 

      • ItemReader, ItemProcessor, ItemWriter ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฒญํฌ ๊ธฐ๋ฐ˜ ์ „์šฉ Tasklet ์ธ ChunkOrientedTasklet ๊ตฌํ˜„์ฒด ์ œ๊ณต

    • Task ๊ธฐ๋ฐ˜

      • ์ฒญํฌ ๊ธฐ๋ฐ˜ ์ž‘์—… ๋ณด๋‹ค ๋‹จ์ผ ์ž‘์—… ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ์— ํšจ์œจ์ 

      • ์ฃผ๋กœ Tasklet ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ

      • ๋Œ€๋Ÿ‰ ์ฒ˜๋ฆฌ ์‹œ chunk ๊ธฐ๋ฐ˜์— ๋น„ํ•ด ๋” ๋ณต์žกํ•œ ๊ตฌํ˜„ ํ•„์š”

Result
  • 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 ์ƒ์„ฑ

TaskletSteparrow-up-right

Result

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 ์„ ์ƒ์„ฑ

JobSteparrow-up-right

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) : ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•  Step

    • Step or Flow or JobExecutionDecider

  • .end() : build() ์•ž์— ์œ„์น˜ํ•˜๋ฉด FlowBuilder ์ข…๋ฃŒ ๋ฐ SimpleFlow ๊ฐ์ฒด ์ƒ์„ฑ

  • .build() : FlowJob ์ƒ์„ฑ ๋ฐ flow ํ•„๋“œ์— SimpleFlow ์ €์žฅ

Result

FlowJobarrow-up-right

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 ๋ฐฐ์น˜ ๊ฒฐ๊ณผ ์ƒํƒœ์— ๊ด€์—ฌ

Transitionarrow-up-right

์‚ฌ์šฉ์ž ์ •์˜ ExitStatus

  • ExitStatus์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” exitCode๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ •์˜

  • StepExecutionListener์˜ afterStep() ๋ฉ”์„œ๋“œ์—์„œ Custom exitCode ์ƒ์„ฑ ํ›„ ์ƒˆ๋กœ์šด ExitStatus ๋ฐ˜ํ™˜

  • Step ์‹คํ–‰ ํ›„ ์™„๋ฃŒ ์‹œ์ ์—์„œ ํ˜„์žฌ exitCode๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ exitCode๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅ

StepExecutionListener ๊ตฌํ˜„arrow-up-right

JobExecutionDecider

  • ExitStatus๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ StepExecutionListener๋ฅผ ๋“ฑ๋กํ•  ํ•„์š” ์—†์ด Transition ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ „์šฉ ํด๋ž˜์Šค

  • Step, Transiton ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ

  • Step์˜ ExitStatus๊ฐ€ ์•„๋‹Œ JobExecutionDecider์˜ FlowExecutionStatus ์ƒํƒœ๊ฐ’์„ ์ƒˆ๋กญ๊ฒŒ ์„ค์ •ํ•ด์„œ ๋ฐ˜ํ™˜

JobExecutionDecider ๊ตฌํ˜„arrow-up-right

Result

FlowJob Architecturearrow-up-right


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 ๊ฐ์ฒด ์ƒ์„ฑ

SimpleFlowConfigurationarrow-up-right

Result

SimpleFlow Architecture

  • StateMap์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  State๋“ค์˜ handle ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋ชจ๋“  Step ๋“ค์ด ์‹คํ–‰๋˜๋„๋ก ํ•จ

  • ํ˜„์žฌ ํ˜ธ์ถœ๋˜๋Š” State๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ๊ด€์‹ฌ ์—†๊ณ , handle ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ƒํƒœ๊ฐ’์„ ์–ป์–ด์˜จ๋‹ค.(์ƒํƒœ ํŒจํ„ด)

Result
Result

FlowStep

  • Step ๋‚ด์— Flow๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์‹คํ–‰์‹œํ‚ค๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด

  • flowStep์˜ BatchStatus์™€ ExitStatus๋Š” Flow ์ตœ์ข… ์ƒํƒœ๊ฐ’์— ๋”ฐ๋ผ ๊ฒฐ์ •

StepBuilderFactory > StepBuilder > FlowStepBuilder > FlowStep

  • stepBuilderFactory.get(โ€œflowStep")

  • .flow(flow()) : Step ๋‚ด์—์„œ ์‹คํ–‰ ๋  flow ์„ค์ •(FlowStepBuilder ๋ฐ˜ํ™˜)

  • .build(); : FlowStep ๊ฐ์ฒด ์ƒ์„ฑ

Result

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 ์‚ฌ์šฉ ๊ฐ€๋Šฅ

@JobScope / @StepScopearrow-up-right

Result

์Šคํ”„๋ง ๋ฐฐ์น˜ ์ฒญํฌ ํ”„๋กœ์„ธ์Šค

Chunk

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์•„์ดํ…œ์„ ๋ฌถ์€ ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ(๋ธ”๋ก)

  • ํ•œ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์•„์ดํ…œ์„ ์ž…๋ ฅ ๋ฐ›์•„ Chunk ๋‹จ์œ„์˜ ๋ฉ์–ด๋ฆฌ๋กœ ๋งŒ๋“  ํ›„ Chunk ๋‹จ์œ„๋กœ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ

    • Chunk ๋‹จ์œ„์˜ Commit / Rollback ์ˆ˜ํ–‰

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ฒญํฌ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด์„œ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ

Chunk<I> vs Chunk<O>

  • Chunk<I> : ItemReader๋กœ ์ฝ์€ ํ•˜๋‚˜์˜ ์•„์ดํ…œ์„ Chunk์—์„œ ์ •ํ•œ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•ด์„œ ์ €์žฅ

  • Chunk<O> : ItemReader๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ Chunk<I>๋ฅผ ์ฐธ์กฐํ•ด์„œ ItemProcessor์—์„œ ์ ์ ˆํ•˜๊ฒŒ ๊ฐ€๊ณต/ํ•„ํ„ฐ๋งํ•œ ํ›„ ItemWriter์— ์ „๋‹ฌ

Result

Chunk Processarrow-up-right

ChunkOrientedTasklet

  • Tasklet ๊ตฌํ˜„์ฒด๋กœ Chunk ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ ๋‹ด๋‹น

  • ItemReader, ItemWriter, ItemProcessor ๋ฅผ ์‚ฌ์šฉํ•ด Chunk ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ์ฒ˜๋ฆฌ

  • TaskletStep ์— ์˜ํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ChunkOrientedTasklet ์ด ์‹คํ–‰ ๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์ด ์ƒ์„ฑ๋˜์–ด ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง

  • exception ๋ฐœ์ƒ ์‹œ, ํ•ด๋‹น Chunk๋Š” ๋กค๋ฐฑ ๋˜๋ฉฐ ์ด์ „์— ์ปค๋ฐ‹ํ•œ Chunk ๋Š” ์™„๋ฃŒ ์ƒํƒœ ์œ ์ง€

  • ๋‚ด๋ถ€์ ์œผ๋กœ ItemReader ๋ฅผ ํ•ธ๋“ค๋ง ํ•˜๋Š” ChunkProvider, ItemProcessor, ItemWriter ๋ฅผ ํ•ธ๋“ค๋งํ•˜๋Š” ChunkProcessor ํƒ€์ž… ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ง

Result

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 ์„ค์ •

ChunkOrientedTaskletarrow-up-right

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 ๋Š” ์Šค๋ ˆ์Šค ์•ˆ์ „)

Result

ItemWriter

  • Chunk ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์ผ๊ด„ ์ถœ๋ ฅ ์ž‘์••

    • csv, txt, xml, json, database, MQ, Custom Reader

  • ChunkOrientedTasklet ์‹คํ–‰ ์‹œ ํ•„์ˆ˜ ์š”์†Œ

  • void write(List<? extends T> items)

    • ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌ

    • ์ถœ๋ ฅ์ด ์™„๋ฃŒ๋˜๊ณ  ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜๋ฉด ์ƒˆ๋กœ์šด Chunk ๋‹จ์œ„ ํ”„๋กœ์„ธ์Šค๋กœ ์ด๋™

.

  • ๋‹ค์ˆ˜์˜ ๊ตฌํ˜„์ฒด๋“ค์ด ItemWriter, ItemStream ๋™์‹œ ๊ตฌํ˜„

    • ํŒŒ์ผ์˜ ์ŠคํŠธ๋ฆผ์„, DB ์ปค๋„ฅ์…˜์„ ์—ด๊ฑฐ๋‚˜ ์ข…๋ฃŒ, ์ถœ๋ ฅ ์žฅ์น˜ ์ดˆ๊ธฐํ™” ๋“ฑ์˜ ์ž‘์—…

  • ๋ณดํ†ต ItemReader ๊ตฌํ˜„์ฒด์™€ 1:1 ๋Œ€์‘ ๊ด€๊ณ„์ธ ๊ตฌํ˜„์ฒด๋“ค๋กœ ๊ตฌ์„ฑ

Result

ItemProcessor

  • ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ ์ „์— ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต/๋ณ€ํ˜•/ํ•„ํ„ฐ๋ง

  • ItemReader, ItemWriter ์™€ ๋ถ„๋ฆฌ๋˜์–ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„

  • ItemReader ๋กœ ๋ฐ›์€ ์•„์ดํ…œ์„ ๋ณ€ํ™˜ํ•ด์„œ ItemWriter ์— ์ „๋‹ฌ

  • ItemReader ๋กœ ๋ฐ›์€ ์•„์ดํ…œ๋“ค ์ค‘ ํ•„ํ„ฐ ๊ณผ์ •์„ ๊ฑฐ์ณ ์›ํ•˜๋Š” ์•„์ดํ…œ๋“ค๋งŒ ItemWriter ์— ์ „๋‹ฌ ๊ฐ€๋Šฅ

    • ItemProcessor ์—์„œ process() ์‹คํ–‰๊ฒฐ๊ณผ null์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด Chunk<O> ์— ์ €์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ItemWriter์— ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ

  • ChunkOrientedTasklet ์‹คํ–‰ ์‹œ ์„ ํƒ ์š”์†Œ

  • O process

    • ์•„์ดํ…œ ํ•˜๋‚˜์”ฉ ๊ฐ€๊ณตํ•˜๋ฉฐ null ๋ฆฌํ„ด ์‹œ ํ•ด๋‹น ์•„์ดํ…œ์€ Chunk<O> ์— ์ €์žฅ๋˜์ง€ ์•Š์Œ

.

  • ItemStream ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Œ

  • ๋Œ€๋ถ€๋ถ„ Customizing ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ์ ์Œ

Result

ItemReader, ItemProcessor, ItemWriterarrow-up-right

ItemStream

  • ItemReader, ItemWriter ์ฒ˜๋ฆฌ ๊ณผ์ • ์ค‘ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‹คํŒจํ•œ ๊ณณ์—์„œ ์žฌ์‹œ์ž‘ ํ•˜๋„๋ก ์ง€์›

  • ๋ฆฌ์†Œ์Šค๋ฅผ open/close ๋ฅผ ํ†ตํ•ด ์ž…์ถœ๋ ฅ ์žฅ์น˜ ์ดˆ๊ธฐํ™” ๋“ฑ์˜ ์ž‘์—…

    • open : ๋ฆฌ์†Œ์Šค ์—ด๊ณ  ์ดˆ๊ธฐํ™”, ์ตœ์ดˆ 1ํšŒ

    • update : ํ˜„์žฌ ์ƒํƒœ์ •๋ณด ์ €์žฅ, Chunk size ๋งŒํผ ๋ฐ˜๋ณต

    • cloas : ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ๋‹ซ์Œ

  • ExecutionContext ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์ƒํƒœ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ

  • ItemReader, ItemWriter ๋Š” ItemStream ๊ตฌํ˜„ ํ•„์š”

Result

ItemStreamarrow-up-right

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 ๋ฅผ ์ฐธ์กฐํ•ด์„œ ์˜ˆ์™ธ๋ฅผ ๋‹ค์‹œ ๋˜์งˆ์ง€ ์—ฌ๋ถ€ ๊ฒฐ์ •

  • ์˜ˆ์™ธ๋ฅผ ๋ฐ›์•„์„œ ๋‹ค์‹œ ๋˜์ง€๊ฒŒ ๋˜๋ฉด ๋ฐ˜๋ณต ์ข…๋ฃŒ

  • ๋น„์ •์ƒ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ฆฌ๋Š”๋ฐ ์‚ฌ์šฉ

Result

Repeatarrow-up-right

FaultTolerant

  • Job ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์žฅ์•  ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต -> ์ด๋ฅผ ํ†ตํ•ด ๋ณต์›๋ ฅ ํ–ฅ์ƒ

  • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ Step ์ด ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ , Retry ํ˜น์€ Skip ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ํ•จ์œผ๋กœ์จ ๋‚ด๊ฒฐํ•จ์„ฑ ์„œ๋น„์Šค ๊ฐ€๋Šฅ

  • ๋‚ด๊ฒฐํ•จ์„ฑ์„ ์œ„ํ•ด Skip, Retry ๊ธฐ๋Šฅ ์ œ๊ณต

    • Skip : ItemReader / ItemProcessor / ItemWriter ์— ์ ์šฉ ๊ฐ€๋Šฅ

    • Retry : ItemProcessor / ItemWriter ์— ์ ์šฉ ๊ฐ€๋Šฅ

  • FaultTolerant ๊ตฌ์กฐ๋Š” ์ฒญํฌ ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜์œ„์— Skip, Retry ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ์žฌ์ •์˜

StepBuilderFactory > StepBuilder > FaultTolerantStepBuilder > TaskletStep

Result

FaultTolerantarrow-up-right

Skip

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์„ค์ •๋œ Exception ๋ฐœ์ƒ ์‹œ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ธฐ๋Šฅ

  • ๋ฐ์ดํ„ฐ์˜ ์‚ฌ์†Œํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด Step ์‹คํŒจ์ฒ˜๋ฆฌ ๋Œ€์‹  Skip์„ ํ†ตํ•ด ๋ฐฐ์น˜์ˆ˜ํ–‰์˜ ๋นˆ๋ฒˆํ•œ ์‹คํŒจ ๊ฐ์†Œ

  • ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์Šคํ‚ต ์„ค์ •์— ์˜ํ•ด์„œ Exception ๋ฐœ์ƒ ๊ฑด์€ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋‹ค์Œ ๊ฑด๋ถ€ํ„ฐ ๋‹ค์‹œ ์ฒ˜๋ฆฌ

    • ItemReader๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ์•„์ดํ…œ๋งŒ ์Šคํ‚ตํ•˜๊ณ  ๊ณ„์† ์ง„ํ–‰

    • ItemProcessor, ItemWriter๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ Chunk ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์Šคํ‚ต๋œ ์•„์ดํ…œ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์•„์ดํ…œ๋“ค์„ ๊ฐ€์ง€๊ณ  ์ฒ˜๋ฆฌ

  • ์Šคํ‚ต ์ •์ฑ…์— ๋”ฐ๋ผ ์•„์ดํ…œ์˜ skip ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œํ•˜๋Š” ํด๋ž˜์Šค(SkipPolicy ๊ตฌํ˜„์ฒด)

    • AlwaysSkipItemSkipPolicy : ํ•ญ์ƒ Skip

    • ExceptionClassifierSkipPolicy : ์˜ˆ์™ธ๋Œ€์ƒ์„ ๋ถ„๋ฅ˜ํ•˜์—ฌ skip ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •

    • CompositeSkipPolicy : ์—ฌ๋Ÿฌ SkipPolicy ํƒ์ƒ‰ํ•˜๋ฉด์„œ skip ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •

    • LimitCheckingItemSkipPolicy : Skip ์นด์šดํ„ฐ ๋ฐ ์˜ˆ์™ธ ๋“ฑ๋ก ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ skip ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •(default)

    • NeverSkipItemSkipPolicy : skip ํ•˜์ง€ ์•Š์Œ

Result

Skiparrow-up-right

Retry

  • ItemProcess, ItemWriter ์—์„œ ์„ค์ •๋œ Exception ๋ฐœ์ƒ ์‹œ ์ง€์ •ํ•œ ์ •์ฑ…์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์žฌ์‹œ๋„ํ•˜๋Š” ๊ธฐ๋Šฅ

  • Skip๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Retry๋ฅผ ํ†ตํ•ด ๋ฐฐ์น˜์ˆ˜ํ–‰์˜ ๋นˆ๋ฒˆํ•œ ์‹คํŒจ ๊ฐ์†Œ

  • ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์žฌ์‹œ๋„ ์„ค์ •์— ์˜ํ•ด์„œ Chunk ๋‹จ๊ณ„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘

    • ์•„์ดํ…œ์€ ItemReader์—์„œ ์บ์‹œ๋กœ ์ €์žฅํ•œ ๊ฐ’ ์‚ฌ์šฉ

  • ์žฌ์‹œ๋„ ์ •์ฑ…์— ๋”ฐ๋ผ ์•„์ดํ…œ์˜ retry ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œํ•˜๋Š” ํด๋ž˜์Šค(RetryPolicy ๊ตฌํ˜„์ฒด)

    • AlwaysRetryPolicy : ํ•ญ์ƒ ์žฌ์‹œ๋„๋ฅผ ํ—ˆ์šฉ

    • ExceptionClassifierRetryPolicy : ์˜ˆ์™ธ๋Œ€์ƒ์„ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์žฌ์‹œ๋„ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •

    • CompositeRetryPolicy : ์—ฌ๋Ÿฌ RetryPolicy ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์žฌ์‹œ๋„ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •

    • SimpleRetryPolicy : ์žฌ์‹œ๋„ ํšŸ์ˆ˜ ๋ฐ ์˜ˆ์™ธ ๋“ฑ๋ก ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์žฌ์‹œ๋„ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •(default)

    • MaxAttemptsRetryPolicy : ์žฌ์‹œ๋„ ํšŸ์ˆ˜์— ๋”ฐ๋ผ ์žฌ์‹œ๋„ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •

    • TimeoutRetryPolicy : ์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋™์•ˆ ์žฌ์‹œ๋„๋ฅผ ํ—ˆ์šฉ

    • NeverRetryPolicy : โ€ข ์ตœ์ดˆ ํ•œ๋ฒˆ๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ๊ทธ ์ดํ›„๋กœ๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ

Result

Retry apiarrow-up-right

Retry Templatearrow-up-right

Skip & Retry Architecture

ItemReader

Result

ItemProcessor

Result

ItemWriter

Result

Multi Thread Processing

  • ์ž‘์—… ์ฒ˜๋ฆฌ์— ์žˆ์–ด์„œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์˜ ์„ ํƒ ๊ธฐ์ค€์€ ์–ด๋–ค ๋ฐฉ์‹์ด ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์„ฑ๋Šฅ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌํ•œ๊ฐ€์˜ ์ฐจ์ด

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ๋‚˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ž‘์—…์ผ ๊ฒฝ์šฐ ์ „์ฒด ์†Œ์š” ์‹œ๊ฐ„ ๋ฐ ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์„ ์„ ํƒ (๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐ Scale out ๊ธฐ๋Šฅ ์ œ๊ณต)

  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ์ด์Šˆ๊ฐ€ ์กด์žฌ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ๊ณ ๋ คํ•ด์„œ ๊ฒฐ์ • ํ•„์š”

Result

AsyncItemProcessor / AsyncItemWriter

  • ItemProcessor ์—๊ฒŒ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ• ๋‹น๋˜์–ด ์ž‘์—…์„ ์ฒ˜๋ฆฌ(Step ์•ˆ์—์„œ ItemProcessor ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘)

  • AsyncItemProcessor, AsyncItemWriter ๊ฐ€ ํ•จ๊ป˜ ๊ตฌ์„ฑ ํ•„์š”

  • AsyncItemProcessor ๋กœ๋ถ€ํ„ฐ AsyncItemWriter ๊ฐ€ ๋ฐ›๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’์€ List<Future<T>> ํƒ€์ž…์ด๋ฉฐ ๋น„๋™๊ธฐ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

  • spring-batch-integration ์˜์กด์„ฑ ํ•„์š”

Result
Result

AsyncItemProcessor / AsyncItemWriterarrow-up-right

Multi-threaded Step

  • Step ๋‚ด์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ Chunk ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ(ItemReader, ItemProcessor, ItemWriter)๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ตฌ์กฐ

  • TaskExecutorRepeatTemplate ์ด ๋ฐ˜๋ณต์ž๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์„ค์ •ํ•œ ๊ฐœ์ˆ˜(throttleLimit) ๋งŒํผ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ˆ˜ํ–‰

  • Thread-safe ItemReader ๋กœ JdbcPagingItemReader ๋˜๋Š” JpaPagingItemReader ํ™œ์šฉ

Result

Multi-threaded Steparrow-up-right

Remote Chunking

  • ๋ถ„์‚ฐํ™˜๊ฒฝ์ฒ˜๋Ÿผ Step ์ฒ˜๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋กœ ๋ถ„ํ• ๋˜์–ด ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์–ด ์ฒ˜๋ฆฌ

Parallel Steps

  • Step ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๊ฐ€ ํ• ๋‹น๋˜์–ด ์—ฌ๋Ÿฌ๊ฐœ์˜ Step์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰

  • SplitState ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Flow ๋“ค์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ

  • ์‹คํ–‰ ์™„๋ฃŒ ํ›„ FlowExecutionStatus ๊ฒฐ๊ณผ๋“ค์„ ์ทจํ•ฉํ•ด์„œ ๋‹ค์Œ ๋‹จ๊ณ„ ๊ฒฐ์ •

Parallel Stepsarrow-up-right

Partitioning

  • MasterStep์ด SlaveStep ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ตฌ์กฐ

  • SlaveStep์€ ๊ฐ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰

  • SlaveStep์€ ๋…๋ฆฝ์ ์ธ StepExecution ํŒŒ๋ผ๋ฏธํ„ฐ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑ

  • SlaveStep์€ ItemReader/ItemProcessor/ItemWriter ๋“ฑ์„ ๊ฐ€์ง€๊ณ  ๋™์ž‘ํ•˜๋ฉฐ ์ž‘์—…์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

  • MasterStep์€ PartitionStep์ด๋ฉฐ SlaveStep์€ TaskletStep, FlowStep ๋“ฑ์ด ์˜ฌ ์ˆ˜ ์žˆ์Œ

Result
Result

Partitioningarrow-up-right

SynchronizedItemStreamReader

  • Thread-safe ํ•˜์ง€ ์•Š์€ ItemReader๋ฅผ Thread-safeํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ง€์›(Spring Batch 4.0 ๋ถ€ํ„ฐ)

SynchronizedItemStreamReaderarrow-up-right

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 / StepExecutionListenerarrow-up-right

ChunkListener/ItemReadListener/ItemProcessListener/ItemWriteListenerarrow-up-right

Skip

  • SkipListener : ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์ฒ˜๋ฆฌ Skip ์‹คํ–‰ ์‹œ์ , Item ์ฒ˜๋ฆฌ๊ฐ€ Skip ๋  ๊ฒฝ์šฐ Skip ๋œ item ์ถ”์ 

Retry

  • RetryListener : Retry ์‹œ์ž‘, ์ข…๋ฃŒ, ์—๋Ÿฌ ์‹œ์ 

Result

SkipListener

RetryListenerarrow-up-right

Result

RetryListener

RetryListenerarrow-up-right

Result

Test

@SpringBatchTest

dependency: spring-batch-test

  • ApplicatonContext์— ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ์œ ํ‹ธ Bean์„ ์ž๋™์œผ๋กœ ๋“ฑ๋ก

  • JobLauncherTestUtils

    • launchJob(), launchStep()๊ณผ ๊ฐ™์€ ์Šคํ”„๋ง ๋ฐฐ์น˜ ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ์œ ํ‹ธ์„ฑ ๋ฉ”์„œ๋“œ ์ง€์›

  • JobRepositoryTestUtils

    • JobRepository๋ฅผ ์‚ฌ์šฉํ•ด์„œ JobExecution ์ƒ์„ฑ/์‚ญ์ œ ๋ฉ”์„œ๋“œ ์ง€์›

  • StepScopeTestExecutionListener

    • @StepScope ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑ. ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด JobParameter ๋“ฑ์„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ DI ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›

  • JobScopeTestExecutionListener

    • @JobScope ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑ. ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด JobParameter ๋“ฑ์„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ DI ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›

Spring Batch Testarrow-up-right

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 ํด๋ž˜์Šค ์ œ๊ณต

Operation examplearrow-up-right

Application

Job 1arrow-up-right

Job2 - Job, Step, readerarrow-up-right

Job2 - processor, api servicearrow-up-right

Job2 - schedulerarrow-up-right

๋งˆ๋ฌด๋ฆฌ

  • ๋„๋ฉ”์ธ ์ดํ•ด : 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