๐Ÿƒย Spring Batch 1ํŽธ

Sei Kimยท2024๋…„ 10์›” 2์ผ

Spring Batch

๋ชฉ๋ก ๋ณด๊ธฐ
1/1

1. Batch๋ž€?


๋ฐฐ์น˜(Batch)์ž‘์—…์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ผ๊ด„์ ์œผ๋กœ ๋ชจ์•„์„œ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์€ํ–‰์˜ ์ •์‚ฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋ฐฐ์น˜ ์ž‘์—…์„ ํ†ตํ•ด ์ผ๊ด„์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€์— ๋น ๋ฅธ ์‘๋‹ต์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์„œ๋น„์Šค์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ๋Š” ์‡ผํ•‘๋ชฐ ๊ฐ™์€ VIP์‹œ์Šคํ…œ์ด ์žˆ๋Š” ๊ณณ์—์„œ ํ•œ๋‹ฌ ๋™์•ˆ ์ด์šฉ๋Ÿ‰์„ ํ™•์ธํ•œ ๋’ค ๋ถ€์—ฌํ•˜๋Š” ์‹œ์Šคํ…œ์—๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.1. Batch ํŠน์ง•


  1. ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ
  2. ํŠน์ • ์‹œ๊ฐ„์— ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰
  3. ์ผ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌ

2. Spring Batch๋ž€?


Spring Batch๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฒฝ๋Ÿ‰ํ™”๋œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ๊ด„ ์ฒ˜๋ฆฌ (Batch Processing) ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋‚˜ ์ฃผ๊ธฐ์ ์ธ ์—…๋ฌด ์ฒ˜๋ฆฌ ๋“ฑ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•œ ๋ถ„์‚ฐ ๋ฐฉ์‹์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Spring Batch vs Quartz? Scheduler?
Spring Batch๋Š” Batch Job์„ ๊ด€๋ฆฌํ•˜์ง€๋งŒ Job์„ ๊ตฌ๋™ํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์€ ์ง€์›ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Spring์—์„œ Batch Job์„ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” Quartz, Scheduler, Jenkins๋“ฑ ์ „์šฉ Scheduler๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.1. Spring Batch ํŠน์ง•


Spring Batch๋Š” ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  1. ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  2. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ค‘ ์‹คํŒจํ•œ ์ž‘์—…์€ ๋กค๋ฐฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์žฌ์‹œ๋„ ๊ธฐ๋Šฅ: ์ž‘์—… ์ค‘ ์‹คํŒจํ•œ ๊ฒฝ์šฐ ์ž‘์—…์„ ์žฌ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.2. Spring Batch ์šฉ์–ด


Job


Job์€ ๋ฐฐ์น˜์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐฐ์น˜์ฒ˜๋ฆฌ ๊ณผ์ •์— ์žˆ์–ด ์ „์ฒด ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

JobInstance


JobInstance๋Š” Job์˜ ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Job์„ ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋˜๋ฉด ํ•˜๋‚˜์˜ JobInstance๊ฐ€ ์ƒ์„ฑ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 10์›” 1์ผ ์‹คํ–‰, 10์›” 2์ผ ์‹คํ–‰์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ๊ฐ์˜ JobInstance๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ 1์›” 1์ผ ์‹คํ–‰ํ•œ JobInstance๊ฐ€ ์‹คํŒจํ•˜์—ฌ ๋‹ค์‹œ ์‹คํ–‰์„ ์‹œํ‚ค๋”๋ผ๋„ ์ด JobInstance๋Š” 1์›” 1์ผ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

JobParmeters


JobParmeters๋Š” JobInstance๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. JobParmeters๋Š” JobInstance ๊ตฌ๋ณ„์™ธ์—๋„ ๊ฐœ๋ฐœ์ž JobInstance์— ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์—ญํ• ๋„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ JobParmeters๋Š” String, Double, Long, Date 4๊ฐ€์ง€ ํ˜•์‹๋งŒ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

JobExecution


