์Šคํ”„๋ง ๋ฐฐ์น˜(Spring Batch) ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ

SHORTCUT

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

    ์Šคํ”„๋ง ๋ฐฐ์น˜

    • ๋ฐฐ์น˜๋ž€? ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๋Œ€๋กœ ๊ฐ€๊ณตํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž๋™ํ™”๋œ ํ”„๋กœ์„ธ์Šค
    • ๋ฐฐ์น˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ->์ฒ˜๋ฆฌ->์“ฐ๊ธฐ์˜ 3๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
    • ๋ฐฐ์น˜(batch) = ์ผ๊ด„ ์ฒ˜๋ฆฌ = ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ
    • ๋ฐฐ์น˜ ์„œ๋น„์Šค๋Š” ๋‹ค์Œ์˜ ํŠน์ง•์ด ์กด์žฌํ•จ
      • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ : ๋ฐฐ์น˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ๊ณ„์‚ฐ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
      • ์ž๋™ํ™” : ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ž… ์—†์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•จ
      • ๊ฒฌ๊ณ ์„ฑ, ์‹ ๋ขฐ์„ฑ, ์„ฑ๋Šฅ ... ๋งํฌ

    JOB

    • job์€ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋งŒ๋“ค์–ด ํ‘œํ˜„ํ•œ ๊ฒƒ
    • ์ตœ์ƒ๋‹จ ๊ณ„์ธต์— ์กด์žฌํ•จ
    • ํ•˜๋‚˜์˜ Job์•ˆ์—๋Š” ์—ฌ๋Ÿฌ Step(๋‹จ๊ณ„)๊ฐ€ ์žˆ์Œ
    • ์ฆ‰, ์—ฌ๋Ÿฌ Step์„ ํฌํ•จํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ
    • Job ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋นŒ๋”๋Š” ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ์œผ๋‚˜, ์—ฌ๊ธฐ์„  JobBuilderFactory๋ฅผ ์‚ฌ์šฉํ•จ
    @Bean(name = JOB_ID)
    public Job nameJob(
            @Qualifier(JOB_ID + ".step1") Step step1
    ){
     ย  ย return jobBuilderFactory.get(JOB_ID)
     ย  ย  ย       .start(step1)
     ย  ย  ย       .build();
    }

    JobBuilderFactory๋ฅผ ํ†ตํ•ด Job ์ƒ์„ฑ์„ ํ•œ ๋’ค, Step์„ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค.

    Step

    @Bean(name = JOB_ID)
    public Step nameStep1(){
     ย  ย return stepBuilderFactory.get(JOB_ID + ".step1")
     ย  ย  ย   .allowStartIfComplete(true)
     ย  ย  ย   .tasklet(์‹คํ–‰ํ•˜๋ ค๋Š”SQL๋ฉ”์†Œ๋“œ)
     ย  ย  ย   .build();
    }
    • stepBuilderFactory๋ฅผ ํ†ตํ•ด ์Šคํ…์„ ์ƒ์„ฑํ•จ
    • ๋ฐฐ์น˜์—์„œ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹จ์œ„๋กœ, ์Šคํ…์€ ์žก์„ ๊ตฌ์„ฑํ•˜๋Š” ๋…๋ฆฝ๋œ ์ž‘์—… ๋‹จ์œ„์ž„
    • ์Šคํ…์—๋Š” Tasklet, Chunk ๊ธฐ๋ฐ˜์œผ๋กœ ๋‘๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•จ

    Tasklet

    • ์Šคํ…์ด ์ค‘์ง€๋  ๋•Œ๊นŒ์ง€ execute๋ฅผ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•จ
    • ์ดˆ๊ธฐํ™”, ์ €์žฅ ํ”„๋กœ์‹œ์ € ์‹คํ–‰, ์•Œ๋ฆผ ์ „์†ก๊ณผ ๊ฐ™์€ ์žก์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋จ
    • Job์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ Step์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ณ , Step์€ Tasklet(๊ธฐ๋Šฅ)์œผ๋กœ ๊ตฌ์„ฑ๋จ
    • ๋ฐฐ์น˜ ์ž‘์—… ํ•˜๋‚˜ = Job
    @Bean(name = JOB_ID + ".NaverTotalEpEqlInfTasklet")
    public Tasklet naverTotalEpEqlInfTasklet(){
     ย  ย return new NaverTotalEpEqlInfTasklet();
    }

    Chunk

    • ์•„์ดํ…œ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋œ๋‹ค.

    ์ฐธ๊ณ 

    ์ƒ๊ฐ ์ •๋ฆฌ

    • ๋ฐฐ์น˜๋ž€ ํ•œ ๋งˆ๋””๋กœ, ํŠน์ • ์ฃผ๊ธฐ๋กœ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž…๋‹ˆ๋‹ค!
    • ์–ธ์ œ ์‚ฌ์šฉ ๋ ๊นŒ์š”?
      • ํšŒ์› ํƒˆํ‡ด ์‹œ, ํŠน์ • ๋ฐ์ดํ„ฐ(์ฃผ๋ฌธ ๋‚ด์—ญ ๋“ฑ)๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ๋งŒ์•ฝ A ํšŒ์›์—๊ฒŒ 1๋งŒ๊ฑด์˜ ์ฃผ๋ฌธ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฒ ์ง€์š”. ๊ทธ๋ฆฌ๊ณ  ์ด์™€ ๊ฐ™์€ ํšŒ์› 100๋ช…์ด ๋ชจ๋‘ ํ•ฉ์‹ฌํ•˜์—ฌ, ์œ ์ €๋“ค์˜ ์ ‘์†์ด ํ™œ๋ฐœํ•œ ์ €๋… 7์‹œ์— ํƒˆํ‡ด๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด? ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์„œ๋น„์Šค์— ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋˜๊ฒ ์ง€์š”.
      • ์ด๋Ÿฐ ์ƒํ™ฉ์—์„  ํƒˆํ‡ดํ•œ ์œ ์ €์—๊ฒ ํƒˆํ‡ด์— ๋Œ€ํ•œ ์ƒํƒœ๊ฐ’ ํ˜น์€ ํƒˆํ‡ด ์ผ์‹œ๋งŒ ์ง€์ •์„ ํ•ด์ฃผ์–ด ๋ชจ๋“  ๋กœ์ง์—์„œ ์ œ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ผœ๋ฒ„๋ฆฌ๊ณ . ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์œ ์ €๋“ค์˜ ์ ‘์†๋Ÿ‰์ด ์ ์€ ์ƒˆ๋ฒฝ ์‹œ๊ฐ„๋Œ€๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ผ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆฐ๋‹ค๋ฉด, ์„œ๋น„์Šค์ ์œผ๋กœ ๋”์šฑ ์•ˆ์ •์ ์œผ๋กœ ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
      • ์ฆ‰, ์œ ์ €์˜ ์œ ์ž…์ด ์ ์€ ์ƒˆ๋ฒฝ 2์‹œ(ํŠน์ • ์‹œ๊ฐ„)์— ํƒˆํ‡ด ์œ ์ €์˜ ์ฃผ๋ฌธ๋‚ด์—ญ ์‚ญ์ œ(ํŠน์ • ํ–‰๋™)๋ฅผ ๋งค์ผ(ํŠน์ • ์ฃผ๊ธฐ๋ณ„๋กœ) ์‹คํ–‰ํ•ด๋ผ. ์™€ ๊ฐ™์ด ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์น˜๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
      ์‹ค์ œ๋กœ ์œ ์ € ํƒˆํ‡ด์‹œ ๊ณง๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋“ค์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค ๐Ÿ˜…
    • ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐฐ์น˜๋Š” ์‹ค๋ฌด์—์„œ ๋งŽ์€ ๊ฒƒ๋“ค ํŽธํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
      • ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด? โ†’ ๋ฐฐ์น˜๋กœ ์‹คํŒจํ•œ ๊ฒฐ๊ณผ๋“ค์— ๋Œ€ํ•ด์„œ ์žฌ์‹คํ–‰์„ ์‹ค์‹œํ•˜์—ฌ ์ปค๋ฒ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ๋ฐฐ์น˜๋Š” ์‹คํŒจ ๋กœ๊ทธ๋ฅผ ์Œ“์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

    ๐Ÿ’ฌ
    ๋‹ด๋‹น ์—…๋ฌด์ƒ ๋ฐฐ์น˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŽ์ด ๋‹ค๋ฃจ์ง„ ์•Š์ง€๋งŒ, ์กฐ๊ธˆ ๋” ๊ณต์ˆ˜๊ฐ€ ํฐ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐฐ์น˜๋ฅผ ์ง์ ‘ ์งœ๋ณผ ๊ธฐํšŒ๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์žฌ๋ฐŒ์„ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿ˜

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

    Designed by JB FACTORY