Skip to content

Latest commit

ย 

History

History
432 lines (290 loc) ยท 19.3 KB

File metadata and controls

432 lines (290 loc) ยท 19.3 KB

๋ชฉ์ฐจ



๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€๋ถ€ํ„ฐ๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ ์Šคํ”„๋ง ๋ฐฐ์น˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณธ๋‹ค.

๋งŽ์€ ์Šคํ”„๋ง ๋ฐฐ์น˜ ๊ด€๋ จ ๊ธ€์—์„  ์ฃผ๋กœ ๋ฐฐ์น˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด์„œ ๋ฐ”๋กœ ์„ค๋ช…ํ•œ๋‹ค.

ํ•„์ž์˜ ๊ฒฝ์šฐ๋Š” ์ฒ˜์Œ์— ์ด๋ถ€๋ถ„์ด ์กฐ๊ธˆ ๋‹นํ˜น์Šค๋Ÿฌ์› ๋‹ค...

์ด๋ฒˆ ๊ธ€์€ ๋ฐฐ์น˜์˜ ๋„๋ฉ”์ธ์— ๊ด€ํ•ด์„œ ๊นŠ๊ฒŒ ๋‹ค๋ฃจ์ง„ ์•Š๊ณ , ์šฐ์„  Hello World ์ˆ˜์ค€์˜ Job์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ํ•ด๋ณธ๋‹ค.

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


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

๊ฐ„๋‹จํžˆ ์Šคํ”„๋ง ๋ฐฐ์น˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Hello World ์ˆ˜์ค€์˜ Job์„ ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰ํ•ด๋ณธ๋‹ค.


1-1 ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ์˜์กด์„ฑ

์•„๋ž˜์™€ ๊ฐ™์ด Spring Initializer๋ฅผ ํ†ตํ•ด Spring Boot ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

์˜์กด์„ฑ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ค€๋‹ค.

์ด 4๊ฐœ์˜ ์˜์กด์„ฑ์„ ๋„ฃ์–ด์ค€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • Spring Batch
    • Spring Boot ๊ธฐ๋ฐ˜์˜ Spring Batch๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ์˜์กด์„ฑ.
  • H2, MySQL
    • Profile์— ๋”ฐ๋ผ ๋ฐฐ์น˜ ๋„๋ฉ”์ธ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ DB ๊ด€๋ จ ์˜์กด์„ฑ.
  • Lombok

์œ„ 4๊ฐ€์ง€์˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์œ„ 4๊ฐ€์ง€ ์˜์กด์„ฑ์„ ์„ค์ •ํ•ด์ค˜๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.


1-2 Hello World Job ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰

ํ”„๋กœ์ ํŠธ๊ฐ€ ์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋ฉด, ์ด๋ฒˆ์—” Hello World ์ˆ˜์ค€์˜ Job์„ ๊ตฌ์„ฑํ•ด๋ณธ๋‹ค.

HelloWorldJobConfiguration.java

@RequiredArgsConstructor
@Configuration
public class HelloWorldJobConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job helloWorldJob() {
        return jobBuilderFactory.get("helloWorldJob")
                .start(helloWorldStep1())
                .next(helloWorldStep2())
                .build();
    }

    @Bean
    public Step helloWorldStep1() {
        return stepBuilderFactory.get("helloWorldStep1")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println(" >>> helloWorldStep1 ์‹คํ–‰๋จ.");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }

    @Bean
    public Step helloWorldStep2() {
        return stepBuilderFactory.get("helloWorldStep2")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println(" >>> helloWorldStep2 ์‹คํ–‰๋จ.");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}

๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™์ž‘์‹œํ‚ค๊ธฐ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์— @EnableBatchProcessing๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

SpringBatchTestApplication.java

@SpringBootApplication
@EnableBatchProcessing
public class SpringBatchTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBatchTestApplication.class, args);
    }

}

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ํ‰์†Œ Spring Boot ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋“ฏ์ด ์‹คํ–‰์„ ํ•ด์ฃผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ์น˜๊ฐ€ ๋™์ž‘ํ•˜์—ฌ ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

@EnableBatchProcessing์€ ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฉ”์ธ ํด๋ž˜์Šค๋‚˜ ์•„๋ฌด ์„ค์ • ํŒŒ์ผ์ค‘ ํ•˜๋‚˜์— ๋ช…์‹œํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. (๋Œ€๋ถ€๋ถ„ ๋ถ€ํŠธ ๋ฉ”์ธ ํด๋ž˜์Šค์— ์ •์˜ํ•œ๋‹ค.)