JobExecution์€ JobInstance์— ๋Œ€ํ•œ ์‹คํ–‰ ์‹œ๋„์— ๋Œ€ํ•œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. 1์›” 1์ผ์— ์‹คํ–‰ํ•œ JobInstance๊ฐ€ ์‹คํŒจํ•˜์—ฌ ์žฌ์‹คํ–‰์„ ํ•˜์—ฌ๋„ ๋™์ผํ•œ JobInstance๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€๋งŒ ์ด 2๋ฒˆ์— ์‹คํ–‰์— ๋Œ€ํ•œ JobExecution์€ ๊ฐœ๋ณ„๋กœ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. JobExecution์€ ์ด๋Ÿฌํ•œ JobInstance ์‹คํ–‰์— ๋Œ€ํ•œ ์ƒํƒœ, ์‹œ์ž‘์‹œ๊ฐ„, ์ข…๋ฃŒ์‹œ๊ฐ„, ์ƒ์„ฑ์‹œ๊ฐ„ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Step


Step์€ Job์˜ ๋ฐฐ์น˜์ฒ˜๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ˆœ์ฐจ์ ์ธ ๋‹จ๊ณ„๋ฅผ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค. Job์€ ์ตœ์†Œํ•œ 1๊ฐœ ์ด์ƒ์˜ Step์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ Job์˜ ์‹ค์ œ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋“ค์–ด์™€์žˆ์Šต๋‹ˆ๋‹ค.

StepExceution


StepExceution์€ JobExceution๊ณผ ๋™์ผํ•˜๊ฒŒ Step ์‹คํ–‰ ์‹œ๋„์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Job์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ Step์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ์ด์ „ ๋‹จ๊ณ„์˜ Step์ด ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ์œผ๋กœ ์‹คํŒจ ์ดํ›„ StepExecution์€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. StepExecution ๋˜ํ•œ JobExecution๊ณผ ๋™์ผํ•˜๊ฒŒ ์‹ค์ œ ์‹œ์ž‘์ด ๋  ๋•Œ๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. StepExecution์—๋Š” JobExecuton์— ์ €์žฅ๋˜๋Š” ์ •๋ณด ์™ธ์— read ์ˆ˜, write ์ˆ˜, commit ์ˆ˜, skip ์ˆ˜ ๋“ฑ์˜ ์ •๋ณด๋“ค๋„ ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค.

ExecutionContext


ExecutionContext๋Š” Job์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. Spring Batch์—์„œ ์ œ๊ณตํ•˜๋Š” ExecutionContext๋Š” JobExecutionContext, StepExecutionContext 2๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์œผ๋‚˜ ์ด ๋‘๊ฐ€์ง€๋Š” ์ง€์ •๋˜๋Š” ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. JobExecutionContext์˜ ๊ฒฝ์šฐ Commit ์‹œ์ ์— ์ €์žฅ๋˜๋Š” ๋ฐ˜๋ฉด StepExecutionContext๋Š” ์‹คํ–‰ ์‚ฌ์ด์— ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ExecutionContext๋ฅผ ํ†ตํ•ด Step๊ฐ„ Data๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ Job์‹คํŒจ์‹œ ExecutionContext๋ฅผ ํ†ตํ•œ ๋งˆ์ง€๋ง‰ ์‹คํ–‰ ๊ฐ’์„ ์žฌ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JobRepository


JobRepository๋Š” ์œ„์—์„œ ๋งํ•œ ๋ชจ๋“  ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. Job์ด ์‹คํ–‰๋˜๊ฒŒ ๋˜๋ฉด JobRepository์— JobExecution๊ณผ StepExecution์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉฐ JobRepository์—์„œ Execution ์ •๋ณด๋“ค์„ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

JobLauncher


JobLauncher๋Š” Job๊ณผ JobParameters๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Job์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

ItemReader


ItemReader๋Š” Step์—์„œ Item์„ ์ฝ์–ด์˜ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ItemReader์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Item์„ ์ฝ์–ด ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ItemWriter


ItemWriter๋Š” ์ฒ˜๋ฆฌ ๋œ Data๋ฅผ Writer ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Writer๋Š” ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฌผ์— ๋”ฐ๋ผ Insert๊ฐ€ ๋  ์ˆ˜๋„ Update๊ฐ€ ๋  ์ˆ˜๋„ Queue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Send๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Writer๋˜ํ•œ Read์™€ ๋™์ผํ•˜๊ฒŒ ๋‹ค์–‘ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. Writer๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Item์„ Chunk๋กœ ๋ฌถ์–ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ItemProcessor


