๐Ÿ˜จ ์ž…๊ธˆ๋œ ๋ˆ์ด ์‚ฌ๋ผ์กŒ๋‹ค? ๊ณ„์ขŒ ์ž”๊ณ  ์ •ํ•ฉ์„ฑ ๊ฒ€์ฆ ๋ฐฐ์น˜, Tasklet์—์„œ Chunk & Partitioning์œผ๋กœ์˜ ์ „ํ™˜๊ธฐ

์ •์ •์ผยท2024๋…„ 12์›” 24์ผ
0

์•ˆ๋…•ํ•˜์„ธ์š”.
์ €๋Š” ๋Œ€์ถœ ๋ฐ ํˆฌ์ž ์—ฐ๊ณ„ ํ”Œ๋žซํผ์—์„œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ๊ทผ๋ฌด ์ค‘์ธ 2๋…„ ์ฐจ ๊ฐœ๋ฐœ์ž ์ •์ •์ผ์ž…๋‹ˆ๋‹ค.

์šด์˜ ์ค‘์ธ ํšŒ์‚ฌ ์„œ๋น„์Šค์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๊ฒ€์ฆํ•˜๋˜ ์ค‘, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๊ณผ ๋ฐฐ์น˜ ์ž‘์—…์˜ ๋น„ํšจ์œจ์„ฑ์œผ๋กœ ์€ํ–‰ ๊ณ„์ขŒ ์ž”๊ณ ์™€ ์„œ๋น„์Šค ๋‚ด๋ถ€ ํฌ์ธํŠธ(Point)์˜ ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ์ •ํ•ฉ์„ฑ ๊ฒ€์ฆ ์ž‘์—…์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜, ์ž˜๋ชป๋œ ๋…ธํ‹ฐ๊ฐ€ ๋ฐœ์†ก๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ๊ธฐ์กด์˜ Tasklet ๊ธฐ๋ฐ˜ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, Chunk ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ์™€ Partitioning ๊ธฐ๋ฒ•์„ ๋„์ž…ํ•œ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.


1. ๋ฐฐ๊ฒฝ ์ƒํ™ฉ

์ €ํฌ ํšŒ์‚ฌ๋Š” ์˜จ๋ผ์ธํˆฌ์ž์—ฐ๊ณ„ ๊ธˆ์œตํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ๋Š” ์•ˆ์ „ํ•œ ์ž๊ธˆ์šด์šฉ์„ ์œ„ํ•ด ์‹ ํ•œ์€ํ–‰์„ ํ†ตํ•œ ์˜ˆ์น˜๊ธˆ ์‹ ํƒ ์šด์šฉ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์‚ฌ์˜ ์ž๊ธˆ ํ๋ฆ„์„ ๊ฐ„๋‹จํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๊ทธ๋ ค๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹ค์ด์–ด๊ทธ๋žจ์— ๊ทธ๋ ค์ง„ ๊ฒƒ ์™ธ์— ์ž๊ธˆ ํ๋ฆ„์ด ์กด์žฌํ•˜์ง€๋งŒ ํ˜„์žฌ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„๊ณผ๋Š” ๋ฌด๊ด€ํ•˜๋‹ˆ ๋นผ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์œ„ ๊ทธ๋ฆผ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์‹ค์ œ ์ž๊ธˆ์€ ์‹ ํ•œ์€ํ–‰์—์„œ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

ํˆฌ์ž์ž๊ฐ€ ๋งŒ์›์„ ์‹ ํ•œ์€ํ–‰ ๊ฐ€์ƒ๊ณ„์ขŒ๋กœ ์ž…๊ธˆํ•œ๋‹ค๋ฉด ์‹ค์ œ ์ž…๊ธˆ๋œ ๋งŒ์›์€ ์‹ ํ•œ์€ํ–‰์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ๋งŒ์›์ด ์ž…๊ธˆ๋๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ์ž์‚ฌ๋กœ ํ†ต์ง€๋œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์ €ํฌ ์—ญ์‹œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‹ ํ•œ์€ํ–‰๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ์‚ฌ์šฉ์ž์˜ ์ž”๊ณ ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ •ํ•ฉ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์šฉ์ž ์ž”๊ณ ๋Š” Point๋ผ ๋ช…๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์—์„œ๋Š” ๋ช…์นญ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๊ณ„์ขŒ ์ž”๊ณ  : ์‹ ํ•œ์€ํ–‰ ์˜ˆ์น˜๊ธˆ
  • Point : ์ž์‚ฌ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์˜ˆ์น˜๊ธˆ