์–ด๋–ค๊ฐ€! ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€๊ฐ€?? ๋ฐฐ์น˜๋ฅผ ๋™์ž‘ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ž๋ฐ” ๋นˆ ๋ช‡๊ฐ€์ง€๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์›ํ•˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐฐ์น˜๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.


2 ๋ฐฐ์น˜ ๊ตฌ์กฐ

์ด๋ฒˆ์—” Hello World๋ฅผ ๋ฒ—์–ด๋‚˜์„œ ๋ฐฐ์น˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  Hello World ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•ด๋ณธ๋‹ค.


2-1 Job, Step, Tasklet

Hello World Job ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ˆˆ์— ๋„๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ Job, Step, Tasklet์ด๋‹ค.

์„ธ ๋„๋ฉ”์ธ์˜ ๊ด€๊ณ„๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.


Job, Step, Tasklet์˜ ๊ด€๊ณ„

  • Job - ์ผ, ์ผ๊ฐ (์ „์ฒด์ ์ธ ์ผ)
    • ๋ฐฐ์น˜ ๊ตฌ์กฐ์—์„œ Job์ด๋ž€ ๊ฐ€์žฅ ์ƒ์œ„์— ์žˆ๋Š” ๊ฐœ๋…์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฐฐ์น˜์ž‘์—… ์ž์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • ํ•˜๋‚˜์˜ Job์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Step์ด ์กด์žฌํ•œ๋‹ค. (์ ์–ด๋„ ํ•˜๋‚˜ ์ด์ƒ)
  • Step - ์ผ์˜ ๋‹จ์œ„, ์ผ์˜ ํ•ญ๋ชฉ (๋‹จ๊ณ„)
    • ๋ฐฐ์น˜ Job์„ ๊ตฌ์„ฑํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ํ•˜๋‚˜์˜ ๋‹จ๊ณ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์‹ค์ œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ •์˜ํ•˜๊ณ  ์ปจํŠธ๋กคํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง„๋‹ค.
    • Step์€ Tasklet ํ˜น์€ Reader + Processor + Writer(Chunk ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
      • ๊ฐ™์€ Step ์•ˆ์—์„œ ๋‘ ๋ฐฉ์‹์„ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • Tasklet ์ผ์˜ ์ž‘์—… ๋‚ด์šฉ (๊ตฌํ˜„, ๋‹จ๊ณ„ ๋ณ„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)
    • Step์•ˆ์—์„œ ๋‹จ์ผ ํƒœ์Šคํฌ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    • tasklet์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌดํ•œ ๋ฐ˜๋ณต์‹œํ‚จ๋‹ค. RepeatStatus ๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณตํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค˜์•ผํ•œ๋‹ค.

Chunk๊ธฐ๋ฐ˜์˜ ์ฒ˜๋ฆฌ ์š”์†Œ์ธ ItemReader, ItemProcessor, ItemWriter๋Š” ์šฐ์„  ๋ฌด์‹œํ•ด๋„ ๋œ๋‹ค.


2-2 ๋‹ค์‹œ ์‚ดํŽด๋ณด๋Š” Hello World Job

๊ทธ๋ฆผ์„ ํ†ตํ•ด Job๊ณผ Step๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์•Œ์•˜์œผ๋‹ˆ, ์ด์ œ ๋ฐ”๋กœ ์œ„์—์„œ ๊ตฌ์„ฑํ–ˆ๋˜ HelloWorldJob์˜ ์„ค์ • ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๋ฉด ๊ตฌ์กฐ๊ฐ€ ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ๋œ๋‹ค.

  • @Configuration
    • ๋ณดํ†ต ํ•˜๋‚˜์˜ ๋ฐฐ์น˜ Job์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋นˆ ์„ค์ •
  • JobBuilderFactory, StepBuilderFactory
    • Job๊ณผ Step ๋ชจ๋‘ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ์ด์™€ ๊ด€๋ จ๋œ ๋นŒ๋” ๋˜ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€์žˆ๋‹ค.
    • ์œ„ ๋‘ ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด๋Š” ์–ด๋–ค ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์„ ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ์„œ ๊ฐ๊ฐ ๊ตฌํ˜„์ฒด์˜ ๋นŒ๋”๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•ด์ค€๋‹ค.
      • ex. Step์˜ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์œผ๋กœ chunk๋ฅผ ์ฃผ๋ฉด SimpleStepBuilder๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , tasklet์„ ์ฃผ๋ฉด TaskletStepBuilder๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    • ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด, Job์™€ Step์„ ์ƒ์„ฑํ•˜๋Š” ๋นŒ๋” ํŒฉํ† ๋ฆฌ๋ผ๊ณ ๋ณด๋ฉด ๋œ๋‹ค. (์ด์™€ ๊ด€๋ จ๋œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„์— ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.)
  • Job
    • Job์„ ์ •์˜ํ•œ๋‹ค.
  • Step
    • Step์„ ์ •์˜ํ•œ๋‹ค.
  • Tasklet
    • ๊ฐ Step์ด ์‹คํ–‰๋˜์—ˆ๋‹ค๋Š” ์ฝ˜์†” ์ถœ๋ ฅ์— ๋Œ€ํ•œ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

2-3 ๋ฐฐ์น˜ ์‹คํ–‰ FLOW

์ด์ œ Hello World ์ฝ”๋“œ์™€ ์œ„ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ๋ฐฐ์น˜ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํฐ๊ทธ๋ฆผ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๊ฐ ์š”์†Œ๊ฐ„์˜ ์‹คํ–‰ FLOW๋Š” ์–ด๋–ป๊ฒŒ๋˜๋Š”์ง€๋ฅผ ๋ณด๋ฉด๋œ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ Job, Step, Tasklet ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋”์šฑ ์ž˜ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฐ์น˜ ์‹คํ–‰ FLOW ์ด๋‹ค.


ํ™”์‚ดํ‘œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉํ–ฅ์ด๊ธฐ๋„ ํ•˜๊ณ , ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉํ–ฅ๋„ ๋œ๋‹ค.

  • ์‹คํ–‰ ์ˆœ์„œ
    • Job -> Step -> Tasklet
  • ์Šคํ”„๋ง ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์œ„์™€ ๊ฐ™์ด ํ•„์š”ํ•œ Job, Step, Tasklet์— ๋Œ€ํ•œ ๋นˆ์ด ๋“ฑ๋ก๋˜๊ณ , ์œ„ ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.
  • Job์€ Step์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์ด์ œ ์ฒ˜์Œ์— ๊ตฌ์„ฑํ–ˆ๋˜ Hello World Job์ด ์ดํ•ด๊ฐ€ ์‰ฝ๊ฒŒ ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐ๋“ ๋‹ค.


3 ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ• (feat. @EnableBatchProcessing)

์ด์ œ ๋ฐฐ์น˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์•˜์œผ๋‹ˆ Job, Step, Tasklet์˜ ๊ด€๊ณ„์™€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๊ณ  ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ @EnableBatchProcessing ์• ๋…ธํ…Œ์ด์…˜๋งŒ ๋ถ™์ด๊ณ  ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์„๊นŒ?

๋งŒ์•ฝ ํ•œ ํ”„๋กœ์ ํŠธ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐฐ์น˜ Job์„ ๊ตฌ์„ฑํ•˜๊ณ  ํŠน์ • Job๋งŒ ์‹คํ–‰์‹œํ‚ค๊ณ ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„  ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ , @EnableBatchProcessing๋ฅผ ๋ถ™์ด๋ฉด ์–ด๋–ค ํšจ๊ณผ๊ฐ€์žˆ๋Š”์ง€ ์•Œ์•„๋ณธ๋‹ค.


3-1 ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฐ์ฒด - JobLauncher

์œ„์—์„  Job, Step, Tasklet์— ๋Œ€ํ•ด์„œ๋งŒ ์–˜๊ธฐํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค ์กฐ๊ธˆ ๋” ํฐ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋ฐฐ์น˜์˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.


๊ณต์‹ ๋ฌธ์„œ์˜ ๊ทธ๋ฆผ์„ ์กฐ๊ธˆ ์ˆ˜์ •ํ•œ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์™ผ์ชฝ์„ ๋ณด๋ฉด JobLauncher๋ผ๋Š” ๋„๋ฉ”์ธ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์ด ๋„๋ฉ”์ธ์€ ๋ฐฐ์น˜ Job์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.


JobLauncherCommandLineRunner.execute ๊ตฌํ˜„๋ถ€๋ถ„

์œ„ ์ฝ”๋“œ๋Š” ์‹ค์ œ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ธฐ๋ฐ˜์˜ Spring Batch์—์„œ Job์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

JobLauncher ๊ฐ์ฒด์— Job๊ณผ JobParameters๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ run๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฐ์น˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์šฐ์„ ์€ JobLauncher๋ฅผ Job์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฐ์ฒด๋กœ๋งŒ ์ดํ•ดํ•˜์ž. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ›„์— ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค.


3-2 ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•

์•ž์—์„œ JobLauncher๊ฐ€ ๋ฐฐ์น˜ Job์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์ฃผ์ฒด๋ผ๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ–ˆ๋‹ค.

์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€๊ฐ€? ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๋ฐฐ์น˜ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„  ๋Œ€ํ‘œ์ ์ธ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.


1๏ธโƒฃ ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ• - ApplicationRunner ๊ตฌํ˜„ํ•˜์—ฌ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

์Šคํ”„๋ง ๋ถ€ํŠธ (@SpringBootApplication)๋Š” ์‹คํ–‰์‹œ ApplicationRunner๋ฅผ ๊ตฌํ˜„ํ•œ ๋นˆ์˜ run() ๋ถ€๋ถ„์„ ํ˜ธ์ถœํ•œ๋‹ค.

๋งŒ์•ฝ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ApplicationRunner๊ฐ€ ์กด์žฌํ•ด์„œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์•ผํ•œ๋‹ค๋ฉด @Order ์• ๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ์ˆœ์„œ๋ฅผ ์ •ํ•ด์ค€๋‹ค.

์Šคํ”„๋ง ๋ฐฐ์น˜์—์„œ Job์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์ฃผ์ฒด์ธ JobLauncher๋„ ์ด ApplicationRunner ํ˜น์€ CommandLineRunner๋ฅผ ๊ตฌํ˜„ํ•œ ๋นˆ์„ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๊ณ  ์ž๋™์œผ๋กœ Job์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


ManualJobLauncher.java

/**
 * ์ˆ˜๋™์œผ๋กœ JobLauncher๋ฅผ ํ†ตํ•ด ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ApplicationRunner
 * -> ์„ค์ •ํŒŒ์ผ (yml)์—์„œ spring.batch.job.enabled = false๋กœ ํ•ด์ค˜์•ผํ•œ๋‹ค.
 */
@Component
public class ManualJobLauncher implements ApplicationRunner {

    private final JobLauncher jobLauncher;
    private final Collection<Job> jobs;

    public ManualJobLauncher(JobLauncher jobLauncher, Collection<Job> jobs) {
        this.jobLauncher = jobLauncher;
        this.jobs = jobs;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        String jobName = "{์‹คํ–‰ํ•˜๊ณ ์žํ•˜๋Š” job ์ด๋ฆ„}"; // Job ์ด๋ฆ„

        // Job
        Job job = determineJob(jobName);

        // JobParameters
        JobParameters jobParameters = new JobParametersBuilder()
                .addString("name", "binghe")
                .toJobParameters();

        // Job (ํ˜น์€ ์—ฌ๋Ÿฌ Job) ์‹คํ–‰
        jobLauncher.run(job, jobParameters);
    }

    private Job determineJob(String jobName) {
        return jobs.stream()
                .filter(job -> job.getName().equals(jobName))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("์กด์žฌํ•˜์ง€ ์•Š๋Š” Job ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."));
    }
}