ItemProcessor๋Š” Reader์—์„œ ์ฝ์–ด์˜จ Item์„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Processor๋Š” ๋ฐฐ์น˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ํ•„์ˆ˜ ์š”์†Œ๋Š” ์•„๋‹ˆ๋ฉฐ Reader, Writer, Processor์ฒ˜๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

3. Spring Batch ์‚ฌ์šฉํ•˜๊ธฐ


3.1. Application ํ™˜๊ฒฝ ์„ค์ •


๊ฐ€์žฅ ๋จผ์ € Application์— Spring Batch๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ ์ด๋ผ๊ณ  ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์ค๋‹ˆ๋‹ค.

@EnableBatchProcessing	// ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜
@SpringBootApplication
public class SpringBatchApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringBatchApplication.class, args);
	}
}

๊ฐ„๋‹จํ•˜๊ฒŒ Spring Batch์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.1.1. MySQL(Database) ์—ฐ๋™


์ดํ›„ ์ €๋Š” MySQL๊ณผ ์—ฐ๋™์„ ํ•  ๊ฒƒ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ์„ค์ •์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

spring:
  application:
    name: spring-batch
  datasource:
    url: jdbc:mysql://localhost:3307/batch
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 1234
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
  sql:
    init:
      mode: always

sql.init.mode๋ฅผ ์„ค์ •ํ•œ ์ด์œ ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด resources-schema.sql์— ํ…Œ์ด๋ธ” ๊ด€๋ จ SQL๋ฌธ์„ ์ž‘์„ฑํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์Šคํ‚ค๋งˆ ์ •๋ณด๋Š” spring-batch-core-5.1.2.jar - org - springframework - batch - core - schema-mysql.sql ์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ…Œ์ด๋ธ”์ด ์—†๋Š”๊ฒฝ์šฐ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3.2 Spring Batch Job ๊ตฌ์„ฑํ•˜๊ธฐ


Spring Batch์—์„œ Job์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ Step์˜ ๋ชจ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, Job์€ ์ˆœ์ฐจ์ ์ธ Step์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ Batch๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Step์€ Tasklet ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ Chunk ์ง€ํ–ฅ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.1. ๋‹จ์ผ Step ๊ตฌ์„ฑํ•˜๊ธฐ


@Slf4j
@RequiredArgsConstructor
@Configuration
public class ExampleJobConfig extends **DefaultBatchConfiguration** {

	private static final String JOB_NAME = "exampleJob";
	private static final String FIRST_STEP_NAME = "firstStep";

	@Bean
	public Job exampleJob(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
		return new JobBuilder(JOB_NAME, jobRepository)
				.start(firstStep(jobRepository, transactionManager))
				.build();
	}

	@Bean
	public Step firstStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
		return new StepBuilder(FIRST_STEP_NAME, jobRepository)
				.tasklet((contribution, chunkContext) -> {
					log.info(">>>>>>>>>>>>>>>> First step");
					return RepeatStatus.FINISHED;
				}, transactionManager).build();
	}
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ log๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Spring Batch 5.0.0 ์ดํ›„๋กœ๋Š” extends DetaulBatchConfiguration์„ ํ†ตํ•ด ์„ค์ •๋“ค์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์‚ฌ์ง„์—์„œ ์ถœ๋ ฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.2. ๋‹ค์ค‘ Step ๊ตฌ์„ฑํ•˜๊ธฐ


@Bean
public Job multiStepJob(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new JobBuilder(JOB_NAME, jobRepository)
			.start(firstStep(jobRepository, transactionManager))
			.next(nextStep(jobRepository, transactionManager))
			.next(lastStep(jobRepository, transactionManager))
			.build();
}

next ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ step ์„ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‹ค์ค‘์œผ๋กœ Step์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ด 3๊ฐœ์˜ Step์ด ์ง„ํ–‰๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.3. Flow๋ฅผ ํ†ตํ•œ Step ๊ตฌ์„ฑํ•˜๊ธฐ