๊ทธ๋ ‡๋‹ค๋ฉด ๊ณ„์ขŒ ์ž”๊ณ ์™€ Point์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๋ถˆ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์ฃ .

  • ํˆฌ์ž์ž A๊ฐ€ ์ž…๊ธˆ์„ ํ–ˆ์ง€๋งŒ ์€ํ–‰๊ณผ ์ž์‚ฌ ์„œ๋น„์Šค๊ฐ„ ์‚ฌ์ด์˜ ์ž…๊ธˆ ํ†ต์ง€ ์‚ฌ์ด ๋ฌธ์ œ๋กœ Point์— ๋ฐ˜์˜์ด ๋˜์ง€ ์•Š์•˜์„ ๋•Œ

  • ์›๋ฆฌ๊ธˆ ์ง€๊ธ‰ ์š”์ฒญ์œผ๋กœ ์‹ ํ•œ์€ํ–‰์—์„œ ํˆฌ์ž์ž ๊ฐ€์ƒ๊ณ„์ขŒ๋กœ ์ž…๊ธˆ ์ฒ˜๋ฆฌ ํ–ˆ์œผ๋‚˜ Point์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

  • ํˆฌ์ž์ž๊ฐ€ ํˆฌ์žํ•œ ์ดํ›„์— Point๋Š” ์ฐจ๊ฐํ–ˆ์œผ๋‚˜ ์‹ค์ œ ๋Œ€์ถœ์€ ์‹คํ–‰๋˜์ง€ ์•Š์•„ ๊ณ„์ขŒ ์ž”๊ณ ์—์„œ๋Š” ์ฐจ๊ฐ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

๋ฌผ๋ก  ๋ˆ์— ๊ด€๋ จ๋œ ๊ต‰์žฅํžˆ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋งŽ์€ ๋ฐฉ์–ด๋กœ์ง๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ •ํ•ฉ์„ฑ์ด ๊นจ์ง€๋Š” ๊ฒฝ์šฐ๋Š” ๊ต‰์žฅํžˆ ๋“œ๋ฌผ๋‹ค๊ณ  ๋ง์”€ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ๋˜ ๋ถ€๋ถ„์€ ์‹ค์ œ ๊ณ„์ขŒ ์ž”๊ณ ์™€ Point ์‚ฌ์ด์˜ ๊ฐ„๊ทน์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ถ€๋ถ„์„ ์„ค๋ช…๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฐ ๋ฐฐ๊ฒฝ๋ถ€๋ถ„์„ ์„ค๋ช…๋“œ๋ฆฌ๋ฉฐ ๋ฌธ์ œ์ƒํ™ฉ์œผ๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