jobName์— ์‹คํ–‰์‹œํ‚ค๊ณ ์žํ•˜๋Š” Job์„ ์ž…๋ ฅํ•˜๊ณ  ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

๋ฐ‘์—์„œ ๋‹ค๋ฃจ๊ฒ ์ง€๋งŒ, @EnableBatchProcessing๋„ ์ด ApplicationRunner ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•œ CommandLineRunner์„ ์ด์šฉํ•˜์—ฌ Job์„ ์ž๋™์œผ๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค.

์‹ค์ œ ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ ๋ฐฐ์น˜๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด์„œ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋ ค๋ฉด ์„ค์ • ํŒŒ์ผ (yml ํ˜น์€ properties)์—์„œ spring.batch.job.enabled = false ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.


2๏ธโƒฃ ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ• - HTTP ์š”์ฒญ์‹œ ์‹คํ–‰

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๊ต‰์žฅํžˆ ์‰ฌ์šด.. HTTP ์›น ์š”์ฒญ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด JobLauncher๋ฅผ ์ฃผ์ž…๋ฐ›์•„ Job์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

JobLauncherTestController.java

@Slf4j
@RequiredArgsConstructor
@RestController
public class JobLauncherTestController {

    private final JobLauncher jobLauncher;
    private final Job scopeSampleJob;