์ถ”ํ›„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

3.3. ๋‹ค์–‘ํ•œ Step ์„ค์ •ํ•˜๊ธฐ


Step์—๋Š” ๋‹ค์–‘ํ•œ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์˜ˆ์ œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

3.3.1. Step์—์„œ startlimit ์‚ฌ์šฉํ•˜๊ธฐ


startlimit ๋Š” ํ•ด๋‹น Step์˜ ์‹คํŒจ ์ดํ›„ ์žฌ์‹œ์ž‘ ๊ฐ€๋Šฅ ํšŸ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. startlimit ์ดํ›„ ์‹คํ–‰๋˜๋Š” Exception์ด ๋ฐœ์ƒ๋ฉ๋‹ˆ๋‹ค.

@Bean
public Step startLimitStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder(START_LIMIT_STEP_NAME, jobRepository)
			.tasklet(tasklet(), transactionManager)
			.startLimit(10)    // 10๋ฒˆ ์žฌ์‹œ์ž‘ ๊ฐ€๋Šฅ
			.build();
}

์ด ์™ธ์—๋„ skip, retry, noRollback ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์„ค์ •๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

4. STEP์„ ๊ตฌ์„ฑํ•˜๋Š” Tasklet๊ณผ Chunk ์ง€ํ–ฅ ์ฒ˜๋ฆฌ


4.1. Tasklet


Tasklet์€ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ ๋˜์–ด์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์‹คํŒจ๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ throwํ•  ๋•Œ ๊นŒ์ง€ execute๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜์ด ์–ป์–ด์ง‘๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”, ์ €์žฅ ํ”„๋กœ์‹œ์ € ์‹คํ–‰, ์•Œ๋ฆผ ์ „์†ก๊ณผ ๊ฐ™์€ Job์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ณ„์† ์ง„ํ–‰ํ• ์ง€ ์•„๋‹˜ ๋๋‚ผ์ง€ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ์—๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

public enum RepeatStatus {
    CONTINUABLE(true), // ๊ณ„์† ์ง„ํ–‰
    FINISHED(false);   // ๋๋‚ด๊ธฐ
    // ETC...
}

Tasklet์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

4.1.1. Job Class ์•ˆ์— Tasklet ๊ตฌํ˜„ํ•˜๊ธฐ (Lambda)


// ๋‚ด๋ถ€ ๋žŒ๋‹ค์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ
@Bean
public Step firstStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder(FIRST_STEP_NAME, jobRepository)
			.tasklet((contribution, chunkContext) -> {
				log.info(">>>>>>>>>>>>>>>> First step");
				return RepeatStatus.FINISHED;
			}, transactionManager).build();
}

// ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ
public Tasklet tasklet() {
	return ((contribution, chunkContext) -> {
		log.info(">>>>>>>>>>>>>>>> Step");
		return RepeatStatus.FINISHED;
	});
}

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋žŒ๋‹ค์‹์œผ๋กœ tasklet์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.1.2. MethodInvokingAdapter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ธฐ


@RequiredArgsConstructor
@Configuration
public class MethodInvokingTaskletAdapterJobConfig extends DefaultBatchConfiguration {
	private final String JOB_NAME = "MethodInvokingTaskletAdapterJob";
	private final String STEP_NAME = "SleepBySleepServiceStep";
	private final SleepService sleepService;

	@Bean
	public Job methodInvokingTaskletAdapterJob(
			final JobRepository jobRepository,
			final PlatformTransactionManager transactionManager
	) {
		return new JobBuilder(JOB_NAME, jobRepository)
				.start(sleepBySleepServiceStep(jobRepository, transactionManager))
				.build();
	}

	@Bean
	public Step sleepBySleepServiceStep(
			final JobRepository jobRepository,
			final PlatformTransactionManager transactionManager
	) {
		return new StepBuilder(STEP_NAME, jobRepository)
				.tasklet(sleepBySleepServiceTasklet(), transactionManager)
				.build();
	}