2. ๋ฌธ์ œ ์ƒํ™ฉ

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ๋Œ€๋กœ ๊ณ„์ขŒ ์ž”๊ณ ์™€ Point๋Š” ๋ˆ๊ณผ ๊ด€๋ จ๋œ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ์ž„์œผ๋กœ ์ˆ˜๋งŽ์€ ๋ฐฉ์–ด๋กœ์ง ์™ธ์—๋„ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์„ ์œ„ํ•ด ํ•˜๋ฃจ์— ํ•œ๋ฒˆ ์‚ฌ์šฉ์ž๋ถ„๋“ค์˜ ๊ณ„์ขŒ ์ž”๊ณ ์™€ Point ๋ฐ์ดํ„ฐ ์‚ฌ์ด์— ์ฐจ์ด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์˜ˆ์น˜๊ธˆ์„ ๋น„๊ตํ•˜๊ณ  ๊ณ„์ขŒ ์ž”์•ก๊ณผ Point์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ชฉ๋ก์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋…ธํ‹ฐํ•ด์ฃผ๋Š” ๋ฐฐ์น˜๊ฐ€ ๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด Tasklet ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋˜ ์˜ˆ์น˜๊ธˆ ๋น„๊ต Job์ž…๋‹ˆ๋‹ค.
์œ„ ๊ทธ๋ฆผ๋งŒ ๋ณด๋”๋ผ๋„ ๋ช‡๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ์–ธ๊ธ‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํˆฌ์ž์ž๊ฐ„ ์ž”๊ณ ๋Š” ์„œ๋กœ ์˜์กด์„ฑ์ด ์—†๋Š”๋ฐ๋„ ๋™๊ธฐ, ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํ•ด๋‹น Job์ด ๊ฒฐ๊ณผ์ ์œผ๋กœ Batch์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋งŽ์ด ์žก์•„๋จน๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  2. ํ•œ step์•ˆ์—์„œ ์ฐจ์•ก ๋น„๊ต์™€ ๋น„๊ต ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ•ธ๋“ค๋ง์„ ๋ชจ๋‘ ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ Step์•ˆ์— ์ฑ…์ž„์ด ์—ฌ๋Ÿฌ๊ฐœ ์กด์žฌํ•˜๊ฒŒ๋ผ ๊ฐ€๋…์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์  ์™ธ์— ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•œ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ๋” ์กด์žฌํ–ˆ๋Š”๋ฐ ์ด ์ด์œ ๋ฅผ ๊ทผ๊ฑฐ๋กœ ๊ด€๋ฆฌ์ž๋ถ„์„ ์„ค๋“ํ•˜์—ฌ ๋ฆฌํŽ™ํ† ๋ง์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Tasklet์ด ํ•ด๋‹น Step์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ํ•œ Transaction์œผ๋กœ ๋™์ž‘ํ–ˆ๊ธฐ๋•Œ๋ฌธ์— ์˜ˆ์น˜๊ธˆ ๋น„๊ต๋„์ค‘ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฐ”๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์ธ๋ฐ์š”.

7์‹œ์— Transaction์ด ์‹œ์ž‘ํ•˜๊ณ  7์‹œ 10๋ถ„์ฏค ์ž…๊ธˆ ํ†ต์ง€๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น point๋ฅผ ์ฝ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

์ €ํฌ๋Š” DB๋กœ Mysql์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ  Mysql์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ REPEATABLE READ์ด๊ธฐ ๋•Œ๋ฌธ์— MVCC๋กœ ๋™์ž‘ํ•ด transaction ์‹œ์ž‘ ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋ฒ„๋ฆฐ ๊ฒƒ์ด์ฃ .

(๋น„๊ต ๋กœ์ง์—๋Š” Point ๋ฟ๋งŒ ์•„๋‹Œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋“ค๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ex) ์ƒํ™˜ ์˜ˆ์ • ๊ธˆ์•ก, ํˆฌ์ž ๋Œ€๊ธฐ ๊ธˆ์•ก, ์ง€๊ธ‰ ์˜ˆ์ • ๊ธˆ์•ก ๋“ฑ. ์˜ˆ์‹œ์—์„œ๋Š” Point๋งŒ ํ…Œ์ด๋ธ”๋งŒ ์˜ˆ์‹œ๋กœ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. )

๋ถˆํ–‰์ค‘ ๋‹คํ–‰์œผ๋กœ๋Š” ๋…ธํ‹ฐ๋ฅผ ๋ฐ›์•„๋ณด๋Š” ๊ด€๋ฆฌ์ž๋Š” ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž (ํšŒ์‚ฌ ์ง์›๋ถ„) ์ด์‹œ๊ธฐ ๋•Œ๋ฌธ์— ๋…ธํ‹ฐ๋ฅผ ๋ฐ›์•„๋ณด๊ณ ๋„ ๋ฐฑ์˜คํ”ผ์Šค์—์„œ ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ณ„์ขŒ ์ž”๊ณ ์— ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด์ฃผ์‹œ์ง€๋งŒ ๊ด€๋ฆฌ์ž ์ž…์žฅ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ์—…๋ฌด๊ฐ€ ๋Š๋Š” ๊ฒƒ์ด๊ณ  ๊ฐœ๋ฐœ์ ์ธ ๊ด€์ ์—์„œ๋Š” ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋กœ ๋…ธํ‹ฐ๋ฅผ ๋ณด๋‚ด๋‹ˆ ์ด๋Š” ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Chunk์™€ Partitioning ๊ธฐ๋ฐ˜์œผ๋กœ ์ „ํ™˜