    @GetMapping("/batch")
    public ResponseEntity<String> launchBatch(@RequestParam("date") String date) {
        JobParameters jobParameters = new JobParametersBuilder()
                .addString("date", date)
                .toJobParameters();

        try {
            jobLauncher.run(scopeSampleJob, jobParameters);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return ResponseEntity.ok("error");
        }

        return ResponseEntity.ok("ok");
    }
}

์œ„ ์˜ˆ์‹œ๋Š” ์›น ํ‘œํ˜„๊ณ„์ธต์— JobLauncher์™€ Job์„ ์ฃผ์ž…๋ฐ›์•„ ์‹คํ–‰์‹œํ‚ค๋Š” ์˜ˆ์‹œ์ด๋‹ค.

์œ„ ๋ฐฉ์‹์€ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹จ๊ธฐ๊ฐ„์— ๋„ˆ๋ฌด ๋งŽ์€ API ์š”์ฒญํ•˜๋ฉด, ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐฐ์น˜๊ฐ€ ํ•œ๋ฒˆ์— ์‹คํ–‰๋˜์„œ ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์น˜์˜ ๊ฒฝ์šฐ ๋Œ€์šฉ๋Ÿ‰์„ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ์—, CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ธฐ์กด์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณด๋‹ค ๋งŽ์ด ์†Œ์š”๋œ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— API ์š”์ฒญ์„ ๋ฐ›์•„ ๋ฐฐ์น˜ Job์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ์‹์€ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