	// MethodInvokingTaskletAdapter ๋ฐฉ์‹
	@Bean
	public MethodInvokingTaskletAdapter sleepBySleepServiceTasklet() {
		MethodInvokingTaskletAdapter adapter = new MethodInvokingTaskletAdapter();
		adapter.setTargetObject(sleepService);
		adapter.setTargetMethod("sleep");
		return adapter;
	}
}
@Slf4j
@Service
public class SleepService {
	public void sleep() throws InterruptedException {
		log.info("Sleep Start");
		Thread.sleep(500);
	}
}

MethodInvokingTaskletAdapter ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ ค๊ณ ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํ•จ์ˆ˜๋ช…์„ ์ž‘์„ฑํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰์‹œํ‚ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.1.3. ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Tasklet ๊ตฌํ˜„ํ•˜๊ธฐ


@Slf4j
public class ExternalClassTasklet implements Tasklet, StepExecutionListener {
	@Override
	@BeforeStep
	public void beforeStep(StepExecution stepExecution) {
		log.info(">>>>>>>>>> Before Step Start!");
	}

	@Override
	public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
		for (int i = 0; i < 10; i++) {
			log.info(">>>>>>>>>>>>>>>>>>>> {}: Execute!", i);
		}
		return RepeatStatus.FINISHED;
	}

	@Override
	@AfterStep
	public ExitStatus afterStep(StepExecution stepExecution) {
		log.info(">>>>>>>>>> After Step Start!");
		return ExitStatus.COMPLETED;
	}
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด Tasklet ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์‹คํ–‰์ด์ „๊ณผ ์ดํ›„์— ํŠน์ • ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค๋ฉด StepExecutionListener ์„ ์ƒ์†๋ฐ›์•„ @BeforeStep, @AfterStep์„ ํ†ตํ•ด execute ๋ฐฐ์น˜ ์‹คํ–‰ ์ „ ํ›„์— Event๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์‹คํ–‰ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.2. Chunk


Spring Batch์—์„œ Chunk๋ž€ ์ฒ˜๋ฆฌ๋˜๋Š” ์ปค๋ฐ‹ ROW์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Batch ์ฒ˜๋ฆฌ์—์„œ ์ปค๋ฐ‹ ๋˜๋Š” ROW ์ˆ˜๋ผ๋Š”๊ฑด chunk๋‹จ์œ„๋กœ Transaction์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจ์‹œ Chunk ๋‹จ์œ„ ๋งŒํผ Rollback์ด ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Chunk ์ง€ํ–ฅ ์ฒ˜๋ฆฌ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. ์ฝ๊ธฐ(Read): Database์—์„œ ๋ฐฐ์น˜์ฒ˜๋ฆฌํ•  Data๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
  2. ์ฒ˜๋ฆฌ(Processing): ์ฝ์–ด์˜จ Data๋ฅผ ๊ฐ€๊ณต, ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. (ํ•„์ˆ˜์‚ฌํ•ญ X)
  3. ์“ฐ๊ธฐ(Write): ๊ฐ€๊ณต ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Database์— ์ €์žฅํ•œ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ Chunk ์ง€ํ–ฅ ์ฒ˜๋ฆฌ์—์„œ ๋ฐฐ์น˜๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค.

์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์•„๋ž˜์˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋ฐฑ๋งŒ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ๋ถ€๋‹ด๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ Chunk ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

4.1. Chunk ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ


Spring Batch์—๋Š” ๋‹ค์–‘ํ•œ ItemReader์™€ ItemWriter๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์šฉ๋Ÿ‰ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด Item์„ ์ฝ์–ด ์˜ฌ ๋•Œ Paging ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. Spring Batch Reader์—์„œ๋Š” ์ด๋Ÿฌํ•œ Paging ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ ์ ˆํ•œ Paging ์ฒ˜๋ฆฌ์™€ Chunk Size๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋”์šฑ ํšจ๊ณผ์ ์ธ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.2 ์ ์ ˆํ•œ Paging Size ์™€ Chunk Size


Paging Size์™€ Chunk Size์˜ ๊ด€๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