๊ธฐ์กด Tasklet ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ ๋ฐฐ์น˜ ์ž‘์—…์€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋ชจ๋“  ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜๋‹ค ๋ณด๋‹ˆ, ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ ์ „๊นŒ์ง€ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ 7์‹œ์— ๋ฐฐ์น˜ ์ž‘์—…์ด ์‹œ์ž‘๋œ ํ›„ ์ž…๊ธˆ ํ†ต์ง€๊ฐ€ 7์‹œ 10๋ถ„์— ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ๋ฐฐ์น˜ ๊ฒฐ๊ณผ์— ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋น„๊ต ์ž‘์—…๊ณผ ์•Œ๋ฆผ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋‹ค ๋ณด๋‹ˆ, ๋ฐฐ์น˜ ์ž‘์—… ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ณ  ์‹คํŒจ ์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฌ์ž‘์—…ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์กฐ์  ๋ฌธ์ œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋ฅผ ๋ชฉํ‘œ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„ ์ตœ์†Œํ™”
    ํŠธ๋žœ์žญ์…˜์„ ๊ฐ€๋Šฅํ•œ ์งง์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•ด ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๊ฐœ์„ .

  2. ์ฑ…์ž„ ๋ถ„๋ฆฌ
    ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ๊ณผ ์•Œ๋ฆผ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ.

  3. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋„์ž…
    ๋ฐ์ดํ„ฐ ๊ฐ„ ์˜์กด์„ฑ์ด ์—†๋Š” ํŠน์„ฑ์„ ํ™œ์šฉํ•ด ์ž‘์—… ์†๋„๋ฅผ ์ตœ์ ํ™”.

Chunk ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ๋กœ์˜ ์ „ํ™˜

Tasklet ๋ฐฉ์‹์—์„œ Chunk ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉฐ ๊ฐ€์žฅ ํฐ ๋ณ€ํ™”๋Š” ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๊ฐ€ ์ž‘์•„์กŒ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์ „์ฒด ์ž‘์—…์„ ์•„์šฐ๋ฅด๋‹ค ๋ณด๋‹ˆ ์ž‘์—… ์ค‘๊ฐ„์— ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ Chunk๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋ฉฐ ๊ฐ Chunk๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Chunk ์ฒ˜๋ฆฌ ๋ฐฉ์‹
    1. Reader: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์„ค์ •๋œ Chunk ํฌ๊ธฐ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ด.
    2. Processor: Reader๊ฐ€ ์ฝ์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ๊ฐ€๊ณตํ•˜๋Š” ์ž‘์—… ์ˆ˜ํ–‰.
    3. Writer: ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ํ›„์† ์ž‘์—… ์ˆ˜ํ–‰.

Chunk ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฐฐ์น˜ ์‹คํ–‰ ์ค‘์—๋„ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํŠน์ • Chunk๋งŒ ์žฌ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Partitioning์„ ํ†ตํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋„์ž…

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

ํˆฌ์ž์ž ์ž”๊ณ , Point ๋ฐ์ดํ„ฐ๊ฐ„์—๋Š” ์˜์กด์„ฑ์ด ์—†์œผ๋ฏ€๋กœ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ํ•„์š”๋Š” ์—†์—ˆ์ฃ .

์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด Partitioning ๊ธฐ๋ฒ•์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Partition์œผ๋กœ ๋‚˜๋ˆ  ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์†๋„๋ฅผ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Partitioning ์ ์šฉ ๋ฐฉ์‹
    1. ๋ฐ์ดํ„ฐ๋ฅผ GridSize๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ Partition์— ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹น.
    2. ๊ฐ Partition์€ ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ.
    3. Spring Batch์˜ PartitionHandler๋ฅผ ํ™œ์šฉํ•ด ๊ด€๋ฆฌ.

Partitioning์—์„œ ๋™์  ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์œ„ํ•œ QuerydslItemReader ๊ตฌํ˜„