3-3 @EnableBatchProcessing

์‹ค์ œ๋กœ ์Šคํ”„๋ง ๋ถ€ํŠธ ๊ธฐ๋ฐ˜์˜ ์Šคํ”„๋ง ๋ฐฐ์น˜๋„ ์œ„์™€ ๊ฐ™์ด JobLauncher๋ฅผ ์ด์šฉํ•˜์—ฌ Job์„ ์‹คํ–‰์‹œํ‚จ๋‹ค.

๋ฌผ๋ก  ์Šคํ”„๋ง ์ง„์˜์—์„œ Job ์‹คํ–‰์‹œํ‚ค๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ถ”์ƒํ™”์‹œ์ผœ๋‘์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ์ž๋กœํ•˜์—ฌ๊ธˆ @EnableBatchProcessing๋งŒ ๋ถ™์ด๋ฉด ์ž๋™์œผ๋กœ Job์„ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค.

@EnableBatchProcessing๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ํ™˜๊ฒฝ์—์„œ ์Šคํ”„๋ง ๋ฐฐ์น˜๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธ๋˜๋Š” ์• ๋…ธํ…Œ์ด์…˜์ด๋‹ค.


๐Ÿค” ์™œ ์„ ์–ธํ•ด์ค˜์•ผ ํ• ๊นŒ?

๋ฐ”๋กœ ๋ฐฐ์น˜ ์ž‘์—…์— ํ•„์š”ํ•œ ๋„๋ฉ”์ธ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋นŒ๋” ํŒฉํ† ๋ฆฌ ๋นˆ ์„ค์ •๊ณผ ๋ฐฐ์น˜์— ํ•„์š”ํ•œ ์ฃผ์š” ๋„๋ฉ”์ธ์„ ์ž๋™์œผ๋กœ ์„ค์ • ๋ฐ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. (AutoConfiguration)

์ฆ‰, ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฐฐ์น˜์˜ ์ž๋™ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ด์œผ๋กœ์จ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ ๋ชจ๋“  Job์„ ๊ฒ€์ƒ‰ํ•ด์„œ ํ•„์š”ํ•œ ๋นˆ์„ ์ดˆ๊ธฐํ™”์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ApplicationRunner ๊ตฌํ˜„ํ•œ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Job์„ ์ž๋™์œผ๋กœ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค.

๋ฐฐ์น˜์— ์‚ฌ์šฉ๋˜๋Š” ํ•„์š”ํ•œ ๋นˆ์˜ ์˜ˆ์‹œ๋กœ๋Š” JobBuilderFactory, StepBuilderFactory, JobRepository, JobLauncher๋“ฑ๋“ฑ์ด ์žˆ๋‹ค.


๐Ÿค” ์–ด๋–ป๊ฒŒ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ผ๊นŒ? - ๋™์ž‘ ์›๋ฆฌ