Paging Size๊ฐ€ 5์ด๋ฉฐ Chunk Size๊ฐ€ 10์ผ ๊ฒฝ์šฐ 2๋ฒˆ์˜ Read๊ฐ€ ์ด๋ฃจ์–ด์ง„ ํ›„์— 1๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•œ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์„ ์œ„ํ•ด ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋Š” ํ•œ Paging Size์™€ Chunk Size๋ฅผ ๋™์ผํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

Setting a fairly large page size and using a commit interval that matches the page size should provide better performance.

ํŽ˜์ด์ง€ ํฌ๊ธฐ๋ฅผ ์ƒ๋‹นํžˆ ํฌ๊ฒŒ ์„ค์ •ํ•˜๊ณ  ํŽ˜์ด์ง€ ํฌ๊ธฐ์™€ ์ผ์น˜ํ•˜๋Š” ์ปค๋ฐ‹ ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜: Spring Batch

5. Spring Meta Table


Spring Batch์—๋Š” 6๊ฐœ์˜ Meta Table์™€ 3๊ฐœ์˜ Sequence Table์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Spring BatchJob์ด ์‹คํ–‰ ๋  ๋•Œ๋งˆ๋‹ค Job์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋“ค์ด ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ํ•ด๋‹น Meta Table์ด ์—†์ด๋Š” Spring Batch Framework๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์—†์œผ๋‚˜ ์ด๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ†ตํ•ด Meta Table์ด ์—†์ด๋„ ์‹คํ–‰๋˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SEQUENCE


BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION๋ฐ BATCH_STEP_EXECUTION์˜ Primary Key๋Š” ์‹œํ€€์Šค์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Sequence๋ฅผ ์ง€์›ํ•˜๋Š” Database Create ์‹์ž…๋‹ˆ๋‹ค.

BATCH_JOB_INSTANCE


BATCH_JOB_INSTANCE ํ…Œ์ด๋ธ”์—๋Š” JobInstance์— ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น Table์€ ์ „์ฒด ๊ณ„์ธต ๊ตฌ์กฐ์˜ ์ตœ์ƒ์œ„ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

BATCH_JOB_EXECUTION_PARAMS


BATCH_JOB_EXECUTION_PARAMSย ํ…Œ์ด๋ธ”์—๋Š” Job์„ ์‹คํ–‰ ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ JobParameters์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

BATCH_JOB_EXECUTION


BATCH_JOB_EXECUTIONํ…Œ์ด๋ธ”์—๋Š” JobExcution์— ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. JobExcution์€ JobInstance๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ๋งˆ๋‹ค ์‹œ์ž‘์‹œ๊ฐ„, ์ข…๋ฃŒ์‹œ๊ฐ„, ์ข…๋ฃŒ์ฝ”๋“œ ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

BATCH_STEP_EXECUTION


BATCH_JOB_EXECUTIONํ…Œ์ด๋ธ”์—๋Š” StepExecution์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. BATCH_JOB_EXECUTION ํ…Œ์ด๋ธ”๊ณผ ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ์œ ์‚ฌํ•˜๋ฉฐ STEP์„ EXECUTION ์ •๋ณด์ธ ์ฝ์€ ์ˆ˜, ์ปค๋ฐ‹ ์ˆ˜, ์Šคํ‚ต ์ˆ˜ ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

BATCH_JOB_EXECUTION_CONTEXT


BATCH_JOB_EXECUTION_CONTEXTํ…Œ์ด๋ธ”์—๋Š” JobExecution์˜ExecutionContext ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.์ด ExecutionContext ๋ฐ์ดํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ JobInstance๊ฐ€ ์‹คํŒจ ์‹œ ์ค‘๋‹จ๋œ ์œ„์น˜์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

BATCH_STEP_EXECUTION_CONTEXT


BATCH_STEP_EXECUTION_CONTEXTํ…Œ์ด๋ธ”์—๋Š” StepExecution์˜ ExecutionContext ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด ExecutionContext ๋ฐ์ดํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ JobInstance๊ฐ€ ์‹คํŒจ ์‹œ ์ค‘๋‹จ๋œ ์œ„์น˜์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Ref


0๊ฐœ์˜ ๋Œ“๊ธ€