Partitioning์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜๋œ Partition ๋‹จ์œ„๋กœ ๋‚˜๋ˆ  ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Partitioner๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ GridSize์— ๋”ฐ๋ผ ๋ฏธ๋ฆฌ ๋‚˜๋ˆ  ๊ฐ Partition์— ๋ถ„๋ฐฐํ•˜๊ณ , ๊ฐ Partition์€ ์ž์‹ ์—๊ฒŒ ํ• ๋‹น๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Partition์„ ๋ฏธ๋ฆฌ ๊ณ ์ • ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ„๋ฉด, ๊ฐ ํŒŒํ‹ฐ์…˜ ์Šค๋ ˆ๋“œ ๋ณ„ ์ข…๋ฃŒ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ์ƒ์ดํ•จ์—๋„ ๋†€๊ณ ์žˆ๋Š” ์Šค๋ ˆ๋“œ์—์„œ ์ถ”๊ฐ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ด ์ฒ˜๋ฆฌ์‹œ๊ฐ„์€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ €ํฌ ํŒ€์—์„œ๋Š” ์ด๋Ÿฐ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์˜ Reader๊ฐ€ ํ˜„์žฌ ์กฐํšŒ์ง€์ ์„ ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ•˜๋„๋ก ๊ณต์œ ํ•˜๊ฒŒ ํ•ด์„œ ๋จผ์ € writer์˜ ์ž‘์—…๊นŒ์ง€ ๋๋‚ธ ํŒŒํ‹ฐ์…˜์ด ๋‹ค์Œ์ž‘์—…์„ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


QuerydslPagingItemReader ๊ตฌํ˜„ ์ฝ”๋“œ ์˜ˆ์ œ

@Bean
@StepScope
public QuerydslPagingItemReader<BalanceCheckDto> querydslItemReader(
        @Value("#{jobParameters['startDate']}") Date startDate,
        @Value("#{jobParameters['endDate']}") Date endDate) {
    return new QuerydslPagingItemReader<>(entityManagerFactory, DEFAULT_CHUNK_SIZE, queryFactory -> {
        QBalanceCheck balanceCheck = QBalanceCheck.balanceCheck;
        return queryFactory.selectFrom(balanceCheck)
                .where(balanceCheck.createdDate.between(startDate, endDate))
                .orderBy(balanceCheck.id.asc());
    });
}
  • startDate, endDate: ๋ฐฐ์น˜ ์‹คํ–‰ ์‹œ ๋™์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ.
long currentExecutionOrder = executionOrder.getAndIncrement();
long startIndex = (currentExecutionOrder) * getPageSize();
int totalRecords = stepContext.getInt("totalRecords");

if (startIndex >= totalRecords) {
	initResults(); // ๋นˆ ๊ฒฐ๊ณผ๋กœ ์ดˆ๊ธฐํ™”
	tx.commit();
	return;
}

int chunkSizeToRead = Math.min(getPageSize(), (int) (totalRecords - startIndex)); // ๋‚จ์€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋งŒํผ ์ฝ๊ธฐ

// QueryDSL Query ์ƒ์„ฑ
JPQLQuery<T> query = createQuery()
	.offset(startIndex)
	.limit(chunkSizeToRead);

์™œ QuerydslPagingItemReader๋ฅผ ์„ ํƒํ–ˆ๋Š”๊ฐ€?

  • ๊ธฐ์กด ์ €ํฌ ํšŒ์‚ฌ๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ QueryDSL ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€์„ฑ์„ ๋งž์ถ”๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ ์‹œ์ ์— ํƒ€์ž…์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ์œ„ํ•ด๋„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌํŽ™ํ† ๋ง ํ›„ ์•„ํ‚คํ…์ณ

๊ฐœ์„ ๋œ ์ 

  • Querydsl ๊ธฐ๋ฐ˜ Reader๋ฅผ ๋„์ž…ํ•˜๋ฉฐ Reader๊ฐ€ ๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด์„œ ๋” ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐฐ์น˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • Step์„ ๊ฐ ์ฑ…์ž„์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๊ฐ Step์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฑ…์ž„๋“ค์„ ๋งก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • balanceInitializeStep : Partitioning์„ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…
    • balancePartitionStep : Partitioning์„ ์ด์šฉํ•œ ๋ณ‘๋ ฌ ์˜ˆ์น˜๊ธˆ ๋น„๊ต ์ž‘์—…
    • balanceSendSnsStep : ์˜ˆ์น˜๊ธˆ ๋น„๊ตํ•˜๋ฉฐ ์ฐจ์•ก ๋ฐœ์ƒํ•œ ๋Œ€์ƒ ๊ด€๋ฆฌ์ž ๋…ธํ‹ฐ
    • balanceResetStep : ์ด์ „ ๋ชจ๋“  ์Šคํƒญ ์™„๋ฃŒ ํ›„ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ์ž‘์—…