@EnableBatchProcessing์ด ๋ถ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž‘๋™ํ•˜๋ฉด 4๊ฐœ์˜ ์„ค์ • ํด๋ž˜์Šค๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ๋ฐฐ์น˜์˜ ๋ชจ๋“  ์ดˆ๊ธฐํ™” ๋ฐ ์‹คํ–‰ ๊ตฌ์„ฑ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

  • SimpleBatchConfiguration
    • ์Šคํ”„๋ง ๋ฐฐ์น˜์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”.
      • JobBuilderFactory, StepBuilderFactory, JobRepository, JobLauncher๋“ฑ๋“ฑ ๋ฐฐ์น˜๋ฅผ ๋Œ๋ฆฌ๋Š”๋ฐ ํ•„์š”ํ•œ ๋นˆ์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    • ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์‹ค์ œ ํƒ€๊ฒŸ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”ํ•˜์ง„ ์•Š๊ณ  ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  BatchConfigurerConfiguration์˜ ๊ตฌํ˜„์ฒด๋“ค์ด ์‹คํ–‰๋˜๋ฉด์„œ ํƒ€๊ฒŸ ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•œ๋‹ค. - ์ค‘์š”
    • InitializingBean์„ ํ™œ์šฉํ•˜์—ฌ ๋นˆ์„ ์ƒ์„ฑํ•  ๋•Œ ์œ„์™€ ๊ฐ™์ด ๋ฐฐ์น˜์— ํ•„์š”ํ•œ ๋นˆ๋“ค์„ ์„ค์ •ํ•ด์ค€๋‹ค.
  • BatchConfigurerConfiguration
    • BasicBatchConfigurer
      • SimpleBatchConfigurer์—์„œ ์ƒ์„ฑ๋œ ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ ์‹ค์ œ ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์„ค์ • ํด๋ž˜์Šค์ด๋‹ค. - ์ค‘์š”
      • ๋นˆ์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…๋ฐ›์•„์„œ ์ฃผ์š” ๊ฐ์ฒด๋“ค์„ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • JpaBatchConfigrer
      • JPA ๊ด€๋ จ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์„ค์ • ํด๋ž˜์Šค์ด๋‹ค.
  • BatchAutoConfiguration
    • ์Šคํ”„๋ง ๋ฐฐ์น˜์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”๋˜๊ณ  ์‹คํ–‰๋˜๋ฉฐ, ApplicationRunner๋ฅผ ๊ตฌํ˜„ํ•œ JobLauncherApplicationRunner ๋นˆ์„ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ง€์ •๋œ Job์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด, ApplicationRunner๋Š” ๋นˆ์ด ์ƒ์„ฑ๊ณผ ๋™์‹œ์— run() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋•Œ Job์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

3-4 @EnableBatchProcessing - ์›ํ•˜๋Š” Job๋งŒ ์‹คํ–‰์‹œํ‚ค๊ธฐ

์•ž์„œ ๋งํ–ˆ๋“ฏ, @EnableBatchProcessing์„ ๋ถ™์ด๋ฉด ์Šคํ”„๋ง ๋ฐฐ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋„๋ฉ”์ธ๊ณผ ์ธํ”„๋ผ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค.

์‚ฌ์‹ค ์Šคํ”„๋ง ๋ฐฐ์น˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐ์น˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์œ„ ๋‚ด์šฉ์€ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง„ ์•Š๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์žฅ์ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐœ๋ฐœ์ž๋กœ ํ•˜์—ฌ๊ธˆ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ ์—์„œ ์Šคํ”„๋ง ์ง„์˜์€ ์ถ”์ƒํ™”๋ฅผ ์ž˜ ์ ์šฉํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธ€์˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ์•Œ์•„๋ณผ ๋‚ด์šฉ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ œ ์ฒ˜์Œ ๋ฐฐ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„์ธ ํ”„๋กœ์ ํŠธ๋‚ด์—์„œ ์›ํ•˜๋Š” Job์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

BatchAutoConfiguration ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ๋ณธ ์‚ฌ๋žŒ์€ ์•Œ๊ฒ ์ง€๋งŒ..


BatchAutoConfiguration

JobLauncher์˜ ๋นˆ์„ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ณด๋ฉด BatchProperties์—์„œ ์‹คํ–‰ํ•  Job์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€์„œ Setter๋กœ ์ฃผ์ž…ํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  BatchProperties์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด spring.batch.job.names์—์„œ ํ•ด๋‹น Job ์ด๋ฆ„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰... ์›ํ•˜๋Š” Job์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐฐ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์‹œ spring.batch.job.names์— Job Name์„ ๊ธฐ์ž…ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


IntelliJ์—์„œ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์‹œ

CLIํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

java -jar batch-application.jar --job.name={jobNames}

์ฐธ๊ณ