- Job Parameter ์ ๋ฐ๋ผ ์์ฑ๋๋ ํ ์ด๋ธ
- Spring Batch ๊ฐ ์คํ๋ ๋, ์ธ๋ถ์์ ๋ฐ์ ์ ์๋ ํ๋ผ๋ฏธํฐ
- ๋์ผํ Job Parameter ๋ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค.
- Job_Execution ๊ณผ Job_Instance ๋
์์ - ๋ถ๋ชจ๊ด๊ณ - Job_Execution ์ ์์ ์ ๋ถ๋ชจ Job_Instance ๊ฐ ์ฑ๊ณต/์คํจํ๋ ๋ชจ๋ ๋ด์ญ์ ๊ฐ์ต๋๋ค.
- ๋์ผํ Job Parameter ๋ก ์ฑ๊ณตํ ๊ธฐ๋ก์ด ์์ ๋๋ง ์ฌ์ํ์ ํ์ง ์์ต๋๋ค.
- Batch_Job_Execution ํ ์ด๋ธ์ด ์์ฑ๋ ๋น์ ์ ๋ ฅ ๋ฐ์ Job Parameter ๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- BatchStatus: Job ๋๋ Step ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ Spring ์์ ๊ธฐ๋กํ ๋ ์ฌ์ฉํ๋
Enum- BatchStatus ๋ก ์ฌ์ฉ๋๋ ๊ฐ:
COMPLETED, STARTING, STARTED, STOPPED, FAILED, ABANDONED, UNKNOWN
- BatchStatus ๋ก ์ฌ์ฉ๋๋ ๊ฐ:
- ExitStatus: Step ์ ์คํ ํ ์ํ
.on("FAILED").to(stepB())์ฝ๋์์on๋ฉ์๋๊ฐ ์ฐธ์กฐํ๋ ๊ฒ์ BatchStatus ๊ฐ ์๋๊ณ , ์ค์ ์ฐธ์กฐ๋๋ ๊ฐ์ Step ์ ExitStatus ์ ๋๋ค.- ExitStatus ๋ Enum ์ด ์๋๋๋ค.
- Spring Batch ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ExitStatus ์ exitCode ๋ Step ์ BatchStatus ์ ๊ฐ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค.
- Step ๋ค์ Flow ์์์ ๋ถ๊ธฐ๋ง ๋ด๋นํ๋ ํ์
- ์ฌ๊ธฐ์ ๋งํ๋ Scope ๋
@StepScope, @JobScope์ ๋๋ค. - Spring Batch ์ ๊ฒฝ์ฐ ์ธ๋ถ ๋๋ ๋ด๋ถ์์ Parameter ๋ฅผ ๋ฐ์ ์ฌ๋ฌ Batch ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๊ฒ ์ง์ํฉ๋๋ค. ์ด ํ๋ผ๋ฏธํฐ๋ฅผ Job Parameter ๋ผ๊ณ ํฉ๋๋ค.
- Job Parameter ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํญ์ Spring Batch ์ ์ฉ
Scope๋ฅผ ์ ์ธํด์ผ๋ง ํฉ๋๋ค. - ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด SpEL ๋ก ์ ์ธํ์ฌ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
@Value("#{jobParameters[ํ๋ผ๋ฏธํฐ๋ช ]}")jobParameters์ธ์๋jobExecutionContext, stepExecutionContext๋ฑ๋ SpEL ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.- @JobScope ์์๋
stepExecutionContext๋ ์ฌ์ฉํ ์ ์๊ณ ,jobParameters, jobExecutionContext๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
Spring Batch ๋
@StepScope, @JobScope๋ผ๋ ์์ฃผ ํน๋ณํ Bean Scope ๋ฅผ ์ง์ํฉ๋๋ค.- ( Spring Bean ์ ๊ธฐ๋ณธ Scope ๋ singleton )
-
Spring Batch ์ปดํฌ๋ํธ (Tasklet, ItemReader, ItemWriter, ItemProcessor ๋ฑ)์
@StepScope๋ฅผ ์ฌ์ฉํ๋ฉด -
Spring Batch ๊ฐ Spring ์ปจํ ์ด๋๋ฅผ ํตํด ์ง์ ๋ Step ์ ์คํ ์์ ์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ Spring Bean ์ผ๋ก ์์ฑํฉ๋๋ค.
-
@JobScope๋ Job ์คํ ์์ ์ Bean ์ด ์์ฑ๋ฉ๋๋ค. -
์ฆ, Bean ์ ์์ฑ ์์ ์ ์ง์ ๋ Scope ๊ฐ ์คํ๋๋ ์์ ์ผ๋ก ์ง์ฐ์ํต๋๋ค.
์ด๋ ๊ฒ Bean ์ ์์ฑ ์์ ์ ์ดํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ด ์๋, Step ํน์ Job ์ ์คํ ์์ ์ผ๋ก ์ง์ฐ์ํด์ผ๋ก์จ ์ป๋ ์ฅ์ ์ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ฒซ์งธ, Job Parameter ์ Late Binding ์ด ๊ฐ๋ฅํฉ๋๋ค.
- Job Parameter ๋ฅผ StepContext ๋๋ JobExecutionContext ๋ ๋ฒจ์์ ํ ๋นํ ์ ์์ต๋๋ค.
- ๊ผญ Application ์ด ์คํ๋๋ ์์ ์ด ์๋๋๋ผ๋ Controller, Service ์ ๊ฐ์ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๋จ๊ณ์์ Job Parameter ๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค.
- ๋์งธ, ๋์ผํ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋ ฌ ํน์ ๋์์ ์ฌ์ฉํ ๋ ์ ์ฉํฉ๋๋ค.
- Step ์์ Tasklet ์ด ์๊ณ , ์ด Tasklet ์๋ ๋ฉค๋ฒ ๋ณ์์ ์ด ๋ฉค๋ฒ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ก์ง์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
- ์ด ๊ฒฝ์ฐ
@StepScope์์ด Step ์ ๋ณ๋ ฌ๋ก ์คํ์ํค๋ฉด ์๋ก ๋ค๋ฅธ Step ์์ ํ๋์ Tasklet ์ ๋๊ณ ๋ง๊ตฌ์ก์ด๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํ ๊ฒ์ ๋๋ค. - ํ์ง๋ง,
@StepScope๊ฐ ์๋ค๋ฉด ๊ฐ๊ฐ์ Step ์์ ๋ณ๋์ Tasklet ์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์๋ก์ ์ํ๋ฅผ ์นจ๋ฒํ ์ผ์ด ์์ต๋๋ค.
- Job Parameters ๋
@Value๋ฅผ ํตํด์ ๊ฐ๋ฅํฉ๋๋ค. - Job Parameters ๋ Step ์ด๋, Tasklet, Reader ๋ฑ Batch ์ปดํฌ๋ํธ Bean ์ ์์ฑ ์์ ์ ํธ์ถํ ์ ์์ต๋๋ค.
- ์ ํํ๋
@StepScope, @JobScopeBean ์ ์์ฑํ ๋๋ง ํธ์ถํ ์ ์์ต๋๋ค.
- ์ ํํ๋
Spring Batch ์ ํฐ ์ฅ์ ์ค ํ๋๋ก Chunk ์งํฅ ์ฒ๋ฆฌ๊ฐ ์์ต๋๋ค.
- Spring Batch ์์์ Chunk ๋ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ก, ์์ ํ ๋ ๊ฐ ์ปค๋ฐ ์ฌ์ด์ ์ฒ๋ฆฌ๋๋ row ์๋ฅผ ๋งํฉ๋๋ค.
- ์ฆ, Chunk ์งํฅ ์ฒ๋ฆฌ๋ ํ ๋ฒ์ ํ๋์ฉ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด Chunk ๋ผ๋ ๋ฉ์ด๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , Chunk ๋จ์๋ก ํธ๋์ญ์ ์ ๋ค๋ฃจ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- Chunk ๋จ์๋ก ํธ๋์ญ์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ ์คํจํ ๊ฒฝ์ฐ ํด๋น Chunk ๋งํผ๋ง ๋กค๋ฐฑ๋๊ณ , ์ด์ ์ ์ปค๋ฐ๋ ํธ๋์ญ์ ๋ฒ์๊น์ง๋ ๋ฐ์๋ฉ๋๋ค.
- Reader ์ Processor ์์๋ 1๊ฑด์ฉ ๋ค๋ค์ง๊ณ , Writer ์์ Chunk ๋จ์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
- Chunk ์งํฅ ์ฒ๋ฆฌ์ ์ ์ฒด ๋ก์ง์ ๋ค๋ฃจ๋ ๊ฒ์
ChunkOrientedTaskletํด๋์ค์ ๋๋ค. ChunkOrientedTasklet์execute()๋ฉ์๋ ๋ด๋ถ ์ฝ๋chunkProvider.provide()๋ก Reader ์์ Chunk Size ๋งํผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.chunkProcessor.process()์์ Reader ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต(Processor)ํ๊ณ ์ ์ฅ(Writer)ํฉ๋๋ค.
chunkProvider.provide()๋ด๋ถinputs๊ฐ Chunk Size ๋งํผ ์์ผ ๋๊น์งread()๋ฅผ ํธ์ถํฉ๋๋ค.- ์ค์ ๋ก๋
ItemReader.read๋ฅผ ํธ์ถํฉ๋๋ค. - ์ฆ,
ItemReader.read์์ 1๊ฑด์ฉ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด Chunk Size ๋งํผ ๋ฐ์ดํฐ๋ฅผ ์๋ ๊ฒ์ดprovide()๊ฐ ํ๋ ์ผ์ ๋๋ค.
- Processor ์ Writer ๋ก์ง์ ๋ด๊ณ ์๋ ๊ฒ์
ChunkProcessor๊ฐ ๋ด๋นํฉ๋๋ค. ChunkProcessor๋ ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๊ตฌํ์ฒด๊ฐ ์์ด์ผ ํฉ๋๋ค.- ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด
SimpleChunkProcessor์ ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด
- ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ํต์ฌ ๋ก์ง์
process()์ ๋๋ค.Chunk<I> inputs๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ต๋๋ค.- ์ด ๋ฐ์ดํฐ๋ ์์
chunkProvider.provide()์์ ๋ฐ์ Chunk Size ๋งํผ ์์ธ item ์ ๋๋ค.
- ์ด ๋ฐ์ดํฐ๋ ์์
transform()์์๋ ์ ๋ฌ ๋ฐ์inputs์doProcess()๋ก ์ ๋ฌํ๊ณ ๋ณํ๊ฐ์ ๋ฐ์ต๋๋ค.transform()์ ํตํด ๊ฐ๊ณต๋ ๋๋์ ๋ฐ์ดํฐ๋write()๋ฅผ ํตํด ์ผ๊ด ์ ์ฅ๋ฉ๋๋ค.write()๋ ์ ์ฅ์ด ๋ ์๋ ์๊ณ , ์ธ๋ถ API ๋ก ์ ์กํ ์๋ ์์ต๋๋ค.- ์ด๋ ๊ฐ๋ฐ์๊ฐ ItemWriter ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ์ฌ๊ธฐ์
transform()์ ๋ฐ๋ณต๋ฌธ์ ํตํดdoProcess()๋ฅผ ํธ์ถํฉ๋๋ค.- ํด๋น ๋ฉ์๋๋ ItemProcessor ์
process()๋ฅผ ์ฌ์ฉํฉ๋๋ค. doProcess()๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ๋ง์ฝ ItemProcessor ๊ฐ ์๋ค๋ฉด, ์ฆ item ์ ๊ทธ๋๋ก ๋ฐํํ๊ณ ์๋ค๋ฉด ItemProcessor ์process()๋ก ๊ฐ๊ณตํ์ฌ ๋ฐํํฉ๋๋ค.
- ํด๋น ๋ฉ์๋๋ ItemProcessor ์
- ์ด๋ ๊ฒ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ค์ SimpleChunkProcessor ์
doWrite()๋ฅผ ํธ์ถํ์ฌ ์ผ๊ด ์ฒ๋ฆฌํฉ๋๋ค.
๊ธฐ์กด์ Spring Batch ์์ ๋ง์ด ์ฌ์ฉํ๋ PagingItemReader ๊ฐ ์์ต๋๋ค.
- Chunk Size ๋ ํ๋ฒ์ ์ฒ๋ฆฌ๋ ํธ๋์ญ์ ๋จ์
- Page Size ๋ ํ๋ฒ์ ์กฐํํ Item ์ ์
PagingItemReader ์ ๋ถ๋ชจ ํด๋์ค์ธ AbstractItemCountingItemStreamItemReader ์ read() ๋ฉ์๋ ๋ด๋ถ
- ์ฝ์ด์ฌ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด
doRead()๋ฅผ ํธ์ถํฉ๋๋ค.doRead()์์๋ ํ์ฌ ์ฝ์ด์ฌ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, Page Size ๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐdoReadPage()๋ฅผ ํธ์ถํฉ๋๋ค.- ์ฝ์ด์ฌ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ๋ read ๊ฐ ์ฒ์ ์์ํ ๋๋ ๋งํฉ๋๋ค.
- Page Size ๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ๋ Page Size ๊ฐ 10์ธ๋ฐ, ์ฝ์ด์ผ ํ๋ ๋ฐ์ดํฐ๊ฐ 11๋ฒ์งธ ๋ฐ์ดํฐ์ธ ๊ฒฝ์ฐ์ ๋๋ค.
- ์ฆ, Page ๋จ์๋ก ๋์ด์ ์กฐํํ๋ ๊ฒ์ ๋๋ค.
doReadPage()๋ถํฐ๋ ํ์ ๊ตฌํ ํด๋์ค์์ ๊ฐ์๋ง์ ๋ฐฉ์์ผ๋ก ํ์ด์ง ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.- ๋ณดํธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์
JpaPagingItemReader์ ๋๋ค.
- ๋ณดํธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์
JpaPagingItemReader ์ doReadPage() ์ ์ฝ๋
- Reader ์์ ์ง์ ํ Page Size ๋งํผ
offSet, limit๊ฐ์ ์ง์ ํ์ฌ ํ์ด์ง ์ฟผ๋ฆฌ๋ฅผ ์์ฑ(createQuery())ํ๊ณ , ์ฌ์ฉ (query.getResultList())ํฉ๋๋ค. - ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๋
results์ ์ ์ฅํฉ๋๋ค. - ์ด๋ ๊ฒ ์ ์ฅ๋
results์์read()๊ฐ ํธ์ถ๋ ๋๋ง๋ค ํ๋์ฉ ๊บผ๋ด์ด ์ ๋ฌํฉ๋๋ค.
ItemReader์์ Page ์กฐํ๊ฐ 5๋ฒ ์ผ์ด๋ฌ์ ๋, 1๋ฒ์ ํธ๋์ญ์ ์ด ๋ฐ์ํ์ฌ Chunk ๊ฐ ์ฒ๋ฆฌ๋ฉ๋๋ค.- ํ ๋ฒ์ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ํด 5๋ฒ์ ์ฟผ๋ฆฌ ์กฐํ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ด์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๊ทธ๋์ Spring Batch ์ PagingItemReader ์๋
์๋นํ ํฐ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ค์ ํ๊ณ ํ์ด์ง ํฌ๊ธฐ์ ์ผ์นํ๋ ์ปค๋ฐ ๊ฐ๊ฒฉ์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.๋ผ๋ ์ฃผ์์ด ์์ฑ๋์ด ์์ต๋๋ค. - 2๊ฐ ๊ฐ์ ์ผ์น์ํค๋ ๊ฒ์ด ๋ณดํธ์ ์ผ๋ก ์ข์ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ์ผ์น์ํค๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
- ์ ๊ณผ์ ์ ํตํด Spring Batch ๊ฐ Chunk ์งํฅ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์์ผ๋ฉฐ, ์ด๋ Job ๊ณผ Step ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์์ ์์์ต๋๋ค.
- Step ์ Tasklet ๋จ์๋ก ์ฒ๋ฆฌ๋๊ณ , Tasklet ์ค์์
ChunkOrientedTasklet์ ํตํด Chunk ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ ์ด๋ฅผ ๊ตฌ์ฑํ๋ 3 ์์๋กItemReader, ItemWriter, ItemProcessor๊ฐ ์์์ ์์์ต๋๋ค.์ฆ, ItemReader, ItemWriter, ItemProcessor ์ ๋ฌถ์ ์ญ์ Tasklet ์ด๋ ์๊ธฐ์ ๋๋ค.
์ด๋ค์ ๋ฌถ์์ ChunkOrientedTasklet ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
-
ItemReader ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ๊ผญ DB ์ ๋ฐ์ดํฐ๋ง์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ ์๋๋๋ค.
-
Spring Batch ์์ ์ง์ํ์ง ์๋ Reader ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ง์ ํด๋น Reader ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
-
Spring Batch ์ Reader ์์ ์ฝ์ด์ฌ ์ ์๋ ๋ฐ์ดํฐ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ๋ ฅ ๋ฐ์ดํฐ์์ ์ฝ์ด์ค๊ธฐ
- ํ์ผ์์ ์ฝ์ด์ค๊ธฐ
- DB ์์ ์ฝ์ด์ค๊ธฐ
- JMS ๋ฑ ๋ค๋ฅธ ์์ค์์ ์ฝ์ด์ค๊ธฐ
- ๋ณธ์ธ๋ง์ ์ปค์คํ ํ Reader ๋ก ์ฝ์ด์ค๊ธฐ
-
ItemReader ์ ๊ฐ์ฅ ๋ํ์ ์ธ ๊ตฌํ์ฒด๋
JdbcPagingItemReader์ ๋๋ค- ItemReader ์ธ์ ItemStream ์ธํฐํ์ด์ค๋ ๊ฐ์ด ๊ตฌํํ๊ณ ์์ต๋๋ค.
- ItemReader ๋
read()๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ฉ์๋๋ง ๊ฐ๊ณ ์์ต๋๋ค. - **ItemStream ์ธํฐํ์ด์ค๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ํ๋ฅผ ์ ์ฅํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์ํ์์ ๋ณต์ํ๊ธฐ ์ํ Marker ์ธํฐํ์ด์ค์
๋๋ค.
์ฆ, ๋ฐฐ์น ํ๋ก์ธ์ค์ ์คํ ์ปจํ
์คํธ์ ์ฐ๊ณํด์ ItemReader ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ์คํจํ ๊ณณ์์ ๋ค์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
- ItemStream ์ 3๊ฐ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
open(), close() ๋ ์คํธ๋ฆผ์ ์ด๊ณ ๋ซ์ต๋๋ค.
update() ๋ฅผ ์ฌ์ฉํ๋ฉด Batch ์ฒ๋ฆฌ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
- ItemStream ์ 3๊ฐ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
- ๊ฐ๋ฐ์๋ ItemReader ์ ItemStream ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํํ์ฌ ์ํ๋ ํํ์ ItemReader ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
Spring Framework ์ ๊ฐ์ ์ค ํ๋๋ ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ ์ ์๋๋ก JDBC ์ ๊ฐ์ ๋ฌธ์ ์ ์ ์ถ์ํํ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ์๋น์ค ์ถ์ํ๋ผ๊ณ ํฉ๋๋ค.
๊ทธ๋์ Spring Batch ๋ Spring Framework ์ JDBC ๊ธฐ๋ฅ์ ํ์ฅํ์ต๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์น ์์ ์ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ๊ทธ๋ฌ๋ JdbcTemplate ๋ ๋ถํ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ (์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ทธ๋๋ก ๋ฐํ) ๊ฐ๋ฐ์๊ฐ ์ง์
limit, offset์ ์ฌ์ฉํ๋ ๋ฑ์ ์์ ์ด ํ์ํฉ๋๋ค. - Spring Batch ๋ ์ด๋ฐ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด 2๊ฐ์ Reader ํ์ ์ ์ง์ํฉ๋๋ค.
- Cursor ๋ ์ค์ ๋ก JDBC ResultSet ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์
๋๋ค.
- ResultSet ์ด open ๋ ๋๋ง๋ค
next()๋ฉ์๋๊ฐ ํธ์ถ๋์ด DB ์ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋ฉ๋๋ค. - ์ด๋ฅผ ํตํด ํ์์ ๋ฐ๋ผ DB ์์ ๋ฐ์ดํฐ๋ฅผ Streaming ํ ์ ์์ต๋๋ค.
- Cursor ๋ฐฉ์์ DB ์ ์ปค๋ฅ์ ์ ๋งบ์ ํ, Cursor ๋ฅผ ํ์นธ์ฉ ์ฎ๊ธฐ๋ฉด์ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- Cursor ๊ธฐ๋ฐ ItemReader ๊ตฌํ์ฒด
- JdbcCursorItemReader
- HibernateCursorItemReader
- StoredProcedureItemReader
- ResultSet ์ด open ๋ ๋๋ง๋ค
- ๋ฐ๋ฉด Paging ์ ์ข ๋ ๋ง์ ์์
์ ํ์๋ก ํฉ๋๋ค.
- Paging ๊ฐ๋ ์ ํ์ด์ง๋ผ๋ Chunk ๋ก DB ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
- ์ฆ, ํ์ด์ง ๋จ์๋ก ํ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ์์ ๋๋ค.
- Paging ๋ฐฉ์์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ Page Size ๋งํผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- Paging ๊ธฐ๋ฐ ItemReader ๊ตฌํ์ฒด
- JdbcPagingItemReader
- HibernatePagingItemReader
- JpaPagingItemReader
JPA ์๋ CursorItemReader ๊ฐ ์์ต๋๋ค.
CursorItemReader ์ฃผ์์ฌํญ
- DB ์ SocketTimeout ์ ์ถฉ๋ถํ ํฐ ๊ฐ์ผ๋ก ์ค์ ํด์ผ๋ง ํฉ๋๋ค.
- Cursor ๋ ํ๋์ Connection ์ผ๋ก Batch ๊ฐ ๋๋ ๋๊น์ง ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ Batch ๊ฐ ๋๋๊ธฐ ์ ์ DB ์ ์ดํ๋ฆฌ์ผ์ด์ ์ Connection ์ด ๋จผ์ ๋์ด์ง ์ ์์ต๋๋ค.
- ๊ทธ๋์ Batch ์ํ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ์๋ PageItemReader ๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ข์ต๋๋ค.
- Paging ์ ๊ฒฝ์ฐ ํ ํ์ด์ง๋ฅผ ์ฝ์ ๋๋ง๋ค Connection ์ ๋งบ๊ณ ๋๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ฆฌ ๋ง์ ๋ฐ์ดํฐ๋ผ๋ ํ์์์๊ณผ ๋ถํ ์์ด ์ํ๋ ์ ์์ต๋๋ค.
-
DB Cursor ๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ๊ฐ ์ฟผ๋ฆฌ๊ฐ ๊ฒฐ๊ณผ์ ์ผ๋ถ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
- ์ด๋ฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ Paging ์ด๋ผ๊ณ ํฉ๋๋ค.
-
Spring Batch ์์๋
offset, limit์ PageSize ์ ๋ง๊ฒ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.- ๋ค๋ง ๊ฐ ์ฟผ๋ฆฌ๋ ๊ฐ๋ณ์ ์ผ๋ก ์คํํ๋ค๋ ๊ฒ์ ์ ์ํด์ผ ํฉ๋๋ค.
- ๊ฐ ํ์ด์ง๋ง๋ค ์๋ก์ด ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฏ๋ก ํ์ด์ง ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ฐ์ดํฐ ๊ฒฐ๊ณผ์ ์์๊ฐ ๋ณด์ฅ๋ ์ ์๋๋ก
order by๊ฐ ๊ถ์ฅ๋ฉ๋๋ค.
-
์ฟผ๋ฆฌ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด
LIMIT 10์ด ๋ค์ด๊ฐ ๊ฒ์ ์ ์ ์์ต๋๋ค. (์์ฑํ ์ฝ๋์๋ Limit ์ ์ธ์ด ์์) -
JdbcPagingItemReader ์์ ์ ์ธ๋ fetchSize ์ ๋ง๊ฒ ์๋์ผ๋ก ์ฟผ๋ฆฌ์ ์ถ๊ฐํด์คฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
-
๋ง์ฝ ์กฐํํ ๋ฐ์ดํฐ๊ฐ 10๊ฐ ์ด์์ด๋ผ๋ฉด
offset์ผ๋ก ์ ์ ํ๊ฒ ๋ค์ fetchSize ๋งํผ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
JPA ๋ Hibernate ์ ๋ง์ ์ ์ฌ์ ์ ๊ฐ๊ณ ์์ง๋ง, ํ ๊ฐ์ง ๋ค๋ฅธ ๊ฒ์ด ์๋ค๋ฉด Hibernate ์์ Cursor ๊ฐ ์ง์๋์ง๋ง JPA ์์ Cursor ๊ธฐ๋ฐ DB ์ ๊ทผ์ ์ง์ํ์ง ์์ต๋๋ค.
PagingItemReader ์ฃผ์์ฌํญ
- ์ ๋ ฌ
order๊ฐ ๋ฌด์กฐ๊ฑด ํฌํจ๋์ด์ผ ํฉ๋๋ค. - ๋ง์ ๋ฐ์ดํฐ๋ฅผ Chunk ๋ก ๋ถํ ์กฐํํ๋ค๋ฉด, ๋ง์ฝ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 4๋ง๊ฑด์ด๊ณ Chunk Size ๊ฐ 1๋ง์ด๋ผ๊ณ ๊ฐ์ ํด๋ด
๋๋ค.
- 4๋ฒ์ ์ฟผ๋ฆฌ๊ฐ limit ์ ์์ ํฌ์ธํธ๋ง ๋ณ๊ฒฝ๋ ์ฑ ์ํ๋ฉ๋๋ค.
- ๊ฐ๊ฐ ๋ณ๋๋ก ์ํ๋๋ ์ฟผ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ ๊ธฐ์ค์ด ์ ํด์ ธ ์์ง ์๋ค๋ฉด ์ฟผ๋ฆฌ๋ง๋ค ๊ฐ์์ ์ ๋ ฌ ๊ธฐ์ค์ ๋ง๋ค์ด ์คํํ๊ฒ ๋ฉ๋๋ค.
- ์ด๊ฒ์ผ๋ก ์ธํด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํด๊ฒฐ์ฑ
- Order by
- ๊ฐ์ฅ ๋ณดํธ์ ์ธ ๋ฐฉ๋ฒ์
order by id์ ๊ฐ์ด queryString ์ ๊ณ ์ ํ ์ ๋ ฌ ๊ธฐ์ค์ ํฌํจ
- ๊ฐ์ฅ ๋ณดํธ์ ์ธ ๋ฐฉ๋ฒ์
- CursorItemReader
- JPA ์ ๊ตฌํ์ฒด๋ ์์ง๋ง, Jdbc, Hibernate, MyBatis ์๋ CursorItemReader ๋ผ๋ Reader ๊ตฌํ์ฒด๊ฐ ์กด์ฌํฉ๋๋ค.
- ResultSet ๊ณผ ์ง์ ์ฐ๋ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๊ฒ์ธ๋ฐ, ์ผ์ข ์ stream ๊ณผ ๊ฐ๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
- ์ฌ์ค์ ์ ์ฒด๋ฅผ ์กฐํํ์ฌ stream ์ฒ๋ผ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๊ธฐ์ ํ์ด์ง ์ด์๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ํ PagingItemReader ๋ณด๋ค ์ข์ต๋๋ค.
- ํ์ง๋ง, ๋ฌด์กฐ๊ฑด Cursor ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ๋ฒ์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ์ ์์ด ๋ง์ ๊ฒฝ์ฐ Batch ๊ฐ ๋ป์ ์ ์์ต๋๋ค.
- Paging ํด์ ์กฐํํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์กฐํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๊ฐ ํด ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- Thread Safe ํ์ง ์์ต๋๋ค.
- Multi Thread ๋ก Batch ๋ฅผ ๊ตฌํํด์ผ ํ๋ ์ํฉ์ด๋ผ๋ฉด PagingItemReader ๋ฅผ ์ฌ์ฉํด์ผ๋ง ํฉ๋๋ค.
- JpaRepository ๋ฅผ ListItemReader, QueueItemReader ์ ์ฌ์ฉํ๋ฉด ์๋ฉ๋๋ค.
new ListItemReader<>(jpaRepository.findByAge(age))๋ก Reader ๋ก ๊ตฌํํ ๊ฒฝ์ฐ- Spring Batch ์ ์ฅ์ ์ธ Paging & Cursor ๊ตฌํ์ด ์์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋ฌผ๋ก Chunk ๋จ์ ํธ๋์ญ์ ์ ๊ฐ๋ฅํฉ๋๋ค.
- Spring Batch ์ ์ฅ์ ์ธ Paging & Cursor ๊ตฌํ์ด ์์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- ๋ง์ฝ JpaRepository ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, RepositoryItemReader ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
- Paging ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
- Hibernate, JPA ๋ฑ ์์์ฑ ์ปจํ ์คํธ๊ฐ ํ์ํ Reader ์ฌ์ฉ์ fetchSize ์ chunkSize ๋ ๊ฐ์ ๊ฐ์ ์ ์งํด์ผ ํฉ๋๋ค.
- Writer ๋ Reader, Processor ์ ํจ๊ป ChunkOrientedTasklet ์ ๊ตฌ์ฑํ๋ 3 ์์์ ๋๋ค.
- Reader ์ Writer ๋ ChunkOrientedTasklet ์์ ํ์ ์์์ด๊ณ , Processor ๋ ์ ํ์ ๋๋ค.
- ItemWriter ๋ Spring Batch ์์ ์ฌ์ฉํ๋ ์ถ๋ ฅ ๊ธฐ๋ฅ์ ๋๋ค.
- Spring Batch ๊ฐ ์ฒ์ ๋์์ ๋, ItemWriter ๋ ItemReader ์ ๋ง์ฐฌ๊ฐ์ง๋ก item ์ ํ๋์ฉ ๋ค๋ค์ต๋๋ค.
- Spring Batch 2 ์ Chunk ๊ธฐ๋ฐ ์ฒ๋ฆฌ์ ๋์ ์ผ๋ก ์ธํด ItemWriter ์๋ ํฐ ๋ณํ๊ฐ ์๊ฒผ์ต๋๋ค.
- ์ด ์
๋ฐ์ดํธ ์ดํ ItemWriter ๋ item ํ๋๋ฅผ ์์ฑํ์ง ์๊ณ Chunk ๋จ์๋ก ๋ฌถ์ธ item List ๋ฅผ ๋ค๋ฃน๋๋ค.
- ItemReader ๋ฅผ ํตํด ๊ฐ ํญ๋ชฉ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฝ๊ณ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ItemProcessor ์ ์ ๋ฌํฉ๋๋ค.
- ์ด ํ๋ก์ธ์ค๋ Chunk ์ Item ๊ฐ์๋งํผ ์ฒ๋ฆฌ๋ ๋๊น์ง ๊ณ์๋ฉ๋๋ค.
- Chunk ๋จ์๋งํผ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด Writer ์ ์ ๋ฌ๋์ด Writer ์ ๋ช ์๋์ด ์๋๋๋ก ์ผ๊ด ์ฒ๋ฆฌํฉ๋๋ค.
- ์ฆ, Reader ์ Processor ๋ฅผ ๊ฑฐ์ณ ์ฒ๋ฆฌ๋ Item ์ Chunk ๋จ์๋งํผ ์์ ๋ค ์ด๋ฅผ Writer ์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
- Spring Batch ๋ ๋ค์ํ Output ํ์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ง์ Writer ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Java ์ธ๊ณ์์๋ JDBC ๋๋ ORM ์ ์ฌ์ฉํด RDBMS ์ ์ ๊ทผํฉ๋๋ค.
- Spring Batch ๋ JDBC ์ ORM ๋ชจ๋ Writer ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Writer ๋ Chunk ๋จ์์ ๋ง์ง๋ง ๋จ๊ณ์ ๋๋ค.
- ๊ทธ๋์ DB ์ ์์์ฑ๊ณผ ๊ด๋ จํด์ ํญ์ ๋ง์ง๋ง์ Flush๋ฅผ ํด์ค์ผ๋ง ํฉ๋๋ค.
์๋์ ๊ฐ์ด ์์์ฑ์ ์ฌ์ฉํ๋ JPA, Hibernate ์ ๊ฒฝ์ฐ ItemWriter ๊ตฌํ์ฒด์์๋ flush() ์ session.clear() ๊ฐ ๋ฐ๋ผ์ต๋๋ค.
JpaItemWriter
@Override
public void write(List<? extends T> items) {
EntityManager entityManager = EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory);
if (entityManager == null) {
throw new DataAccessResourceFailureException("Unable to obtain a transactional EntityManager");
}
doWrite(entityManager, items);
entityManager.flush();
}HibernateItemWriter
@Override
public void write(List<? extends T> items) {
doWrite(sessionFactory, items);
sessionFactory.getCurrentSession().flush();
if (clearSession) {
sessionFactory.getCurrentSession().clear();
}
}Writer ๊ฐ ๋ฐ์ ๋ชจ๋ Item ์ด ์ฒ๋ฆฌ๋ ํ, Spring Batch ๋ ํ์ฌ ํธ๋์ญ์
์ ์ปค๋ฐํฉ๋๋ค.
DB ์ ๊ด๋ จ๋ Writer ๋ ์๋์ ๊ฐ์ด 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
- JdbcBatchItemWriter
- HibernateItemWriter
- JpaItemWriter
-
ORM ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ๋๋ถ๋ถ JdbcBatchItemWriter ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
JDBC ์ Batch ๊ธฐ๋ฅ์ ์ฌ์ฉํด ํ๋ฒ์ DB ๋ก ์ ๋ฌํ์ฌ DB ๋ด๋ถ์์ ์ฟผ๋ฆฌ๋ค์ด ์คํ๋๋๋ก ํฉ๋๋ค.
-
์ด๋ ๊ฒ ์ฒ๋ฆฌํ๋ ์ด์ ๋ ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ DB ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํ์๋ฅผ ์ต์ํํ์ฌ ์ฑ๋ฅ ํฅ์์ ๊พํ๊ธฐ ์ํจ์ ๋๋ค.
- ์ ๋ฐ์ดํธ๋ฅผ ์ผ๊ด ์ฒ๋ฆฌ๋ก ๊ทธ๋ฃนํํ๋ฉด DB ์ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ ์๋ณต ํ์๊ฐ ์ค์ด ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
์ถ๊ฐ๋ก ์์๋ฌ์ผํ ๋ฉ์๋ afterPropertiesSet
- ์ด ๋ฉ์๋๋
InitializingBean์ธํฐํ์ด์ค์์ ๊ฐ๊ณ ์๋ ๋ฉ์๋์ ๋๋ค. - JdbcBatchItemWriter, JpaItemWriter ๋ฑ ItemWriter ์ ๊ตฌํ์ฒด๋ค์ ๋ชจ๋
InitializingBean์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค. - ์ฌ๊ธฐ์
afterPropertiesSet๊ฐ ํ๋ ์ผ์ ๊ฐ๊ฐ์ Writer ๋ค์ด ์คํ๋๊ธฐ ์ํด ํ์ํ ํ์๊ฐ๋ค์ด ์ ๋๋ก ์ธํ ๋์ด์๋์ง๋ฅผ ์ฒดํฌํฉ๋๋ค. - Writer ๋ฅผ ์์ฑํ๊ณ ์ ๋ฉ์๋๋ฅผ ๊ทธ ์๋์์ ๋ฐ๋ก ์คํํด๋ณด๋ฉด ์ด๋ ๊ฐ์ด ๋๋ฝ๋์๋์ง ๋ช ํํ๊ฒ ์ ์ ์์ต๋๋ค.
-
์ด๋ฒ์ ์์๋ณผ Writer ๋ ORM ์ ์ฌ์ฉํ ์ ์๋
JpaItemWriter์ ๋๋ค.
Reader ์ ๋ฌ๋ฆฌ Writer ์ ๊ฒฝ์ฐ Custom ํ๊ฒ ๊ตฌํํด์ผ ํ ์ผ์ด ๋ง์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
- Reader ์์ ์ฝ์ด์จ ๋ฐ์ดํฐ๋ฅผ RestTemplate ์ผ๋ก ์ธ๋ถ API ๋ก ์ ๋ฌํด์ผ ํ ๊ฒฝ์ฐ
- ์์ ์ ์ฅ์ ํ๊ณ ๋น๊ตํ๊ธฐ ์ํด ์ฑ๊ธํค ๊ฐ์ฒด์ ๊ฐ์ ๋ฃ์ด์ผ ํ ๊ฒฝ์ฐ
- ์ฌ๋ฌ Entity ๋ฅผ ๋์์ save ํด์ผ ํ ๊ฒฝ์ฐ
์ด๋ ๊ฒ Spring Batch ์์ ๊ณต์์ ์ผ๋ก ์ง์ํ์ง ์๋ Writer ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋๋ ItemWriter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํฉ๋๋ค.