๊ทธ๋ฆฌ๊ณ  ์ €ํฌ๋Š” ํŠธ๋žœ์žญ์…˜์˜ ๋‹จ์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด Reader, Processor, Writer์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Reader, Processor, Writer๋ฅผ ์ฒญํฌ ๋‹จ์œ„๋กœ ํŠธ๋žœ์žญ์…˜์„ ๋ฌถ์–ด ์ž‘์—…ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ €ํฌ๋Š” ๊ณ„์ขŒ ์ž”์•ก์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ์‹ ํ•œ์€ํ–‰์—์„œ ๊ด€๋ฆฌํ•˜๋‹ค๋ณด๋‹ˆ ์ฒญํฌ๋‹จ์œ„๋กœ Reader, Processor, Writer์˜ transaction์„ ๋ฌถ๋Š”๋‹ค ํ•˜๋”๋ผ๋„ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.


์„ฑ๊ณผ์™€ ๊ฐœ์„ ๋œ ์ 

1. ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๊ฐ•ํ™”
ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ์˜ ํ™•๋ฅ ์ด ํ˜„์ €ํ•˜๊ฒŒ ์ค„์–ด๋“ค๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์ค‘๊ฐ„์— ๋ฐœ์ƒํ•œ ์ž…๊ธˆ ํ†ต์ง€๋‚˜ ๊ธฐํƒ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋„ ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ตœ๋Œ€ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„
    ๊ธฐ์กด: ์•ฝ 22๋ถ„ โ†’ ๋ณ€๊ฒฝ ํ›„: 0.01์ดˆ ์ˆ˜์ค€์œผ๋กœ ๊ฐ์†Œ.
    (๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒํ™•๋ฅ  1/132,000 )

2. ์ฒ˜๋ฆฌ ์†๋„์™€ ๋ฆฌ์†Œ์Šค ํšจ์œจ์„ฑ

  • Row๋‹น ์ฒ˜๋ฆฌ ์‹œ๊ฐ„
    ๊ธฐ์กด: 3.74์ดˆ โ†’ ๋ณ€๊ฒฝ ํ›„: 0.72์ดˆ (80% ๋‹จ์ถ•).

  • ํ‰๊ท  ์†Œ์š” ์‹œ๊ฐ„
    ๊ธฐ์กด Tasklet ๋ฐฉ์‹: 13.27๋ถ„ โ†’ Chunk/Partitioning ๋ฐฉ์‹: 4.77๋ถ„ (64% ๋‹จ์ถ•).

๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ์˜ ๊ณ ๋ฏผ๊ณผ ์‹œํ–‰์ฐฉ์˜ค

์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์™€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด SimpleAsyncTaskExecutor์™€ ThreadPoolTaskExecutor๋ฅผ ๋น„๊ต ํ…Œ์ŠคํŠธํ•˜๋ฉฐ ์ตœ์ ์˜ ์„ค์ •์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ํ’€ ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ์†๋„๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.


