๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring/SpirngBatch

Spring Batch (2)

๐Ÿค” Step์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ 

1. Tasklet ๋ฐฉ์‹  :

์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์ด๊ธด ํ•ฉ๋‹ˆ๋‹ค.

Input/Output์— ๋Œ€ํ•œ process๊ฐ€ ์—†๋Š” ๋‹จ์ˆœ ํ†ต๊ณ„, ์ผ๋ฐ˜์ ์ธ Query ์ˆ˜ํ–‰๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ Batch์— ์‚ฌ์šฉํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค.

Chunk์˜  ItemReader, ItemProcessor, ItemWirter์˜ ๊ณผ์ •์„ ๋‹จ์ผ ์ž‘์—…์œผ๋กœ ์ธ์‹ํ•˜์—ฌ Step์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

2. Chunk ๋ฐฉ์‹ :

์ง€์ •ํ•œ Chunksize์— ๋งž๊ฒŒ ItemReader, ItemProcessor, ItemWirter๋กœ ๋‚˜๋ˆ  Step์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด, Spring Batch์—์„œ๋Š” Job์ด ์žˆ๋Š”๋ฐ์š”.

์ด Job์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ Step์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ณ ,

Step ์€ Tasklet || Chunk๋กœ ๊ตฌ์„ฑ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿค” Chunk

Chunk๋ž€ ์ฒ˜๋ฆฌ๋˜๋Š” row(data)์˜ ๊ฐฏ์ˆ˜๋ฅผ ์–˜๊ธฐํ•ฉ๋‹ˆ๋‹ค .

ChunkSize = 5 ๋ผ๋ฉด, 5๊ฐœ์˜ data๊ฐ€ ํ•˜๋‚˜์”ฉ ์ฝํ˜€์ง€๊ณ  ํ•˜๋‚˜์˜ Chunk๋ฅผ ์ด๋ฃจ์–ด ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ ! 

 

๐Ÿ˜ณ Chunk๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š” ?

์—ฌ๋Ÿฌ๋ถ„์ด 10000๊ฐœ์˜ data์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋งค์ผ ๋งค์ผ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์—…๋ฌด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ์‹œ๊ฐ„๊ณผ ์ž์› ๋ชจ๋‘ ์•„๋‚„ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

 

๐Ÿ˜ณ Chunk๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋‚˜์š”?

๋งŒ์•ฝ ChunkSize๊ฐ€ 5 ๋ผ๊ณ  ์ƒ๊ฐํ•  ๋•Œ, IteamReader, ItemProcessor์—์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ์ˆœ์„œ๋Œ€๋กœ 5๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ItemWriter์—์„œ 5๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 ItemReader์˜ read() ๋ฉ”์†Œ๋“œ๋Š” Item ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ˜๋ฉด, ItemWriter์˜ write()๋Š” ์ธ์ž๋กœ Item List๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด,

Reader์™€ Processor์—์„œ๋Š” 1๊ฑด์”ฉ ๋‹ค๋ค„์ง€๊ณ ,

Writer์—์„  Chunk ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

 

for(int i=0; i<totalSize; i+=chunkSize){ 
    List items = new Arraylist();
    for(int j = 0; j < chunkSize; j++){
        Object item = itemReader.read()
        Object processedItem = itemProcessor.process(item);
        items.add(processedItem);
    }
    itemWriter.write(items);
}

์กฐ์กธ๋‘๋‹˜์˜ ๋ธ”๋กœ๊ทธ(jojoldu.tistory.com/331)์— ์ž‘์„ฑ๋œ Java๋ฅผ ์ด์šฉํ•ด ์ฒญํฌ์ง€ํ–ฅ ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋ณด์—ฌ์ค€ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

 


๐Ÿค” Page Size์™€ Chunk Size ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฐ€์š”?

Page Size : ํ•œ ๋ฒˆ์— ์กฐํšŒํ•  data์˜ ์–‘

Chunk Size : ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•  data์˜ ์–‘

 

๋งŒ์•ฝ, PageSize = 10 ์ด๊ณ , Chunk Size = 50 ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค!

์ด ๋ง์€ IteamReader์—์„œ ์กฐํšŒ๊ฐ€ 5๋ฒˆ ์ด๋ฃจ์–ด์ ธ์•ผ 1๋ฒˆ์˜ Transaction์ด ๋ฐœ์ƒํ•ด Chunk๊ฐ€ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ๋ง์ž…๋‹ˆ๋‹ค.

 

์ด ๋‘ ๊ฐ€์ง€๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์ง€๋งŒ, 2๊ฐœ ๊ฐ’์„ ์ผ์น˜์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์ด๋ฉฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

<์ผ์น˜ํ•˜์ง€ ์•Š์Œ์œผ๋กœ ์ธํ•ด ๋ฒŒ์–ด์ง€๋Š” ์ด์Šˆ>

 

Spring Batch์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋ฌธ์ œ (processor์—์„œ lazyException ๋ฐœ์ƒํ• ๋•Œ)

์•ˆ๋…•ํ•˜์„ธ์š”? ์ด๋ฒˆ ์‹œ๊ฐ„์—” springboot-batch์—์„œ reader๋กœ ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ processor๋กœ ๋„˜๊ธธ๋•Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ๋Š” Github์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ๊ป˜ ๋ณด์‹œ๋ฉด

jojoldu.tistory.com

 

 

'Spring > SpirngBatch' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Batch (4) - MetaData  (0) 2021.05.30
Spring Batch (3)  (0) 2021.05.06
SpringBatch  (0) 2021.03.24