Spring Batch ๋„์ž…๊ธฐ!! - Tasklet vs Chunk, ๋ญ๊ฐ€ ๋‹ค๋ฅธ๋ฐ? (#2)

2025. 7. 5. 23:54ยท๐Ÿ’ชBackend/Spring

2025.07.03 - [๐Ÿ’ชBackend/Spring] - Spring Batch ๋„์ž…๊ธฐ!! - @Scheduled๋กœ๋Š” ๋ถ€์กฑํ–ˆ๋‹ค(#1)

 

๐Ÿ‘€ ๋“ค์–ด๊ฐ€๋ฉฐ

Spring Batch๋ฅผ ๋„์ž…ํ•œ ํ›„, ์ฒ˜์Œ ๋งˆ์ฃผํ•œ ์‹ค์งˆ์ ์ธ ๊ณ ๋ฏผ์€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค:

Tasklet์„ ์จ์•ผ ํ• ๊นŒ, Chunk๋ฅผ ์จ์•ผ ํ• ๊นŒ?

 

๋ฌธ์„œ์—๋„, ๋ธ”๋กœ๊ทธ์—๋„ ๋งŽ์€ ์„ค๋ช…์ด ์žˆ์ง€๋งŒ, ์ง์ ‘ ์ ์šฉํ•˜๋ ค ํ•˜๋‹ˆ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

 

 

  • ์ข…๋ชฉ๋ณ„๋กœ API๋ฅผ ํ˜ธ์ถœํ•ด 3๋…„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ์ž‘์—…
  • ๋งค์ผ ์ฃผ์‹ ๋งˆ๊ฐ ํ›„ ํ•˜๋ฃจ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์ž‘์—…

์ €๋Š” ์œ„์™€ ๊ฐ™์€ ์ž‘์—…๋“ค์„ ๋ฆฌํŒฉํ† ๋ง ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์ž‘์—…๋“ค์— ์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒŒ ๋งž์„๊นŒ์š”?
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Tasklet๊ณผ Chunk์˜ ๊ตฌ์กฐ์  ์ฐจ์ด์™€ ์ ์šฉ ๊ธฐ์ค€์„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค..!!

 

 


 

๐Ÿงฑ ๊ธฐ๋ณธ ๊ฐœ๋…

 

โœ… Tasklet ๊ธฐ๋ฐ˜

 
stepBuilderFactory.get("step")
    .tasklet((contribution, chunkContext) -> { 
        // ํ•œ ๋ฒˆ์— ์ „์ฒด ์ž‘์—… ์ˆ˜ํ–‰ 
        return RepeatStatus.FINISHED; 
     }) 
    .build();
  • ๋‹จ์ผ ๋ฉ”์„œ๋“œ์—์„œ ์ „์ฒด ์ž‘์—… ์ˆ˜ํ–‰
  • ๋ฐ˜๋ณต๋ฌธ, API ํ˜ธ์ถœ, ํŒŒ์ผ ์‚ญ์ œ ๋“ฑ ๋ช…๋ นํ˜• ๋กœ์ง์— ์ ํ•ฉ
  • ์ž‘์—… ํ๋ฆ„์ด ๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•  ๋•Œ ์‚ฌ์šฉ

 

โœ… Chunk ๊ธฐ๋ฐ˜

stepBuilderFactory.get("step")
    .<Input, Output>chunk(100)
    .reader(reader)
    .processor(processor)
    .writer(writer)
    .build();
  • ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์€ ๋ฉ์–ด๋ฆฌ(chunk)๋กœ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌ
  • Reader → Processor → Writer ๊ตฌ์กฐ๋กœ ์—ญํ•  ๋ถ„๋ฆฌ
  • ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ์ƒํƒœ ์ €์žฅ, ์‹คํŒจ ๋ณต๊ตฌ, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋“ฑ์—์„œ ๊ฐ•๋ ฅํ•จ

 

 


 

 

๐Ÿ” ์–ธ์ œ ๋ฌด์—‡์„ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ?

 

  Tasklet Chunk
๊ตฌ์กฐ ๋‹จ์ผ ๋ฉ”์„œ๋“œ Reader-Processor-Writer
์ ํ•ฉํ•œ ์ž‘์—… ๋ฐ˜๋ณต๋ฌธ, ๋‹จ๋ฐœ์„ฑ API ํ˜ธ์ถœ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
ํŠธ๋žœ์žญ์…˜ ์ „์ฒด ์ž‘์—… ๋‹จ์œ„ Chunk ๋‹จ์œ„ ํŠธ๋žœ์žญ์…˜
์ƒํƒœ ์ €์žฅ ์—†์Œ ๊ฐ€๋Šฅ (Restart ์ง€์›)
๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์–ด๋ ต๊ฑฐ๋‚˜ ์ˆ˜๋™ ๊ตฌํ˜„ ๋‚ด์žฅ ๊ธฐ๋Šฅ ์žˆ์Œ
๋Œ€ํ‘œ ์˜ˆ์‹œ ํŒŒ์ผ ์‚ญ์ œ, ๋””๋ ‰ํ† ๋ฆฌ ์ •๋ฆฌ, for๋ฌธ ์ˆœํšŒ DB → ๊ฐ€๊ณต → DB ์ €์žฅ
 
 

 

โœ‹ ์ €์˜ ๊ณ ๋ฏผ ์‚ฌ๋ก€

Spring Batch๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ, ์ €๋Š” ๋จผ์ € 3๋…„์น˜ ์ฃผ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ดˆ๊ธฐํ™” ์ž‘์—…๊ณผ ์‹œ๊ฐ€์ด์•ก ๊ณ„์‚ฐ, ์„นํ„ฐ๋ณ„ ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ๊ณผ ๊ฐ™์€ ํ›„์ฒ˜๋ฆฌ ์ž‘์—…๋“ค์„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋งˆ์ฃผํ•œ ๊ณ ๋ฏผ์ด ๊ธ€์˜ ๋„์ž…๋ถ€์˜€๋˜.. ์–ด๋–ค ๋ฐฉ์‹์„ ์ ์šฉํ• ์ง€!์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ฒ˜์Œ์—” “Chunk๊ฐ€ ๋” ์ •์„์ ์ธ ๊ตฌ์กฐ๋‹ˆ๊นŒ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•˜์ง€ ์•Š์„๊นŒ?”๋ผ๋Š” ์ƒ๊ฐ๋„ ๋“ค์—ˆ์ง€๋งŒ, ์ง์ ‘ ์ ์šฉํ•ด๋ณด๋ฉฐ ๋А๋‚€ ๊ฑด ์ž‘์—…์˜ ํŠน์„ฑ๊ณผ ์ฒ˜๋ฆฌ ๋Œ€์ƒ์— ๋”ฐ๋ผ ๊ฐ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์ด ๋ถ„๋ช…ํžˆ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 


 

โœ… ์ข…๋ชฉ ๋ฐ์ดํ„ฐ ์ €์žฅ: Chunk ๊ธฐ๋ฐ˜

 

์ด ์ž‘์—…์€ 3๋…„์น˜ ์ฃผ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์„นํ„ฐ๋ณ„ ์ข…๋ชฉ ๊ธฐ์ค€์œผ๋กœ API ํ˜ธ์ถœ → ๊ฐ€๊ณต → DB/Redis ์ €์žฅํ•˜๋Š” ์ดˆ๊ธฐํ™” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
์ฒ˜๋ฆฌ ๋Œ€์ƒ๋„ ๋งŽ๊ณ , ๋™์ผํ•œ ์ž‘์—…์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Chunk ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

  • Reader: ์„นํ„ฐ๋ณ„ ์ข…๋ชฉ ๋ชฉ๋ก์„ ํ•˜๋‚˜์”ฉ ๋ฐ˜ํ™˜
  • Processor: ๊ฐ ์ข…๋ชฉ๋ณ„๋กœ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‘๋‹ต๊ฐ’์„ ๊ฐ€๊ณต
  • Writer: ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ DB์™€ Redis์— ์ €์žฅ

 

์ด ๊ตฌ์กฐ๋ฅผ Chunk๋กœ ๊ตฌํ˜„ํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์„นํ„ฐ ๋‹จ์œ„ ํŠธ๋žœ์žญ์…˜ ๋ถ„๋ฆฌ → ํ•˜๋‚˜์˜ ์„นํ„ฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ๋„ ๋‹ค๋ฅธ ์„นํ„ฐ์—๋Š” ์˜ํ–ฅ ์—†์Œ
  • faultTolerant() ์„ค์ •์„ ํ†ตํ•ด API ์‹คํŒจ ์žฌ์‹œ๋„, ์ผ๋ถ€ ์ข…๋ชฉ Skip ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ์„ฑ ํ™•๋ณด
  • Reader/Writer ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”ํ›„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋˜๋Š” ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์‰ฌ์›€

Chunk์˜ ๊ตฌ์กฐ์  ํ™•์žฅ์„ฑ๊ณผ ํšŒ๋ณต๋ ฅ ํ™•๋ณด!

 


 

โœ… ์‹œ๊ฐ€์ด์•ก ๊ณ„์‚ฐ: Tasklet ๊ธฐ๋ฐ˜

 

์‹œ๊ฐ€์ด์•ก ๊ณ„์‚ฐ์€ ๊ฐ ์ข…๋ชฉ์˜ ์ข…๊ฐ€ × ์œ ํ†ต์ฃผ์‹์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด ์ €์žฅํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
์ข…๋ชฉ ์ˆ˜๋Š” ๋งŽ์ง€๋งŒ, ์ „์ฒด ํ๋ฆ„์€ ๋‹จ์ˆœ ๊ณ„์‚ฐ ๋ฐ˜๋ณต์— ๊ฐ€๊น๊ณ , ํŠธ๋žœ์žญ์…˜์„ ๋‚˜๋ˆŒ ํ•„์š”๋„, ์ƒํƒœ๋ฅผ ์ถ”์ ํ•  ํ•„์š”๋„ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ฒŒ๋‹ค๊ฐ€ ์ด ๋กœ์ง์€ ์ด๋ฏธ ์„œ๋น„์Šค ๋ ˆ์ด์–ด์— ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Tasklet ๋‚ด๋ถ€์—์„œ ํ•ด๋‹น ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ๋ฅผ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฐ์น˜ ์ „์šฉ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด Chunk๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์—ˆ๊ฒ ์ง€๋งŒ, ๊ธฐ์กด ๊ฒ€์ฆ๋œ ๋กœ์ง์„ ์•ˆ์ •์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๋ฐฐ์น˜ํ™”ํ•œ ๊ฒƒ์ด ์ด๋ฒˆ ์ƒํ™ฉ์—์„œ๋Š” ๋” ํšจ์œจ์ ์ผ ๊ฑฐ๋ผ๋Š” ํŒ๋‹จ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 


 

๐Ÿง  Tasklet vs Chunk – ์†๋„? ๊ตฌ์กฐ? ๋ณต๊ตฌ?

์ฒ˜์Œ์—๋Š” "Tasklet์ด ๋” ๋น ๋ฅด์ง€ ์•Š์„๊นŒ?"๋ผ๋Š” ์ƒ๊ฐ๋„ ํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ์ค‘์š”ํ•œ ๊ฑด ์†๋„ ์ž์ฒด๋ณด๋‹ค๋Š” ์ž‘์—…์˜ ์„ฑ๊ฒฉ์— ๋งž๋Š” ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

  Tasklet Chunk
๊ตฌ์กฐ ๋‹จ์ˆœ ๋ฉ”์„œ๋“œ → ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋ช…ํ™•ํ•œ ๋‹จ๊ณ„ ๋ถ„๋ฆฌ (Reader-Processor-Writer)
๋ณต๊ตฌ/์žฌ์‹œ๋„ ์ง์ ‘ try-catch ํ•„์š” retry(), skip() ๋“ฑ ๋‚ด์žฅ ๊ธฐ๋Šฅ
ํŠธ๋žœ์žญ์…˜ ์ „์ฒด ์ž‘์—… 1ํŠธ๋žœ์žญ์…˜ Chunk ๋‹จ์œ„๋กœ ๋ถ„ํ•  ์ฒ˜๋ฆฌ
์ ํ•ฉํ•œ ๊ฒฝ์šฐ ๋‹จ์ˆœ ๋ฐ˜๋ณต, ๊ณ„์‚ฐ, ๋ช…๋ นํ˜• ๋กœ์ง ๋Œ€๋Ÿ‰ ๋ฐ˜๋ณต, ์•ˆ์ •์„ฑ, ์ƒํƒœ ์ถ”์  ํ•„์š”
ํ™•์žฅ์„ฑ ์ œํ•œ์  ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ, ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ ๋“ฑ ์šฉ์ด
 

 


 

โœ… ๊ฒฐ๋ก 

๊ฒฐ๊ณผ์ ์œผ๋กœ,

  • ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌํ•˜๊ณ , ํ–ฅํ›„ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ž‘์—…์—๋Š” Chunk ๊ธฐ๋ฐ˜
  • ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ ๊ณ  ๊ณ„์‚ฐ ์ค‘์‹ฌ์ด๋ฉฐ, ์ด๋ฏธ ์ž‘์„ฑ๋œ ๋กœ์ง์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์—๋Š” Tasklet ๊ธฐ๋ฐ˜

์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์„ ํƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 


 

โœ๏ธ ๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐ์กด ์Šค์ผ€์ค„๋Ÿฌ ์ค‘์‹ฌ์˜ ๊ตฌ์กฐ๋ฅผ Job ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ , ์–ด๋–ค ์ž‘์—…์„ ์–ด๋–ค Step์œผ๋กœ ๋ถ„๋ฆฌํ–ˆ๋Š”์ง€๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

๊ตฟ๋ฐ”์ด..~.~ 

 

'๐Ÿ’ชBackend > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Batch ๋„์ž…๊ธฐ!! - @Scheduled๋กœ๋Š” ๋ถ€์กฑํ–ˆ๋‹ค(#1)  (1) 2025.07.03
MSA์—์„œ Response Entity์™€ Response custom class๋กœ ์‘๋‹ต ํ†ต์ผํ•˜๊ธฐ  (2) 2025.03.04
[Spring] DI(์˜์กด์„ฑ ์ฃผ์ž…): ์™œ ํ•„์š”ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?  (5) 2025.02.07
'๐Ÿ’ชBackend/Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Spring Batch ๋„์ž…๊ธฐ!! - @Scheduled๋กœ๋Š” ๋ถ€์กฑํ–ˆ๋‹ค(#1)
  • MSA์—์„œ Response Entity์™€ Response custom class๋กœ ์‘๋‹ต ํ†ต์ผํ•˜๊ธฐ
  • [Spring] DI(์˜์กด์„ฑ ์ฃผ์ž…): ์™œ ํ•„์š”ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?
.๋ฐ.
.๋ฐ.
  • .๋ฐ.
    Do IT
    .๋ฐ.
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • All (40)
      • ๐Ÿ’ป ์•Œ๊ณ ๋ฆฌ์ฆ˜ (21)
        • PS (16)
        • SQL (4)
        • ์ด๋ก  (5)
      • ๐ŸŽˆcapstone (2)
      • ๐Ÿ’ชBackend (12)
        • Django (8)
        • Spring (4)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์Šคํ”„๋ง๋ฐฐ์น˜
    Django
    crud
    python
    springscheduler
    apiresponse
    Batch
    ์„œ๋ธŒ์ฟผ๋ฆฌ
    programmers
    ์ฝ”ํ…Œ
    bruteforce
    ์‘๋‹ตํ˜•์‹
    SQL
    ETL
    ๋‹ค์ค‘์กฐ์ธ
    ๋ฌธ์ œํ’€์ด
    PS
    ๋ฐฑ์ค€
    responsecustomclass
    BOJ
    ํŒŒ์ด์ฌ
    BFS
    ์ž๋ฐ”
    resposneentity
    windowํ•จ์ˆ˜
    ์žฌ๊ท€
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ์Šค์ผ€์ค„๋Ÿฌ
    MYSQL
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
.๋ฐ.
Spring Batch ๋„์ž…๊ธฐ!! - Tasklet vs Chunk, ๋ญ๊ฐ€ ๋‹ค๋ฅธ๋ฐ? (#2)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”