์œ„์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ gridSize ๋ฐ thread ๊ฐœ์ˆ˜๋Š” 10์œผ๋กœ ๊ณ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ  EntityManager๋ฅผ ๊ทธ๋ƒฅ closeํ•ด๋ฒ„๋ ธ์„ ๋•Œ
ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ณผ์ •์—์„œ Reader์—์„œ transaction์„ closeํ•˜์ง€ ์•Š๊ณ  entityManager๋ฅผ closeํ•ด๋ฒ„๋ ธ์„ ๋•Œ HikariCP Deadlock ๋ฌธ์ œ๋ฅผ ๋งž์ดํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. transaction์„ entityManager๊ฐ€ close ๋์„๋•Œ commitํ•˜๊ฒ ๊ฑฐ๋‹ˆ ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ ์•„๋‹ˆ์—ฌ์„œ ๋‹นํ™ฉํ–ˆ์—ˆ์ฃ . ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•œ๊ฑด๋ฐ ๋ง์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” transaction์„ closeํ•˜๊ณ  entityManager๋ฅผ closeํ•˜๋ฉด์„œ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Reader, Processor, Writer, Listener ๊ฐ„ ์—ญํ•  ๋ถ„๋ฆฌ
๋กœ์ง ๋ถ„๋ฆฌ ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋˜ ๋ถ€๋ถ„์ค‘ ํ•˜๋‚˜๋Š” Processor์™€ Writer ๊ฐ„์˜ ์—ญํ• ์ด ์ค‘์ฒฉ๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋…ธํ‹ฐํ•ด์•ผํ•  ํšŒ์› ๋ชฉ๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค์Œ Step์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ• ์ง€ ๊ณ ๋ฏผํ•œ ๋์— ConcurrentLinkedQueue๋ฅผ ์‚ฌ์šฉํ•ด ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ตฌํ˜„ ์ดˆ๊ธฐ์— initialize ์ž‘์—…์ด๋‚˜ ์ดˆ๊ธฐํ™” ์ž‘์—…์ด Listener์— ๊ตฌํ˜„์ด ๋˜์–ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์ด ํด๋ž˜์Šค์˜ ์—ญํ• ๊ณผ ๋งž์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์— Step์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.


(ํ•ด๋‹น ์ฝ”๋“œ ๋ฆฌ๋ทฐํ›„์— ์Šคํฌ๋Ÿผ์„ ํ†ตํ•ด ๊ฐœ์„ ์ ์„ ์กฐ์œจํ•˜๊ณ  ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค!)


๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ €๋กœ์„œ๋Š” Chunk, Partitioning ๋„์ž…์„ ํ†ตํ•œ ๋ฌธ์ œํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์–ดํ•„ํ•˜์—ฌ ํŒ€์žฅ๋‹˜์„ ์„ค๋“ํ•˜๋Š” ๊ณผ์ •๋ถ€ํ„ฐ๊ฐ€ ๋„์ „์ด์˜€์Šต๋‹ˆ๋‹ค.
๋‹คํ–‰ํžˆ ํŒ€์žฅ๋‹˜๋˜ํ•œ ํ•„์š”์„ฑ์„ ๊ณต๊ฐํ•ด์ฃผ์…จ๊ณ  ์ €ํฌ ํŒ€์—์„œ ๋งก์•„์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

ํŠนํžˆ Chunk์™€ Partitioning ๊ธฐ๋ฒ•์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด ํšจ์œจ์ ์ธ ๋ฐฐ์น˜๋ฅผ ์„ค๊ณ„ํ•œ ์ ์€ ํ–ฅํ›„ ๋‹ค๋ฅธ ๋ฐฐ์น˜ ์ž‘์—…์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์„ ๋ก€๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒฝํ—˜ํ•˜๋ฉฐ Spring Batch์— ๋Œ€ํ•œ ์ดํ•ด๋„๋„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ๋˜ ์‹œ๊ฐ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋ฆฌํŒฉํ† ๋ง์—์„œ ์ €๋Š” ์‹ค์ œ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•˜์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Chunk, Partitioning ๋„์ž… ์ œ์•ˆ, ์ฐธ์—ฌ ์ธ์› ๊ฒฐ์ •, ์ผ์ • ์กฐ์œจ, ์Šคํฌ๋Ÿผ ์ง„ํ–‰, ๋„์ž… ๊ธฐ์ˆ  ๊ฒฐ์ •, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋“ฑ์„ ๋‹ด๋‹นํ–ˆ๊ณ  ์•„ํ‚คํ…์ณ ์„ค๊ณ„, ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…, ๊ตฌํ˜„๋ฐฉํ–ฅ ์„ค์ • ๋“ฑ์— ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

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


Reference

https://techblog.woowahan.com/2662/
https://jojoldu.tistory.com/336
https://jojoldu.tistory.com/339
https://docs.spring.io/spring-batch/reference/readersAndWriters.html

profile
ํ•˜๋ฃจํ•˜๋ฃจ ๋” ๋ฐœ์ „ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

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