Spring Batch

Spring Batch Flow

[Spring] 1. Spring Batch์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

  • Job > Step > Task ๊ตฌ์กฐ

    • Job์€ Step์„ ๊ฐ–๊ณ  ์žˆ๊ณ , Step์€ Tasklet ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ ์ž‘์—…์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

    • Task๋Š” ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ์ž ์ •์˜ ํ˜•์‹๊ณผ read/process/write (RPW) ํ˜•์‹์ด ์กด์žฌํ•œ๋‹ค.

Spring Batch Metadata

[Spring] 1. Spring Batch์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

Spring Batch๋Š” DB๋ฅผ ํ†ตํ•ด ์™„๋ฃŒ/์‹คํŒจ ๋“ฑ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค. ํฌ๊ฒŒ 4๊ฐ€์ง€์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค.

  1. ์ด์ „ ์‹คํ–‰ job history

  2. ์‹คํŒจํ•œ batch์™€ parameter / ์„ฑ๊ณตํ•œ job

  3. ์‹คํ–‰ ์žฌ๊ฐœ ์ง€์ 

  4. Job ๊ธฐ์ค€ step ํ˜„ํ™ฉ๊ณผ ์„ฑ๊ณต / ์‹คํŒจ ์—ฌ๋ถ€

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ…Œ์ด๋ธ”์ด DB์— ์ƒ์„ฑ๋˜๋Š”๋ฐ, H2 DB ์‚ฌ์šฉ์‹œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋‚˜ ๊ทธ์™ธ DB๋Š” ์ง์ ‘ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. DDL ์ฟผ๋ฆฌ๋Š” org.springframework.batch.core์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

Spring Batch ์ •๋ฆฌ

  • spring-starter-batch dependency ์ถ”๊ฐ€

  • task scheduling ๋Œ€์ฒด๊ฐ€ ์•„๋‹Œ, scheduler์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง

  • ์œ ์ฆˆ ์ผ€์ด์Šค

    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ, ํ๋กœ๋ถ€ํ„ฐ ์ปค๋‹ค๋ž€ ์ˆ˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋“ค์ž„

    • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

    • ์กฐ์ž‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑ

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

  • ์Šคํ”„๋ง ๋ฐฐ์น˜ ๊ณ„์ธต ๊ตฌ์กฐ (Spring Batch Layered Architecture)

  • Application์€ ๋ชจ๋“  ๋ฐฐ์น˜ ์ž‘์—…๊ณผ ์Šคํ”„๋ง ๋ฐฐ์น˜๋กœ ์ž‘์„ฑํ•œ ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

  • Batch Core๋Š” ๋ฐฐ์น˜ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ๋Ÿฐํƒ€์ž„ ํด๋ž˜์Šค๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. JobLauncher, Job, Step์˜ ๊ตฌํ˜„์ฒด๋ฅผ ํฌํ•จํ•œ๋‹ค.

  • Application๊ณผ Core ๋‘˜ ๋‹ค ๋™์ผํ•œ infrastructure ์œ„์—์„œ ์ž‘๋™ํ•œ๋‹ค. Infrastructure์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต reader (์˜ˆ๋ฅผ ๋“ค๋ฉด ItemReader)์™€ writer (์˜ˆ๋ฅผ ๋“ค๋ฉด ItemWriter), service (์˜ˆ๋ฅผ ๋“ค์–ด RetryTemplate)๋ฅผ ํฌํ•จํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”์–ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํฌํ•จํ•œ๋‹ค. (์ฝ”์–ด ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.)

  • ๊ฐ€์ด๋“œ๋ผ์ธ

    • ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์น˜์™€ ๊ฐ€๊นŒ์ด ๋‘์ž. ์ฆ‰, ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊นŒ์ด ๋‘์ž” ๋œป.

    • I/O๋ฅผ ์ค„์ด๊ณ  ๋‚ด์žฅ ๋ฉ”๋ชจ๋ฆฌ ์œ„์—์„œ ์ž‘์—…์„ ๋งŽ์ด ํ•˜์ž.

    • ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด์„œ ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ๋ง๊ณ  ํ•œ๋ฒˆ์— ์ฝ๊ณ  ์บ์‹œ๋ฅผ ํ•ด๋‘๋˜์ง€ ์ž‘์—… ์ค‘์ธ ์ €์žฅ์†Œ์— ๋ณด๊ด€ํ•ด๋‘์ž.

    • ๊ฐ™์€ ๋ฐฐ์น˜ ์ž‘์—…์„ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜์ง€ ๋ง์ž.

    • ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์žฌํ• ๋‹น์— ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ์• ์ดˆ์— ๋ฐฐ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๋‹นํžˆ ํ• ๋‹นํ•ด๋‘์ž.

SpEL (Spring Expression Language)

Spring Expression Language(SpEL) ์— ๋Œ€ํ•ด

SpEL (Spring Expression Language) ์€ ๋Ÿฐํƒ€์ž„์—์„œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ(query)์™€ ์กฐ์ž‘(manipulation)์„ ์ง€์›ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ํ‘œํ˜„ ์–ธ์–ด์ด๋‹ค.

SpEL ํ‘œํ˜„์‹์€ # ๊ธฐํ˜ธ๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•œ๋‹ค. #{ํ‘œํ˜„์‹}

์†์„ฑ ๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ๋Š” $ ๊ธฐํ˜ธ์™€ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•œ๋‹ค. ${property.name}

Spring Batch

๋ฐฐ์น˜์˜ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ฝ๊ธฐ - ์ฒ˜๋ฆฌ - ์“ฐ๊ธฐ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

๋ฐฐ์น˜ ๊ด€๋ จ ๊ฐ์ฒด ๊ด€๊ณ„๋„

Job๊ณผ Step์€ 1:M, Step๊ณผ ItemReader, ItemProcessor, ItemWriter๋Š” 1:1 ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š”๋‹ค.

Job์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ํฐ ์ผ๊ฐ(Job)์— ์—ฌ๋Ÿฌ ๋‹จ๊ณ„(Step)๋ฅผ ๋‘๊ณ , ๊ฐ ๋‹จ๊ณ„๋ฅผ ๋ฐฐ์น˜์˜ ๊ธฐ๋ณธ ํ๋ฆ„๋Œ€๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

Job

Job ์€ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋งŒ๋“ค์–ด ํ‘œํ˜„ํ•œ ๊ฐ์ฒด์ด๋‹ค. ์ „์ฒด ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ์žˆ์–ด ํ•ญ์ƒ ์ตœ์ƒ๋‹จ ๊ณ„์ธต์— ์žˆ๋‹ค. Job ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ Step ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋‹ค.

Job ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋นŒ๋”๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ๋‹ค. JobBuilderFactory๋กœ ์›ํ•˜๋Š” Job์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. JobBuilderFactory์˜ get() ๋ฉ”์„œ๋“œ๋กœ JobBuilder๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์‘์šฉํ•˜๋ฉด ๋œ๋‹ค. org.springframework.batch.core.Configuration.annotation.JobBuilderFactory์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ์ด๋‹ค. (๊ธธ๋‹ค ๊ธธ์–ด!)

// org.springframework.batch.core.Configuration.annotation.JobBuilderFactory
public class JobBuilderFactory {
	private JobRepository jobRepository;

	public JobBuilderFactory(JobRepository jobRepository) {
			this.jobRepository = jobRepository;
	}

	public JobBuilder get(String name) {
			JobBuilder builder = new JobBuilder(name).repository(jobRepository);
			return builder;
	}
}

get() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด JobBuilder ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค๋ฒˆ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค JobBuilderFactory ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ฃผ์ž…๋ฐ›์€ JobRepository ๋ฅผ ์‚ฌ์šฉํ•  repository๋กœ ์„ค์ •ํ•œ๋‹ค. ์ฆ‰, ํ•ด๋‹น JobBuilderFactory ์—์„œ ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  JobBuilder ๊ฐ€ ๋™์ผํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜๋Š” JobBuilder ์ฝ”๋“œ ์ผ๋ถ€์ด๋‹ค.

// org.springframework.batch.core.job.builder.JobBuilder

// ...

public SimpleJobBuilder start(Step step) {
	return new SimpleJobBuilder(this).start(step);
}

public JobFlowBuilder start(Flow flow) {
	return new JobFlowBuilder(this).start(flow);
}

public JobFlowBuilder flow(Step step) {
	return new JobFlowBuilder(this).start(step);
}

// ...

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

๋นŒ๋”๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถˆํŽธํ•ด๋ณด์ด์ง€๋งŒ, ๋ฉ”์„œ๋“œ ์ฒด์ธ ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด ๊ตฌ์ฒด์ ์ธ ๋นŒ๋”์˜ ์กด์žฌ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š์•„๋„ ๋  ๋งŒํผ ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด Job์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ Step ๋˜๋Š” Flow๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ๊ตฌ์ฒด์ ์ธ ๋นŒ๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค. Job์€ Step ๋˜๋Š” Flow ์ธ์Šคํ„ด์Šค์˜ ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

๋‹ค์Œ์€ Job ์ƒ์„ฑ ์˜ˆ์ œ ์ฝ”๋“œ์ด๋‹ค.

@Autowired
private JobBuilderFactory jobBuilderFactory;

@Bean
public Job simpleJob() {
    return jobBuilderFactory.get("simpleJob")  // 'simpleJob' ์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ Job์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” `JobBuilder` ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜
                .start(simpleStep())  // `simpleStep()`์€ ๊ฐ„๋‹จํ•œ `Step` ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ผ ๊ฐ€์ •ํ•œ๋‹ค. `start()` ๋ฉ”์„œ๋“œ๋กœ ์ธํ•ด ์ƒ์„ฑ๋˜๋Š” ๋นŒ๋”๋Š” `SimpleJobBuilder`
                .build();  // 'simpleJob'์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ `Job`์ด ์ƒ์„ฑ๋˜์–ด ๋ฐ˜ํ™˜
}

JobInstance

JobInstance ๋Š” ๋ฐฐ์น˜์—์„œ Job ์ด ์‹คํ–‰๋  ๋•Œ ํ•˜๋‚˜์˜ Job ์‹คํ–‰ ๋‹จ์œ„์ด๋‹ค. ๋งŒ์•ฝ ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ์”ฉ ๋ฐฐ์น˜์˜ Job ์ด ์‹คํ–‰๋œ๋‹ค๋ฉด, ์–ด์ œ์™€ ์˜ค๋Š˜ ์‹คํ–‰ํ•œ ๊ฐ๊ฐ์˜ Job์„ JobInstance ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ๊ฐ์˜ JobInstance ๋Š” ํ•˜๋‚˜์˜ JobExecution (JobInstance์— ๋Œ€ํ•œ ํ•œ ๋ฒˆ์˜ ์‹คํ–‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด)์„ ๊ฐ–๊ณ  ์žˆ์„๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

์˜ค๋Š˜ Job์„ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์‹คํŒจํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ๋‚  ๋™์ผํ•œ JobInstance ๋ฅผ ๊ฐ€์ง€๊ณ  ๋˜ ์‹คํ–‰ํ•œ๋‹ค. Job ์‹คํ–‰์ด ์‹คํŒจํ•˜๋ฉด JobInstance ๊ฐ€ ๋๋‚œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด JobInstance ๋Š” ์–ด์ œ์˜ ์‹คํŒจํ•œ JobExecution ๊ณผ ์˜ค๋Š˜ ์„ฑ๊ณตํ•œ JobExecution ๋‘ ๊ฐœ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์ฆ‰, JobExecution์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

JobExecution

JobExecution ์€ JobInstance์— ๋Œ€ํ•œ ํ•œ ๋ฒˆ์˜ ์‹คํ–‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์„ค๋ช…ํ•˜์ž๋ฉด, ๋งŒ์•ฝ ์˜ค๋Š˜์˜ Job์ด ์‹คํŒจํ•ด ๋‚ด์ผ ๋‹ค์‹œ ๋™์ผํ•œ Job ์„ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋Š˜, ๋‚ด์ผ์˜ ์‹คํ–‰ ๋ชจ๋‘ ๊ฐ™์€ JobInstance ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๋‹จ, ์˜ค๋Š˜, ๋‚ด์ผ์˜ ์‹คํ–‰์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ JobExecution ์„ ์ƒ์„ฑํ•œ๋‹ค.

JobExecution ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๋ฉด Job ์‹คํ–‰์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. JobExecution ์€ JobInstance, ๋ฐฐ์น˜ ์‹คํ–‰ ์ƒํƒœ, ์‹œ์ž‘ ์‹œ๊ฐ„, ๋๋‚œ ์‹œ๊ฐ„, ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ ๋ฉ”์‹œ์ง€ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

๋‹ค์Œ์€ JobExecution ๋‚ด๋ถ€์˜ ์ฝ”๋“œ์ด๋‹ค.

// org.springframework.batch.core.JobExecution
public class JobExecution extends Entity {

	private final JobParameters jobParameters;
	private JobInstance jobInstance;
	private volatile Collection<StepExecution> stepExecutions = Collections.synchronizedSet(new LinkedHashSet<>());
	private volatile BatchStatus status = BatchStatus.STARTING;
	private volatile Date startTime = null;
	private volatile Date createTime = new Date(System.currentTimeMillis());
	private volatile Date endTime = null;
	private volatile Date lastUpdated = null;
	private volatile ExitStatus exitStatus = ExitStatus.UNKNOWN;
	private volatile ExecutionContext executionContext = new ExecutionContext();
	private transient volatile List<Throwable> failureExceptions = new CopyOnWriteArrayList<>();
	private final String jobConfigurationName;

		// ...
}
  • jobParameters : Job ์‹คํ–‰์— ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ.

  • jobInstance : Job ์‹คํ–‰์˜ ๋‹จ์œ„๊ฐ€ ๋˜๋Š” ๊ฐ์ฒด.

  • stepExecutions : StepExecution์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” Collection ํƒ€์ž….

  • status : Job์˜ ์‹คํ–‰ ์ƒํƒœ. (COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED, UNKNOWN ๋“ฑ์ด ์žˆ๋‹ค. default๋Š” STARTING)

  • startTime : Job ์ด ์‹คํ–‰๋œ ์‹œ๊ฐ„. null ์ด๋ฉด ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป.

  • createTime : JobExecution ์ด ์ƒ์„ฑ๋œ ์‹œ๊ฐ„.

  • endTime : JobExecution์ด ๋๋‚œ ์‹œ๊ฐ„.

  • lastUpdated : ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •๋œ ์‹œ๊ฐ„.

  • exitStatus : Job ์‹คํ–‰ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ƒํƒœ. (UNKNOWN, EXECUTING, COMPLETED, NOOP, FAILED, STOPPED ๋“ฑ์ด ์žˆ๋‹ค. default๋Š” UNKNOWN)

  • executionContext : Job ์‹คํ–‰ ์‚ฌ์ด์— ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

  • failureExceptions : Job ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ List ์— ๋„ฃ์–ด๋‘”๋‹ค.

  • jobConfigurationName : Job ์„ค์ • ์ด๋ฆ„.

JobParameters

JobParameters ๋Š” Job ์ด ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ Map ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

JobParameters ๋Š” JobInstance ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ธฐ์ค€์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Job ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์‹œ์ž‘ ์‹œ๊ฐ„ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•ด์„œ ํ•˜๋‚˜์˜ JobInstance ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ฆ‰, JobInstance์™€ JobParameters ๋Š” 1:1 ๊ด€๊ณ„์ด๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์œผ๋กœ๋Š” String , Long , Date , Double ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Step

Step์€ ์‹ค์งˆ์ ์ธ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์ด๋‹ค. Job ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ค์งˆ์ ์ธ ๋‹จ์œ„๋กœ ์“ฐ์ธ๋‹ค.

๋ชจ๋“  Job ์—๋Š” 1๊ฐœ ์ด์ƒ์˜ Step์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

StepExecution

Job ์— JobExecution ์ด๋ผ๋Š” Job ์‹คํ–‰ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด, Step์—๋Š” StepExecution ์ด๋ผ๋Š” Step ์‹คํ–‰ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ Step ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค StepExecution ์ด ์ƒ์„ฑ๋œ๋‹ค.

๋‹ค์Œ์€ StepExecution ํด๋ž˜์Šค์ด๋‹ค.

public class StepExecution extends Entity {

	private final JobExecution jobExecution;
	private final String stepName;
	private volatile BatchStatus status = BatchStatus.STARTING;
	private volatile long readCount = 0;
	private volatile long writeCount = 0;
	private volatile long commitCount = 0;
	private volatile long rollbackCount = 0;
	private volatile long readSkipCount = 0;
	private volatile long processSkipCount = 0;
	private volatile long writeSkipCount = 0;
	private volatile Date startTime = null;
	private volatile Date createTime = new Date(System.currentTimeMillis());
	private volatile Date endTime = null;
	private volatile Date lastUpdated = null;
	private volatile ExecutionContext executionContext = new ExecutionContext();
	private volatile ExitStatus exitStatus = ExitStatus.EXECUTING;
	private volatile boolean terminateOnly;
	private volatile long filterCount;
	private transient volatile List<Throwable> failureExceptions = new CopyOnWriteArrayList<>();

	// ...
}
  • jobExecution : ํ˜„์žฌ์˜ JobExecution ์ •๋ณด.

  • stepName : Step์˜ ์ด๋ฆ„.

  • status : Step ์˜ ์‹คํ–‰ ์ƒํƒœ. (COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED, UNKNOWN ๋“ฑ์ด ์žˆ๋‹ค. default๋Š” STARTING.)

  • readCount : ์„ฑ๊ณต์ ์œผ๋กœ ์ฝ์€ ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • writeCount : ์„ฑ๊ณต์ ์œผ๋กœ ์“ด ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • commitCount : Step์˜ ์‹คํ–‰์— ๋Œ€ํ•ด ์ปค๋ฐ‹๋œ ํŠธ๋žœ์žญ์…˜ ์ˆ˜.

  • rollbackCount : Step์˜ ์‹คํ–‰์— ๋Œ€ํ•ด ๋กค๋ฐฑ๋œ ํŠธ๋žœ์žญ์…˜ ์ˆ˜.

  • readSkipCount : ์ฝ๊ธฐ์— ์‹คํŒจํ•ด ๊ฑด๋„ˆ๋›ด ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • processSkipCount : ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํŒจํ•ด ๊ฑด๋„ˆ๋›ด ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • writeSkipCount : ์“ฐ๊ธฐ์— ์‹คํŒจํ•ด ๊ฑด๋„ˆ๋›ด ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • startTime : Step์ด ์‹คํ–‰๋œ ์‹œ๊ฐ„. null์ด๋ฉด ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป.

  • endTime : Step์˜ ์‹คํ–‰ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ๊ด€๋ จ ์—†์ด Step์ด ๋๋‚œ ์‹œ๊ฐ„.

  • lastUpdated : ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •๋œ ์‹œ๊ฐ„.

  • executionContext : Step ์‹คํ–‰ ์‚ฌ์ด์— ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

  • exitStatus : Step ์‹คํ–‰ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ƒํƒœ. (UNKNOWN, EXECUTING, COMPLETED, NOOP, FAILED, STOPPED ๋“ฑ์ด ์žˆ๋‹ค. default๋Š” UNKNOWN.)

  • terminateOnly : Job ์‹คํ–‰ ์ค‘์ง€ ์—ฌ๋ถ€.

  • filterCount : ์‹คํ–‰์—์„œ ํ•„ํ„ฐ๋ง๋œ ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • failureExceptions : Step ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ List ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

JobRepository

JobRepository ๋Š” ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์–ด๋–ค Job์ด ์‹คํ–‰๋˜์—ˆ์œผ๋ฉฐ, ๋ช‡ ๋ฒˆ ์‹คํ–‰๋˜์—ˆ๊ณ , ์–ธ์ œ ๋๋‚ฌ๋Š”์ง€ ๋“ฑ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Job ํ•˜๋‚˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด JobRepository ์—์„œ๋Š” ๋ฐฐ์น˜ ์‹คํ–‰์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋„๋ฉ”์ธ์ธ JobExecution ์„ ์ƒ์„ฑํ•œ๋‹ค.

JobRepository ๋Š” Step ์˜ ์‹คํ–‰ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” StepExecution ๋„ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋ฉฐ, ์ „์ฒด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

JobLauncher

JobLauncher ๋Š” Job , JobParameters ์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” run() ํ•˜๋‚˜์ด๋‹ค.

// org.springframework.batch.core.launch.JobLauncher
public interface JobLauncher {
	public JobExecution run(Job job, JobParameters jobParameters) throws ...
}

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Job๊ณผ JobParameters๋ฅผ ๋ฐ›์•„ JobExecution์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ด์ „๊ณผ ๋™์ผํ•˜๋ฉด์„œ ์ด์ „์— JobExecution์ด ์ค‘๋‹จ๋œ ์  ์žˆ๋‹ค๋ฉด ๋™์ผํ•œ JobExecution์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ItemReader

ItemReader๋Š” Step์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ํŒŒ์ผ, XML, CSV, DB ๋“ฑ ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

// org.springframework.batch.item.ItemReader
public interface ItemReader<T> {
	T read() throws Exception, UnexpectedException, ParseException, NonTransientResourceException;
}

ItemReader ์—์„œ read() ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ œ๋„ค๋ฆญ <T> ์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ์—์„œ ์ฝ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค!

ItemProcessor

ItemProcessor ๋Š” ItemReader ๋กœ ์ฝ์–ด์˜จ ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๊ตณ์ด ItemWriter๊ฐ€ ์•„๋‹ˆ๋ผ ItemProcessor๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€๋‹ค.

  1. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๊ฐ๊ฐ ์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ํ•ด ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค.

  2. Input์˜ ํƒ€์ž…๊ณผ Output์˜ ํƒ€์ž…์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. Input๊ณผ Output์˜ ํƒ€์ž…์ด ItemProcesor์˜ ์ œ๋„ค๋ฆญ <I, O>์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋‹ˆ ๋” ์ง๊ด€์ ์ด๋‹ค.

// org.springframework.batch.item.ItemProcesor
public interface ItemProcessor<I, O> {
	O process(I item) throws Exception;
}

ItemWriter

ItemWriter ๋Š” ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ DB ๋˜๋Š” ํŒŒ์ผ์— ์ €์žฅํ•œ๋‹ค.

์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ์—์„œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ ์“ฐ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

// org.springframework.batch.item.ItemWriter
public interface ItemWriter<T> {
	void write(List<? extends T> items) throws Exception;
}

ItemWriter์€ ItemReader์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

write() ๋ฉ”์„œ๋“œ๋Š” List ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด ์ง€์ •ํ•œ ํƒ€์ž…์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ ์ˆ˜๋Š” ์„ค์ •ํ•œ ์ฒญํฌ (chunk) ๋‹จ์œ„๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

write() ๋ฉ”์„œ๋“œ๋Š” void ํ•จ์ˆ˜๋ผ์„œ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋”ฐ๋กœ ์—†๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋กœ์ง๋งŒ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

์ง€์—ฐ ์ƒ์„ฑ (Lazy Initialization)

  • ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ ๋ฐฉ๋ฒ•.

  • ์ง€์—ฐ ์ดˆ๊ธฐํ™”: ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋”ฉ์„ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋‚ญ๋น„๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฆ‰, ๊ฐœ์ฒด๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ๊นŒ์ง€ ์ƒ์„ฑ์„ ์ง€์—ฐ์‹œํ‚จ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. Lazy Loading โ†” Eager Loading

  • ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์‹œ์ ์— ํ•˜์ง€ ์•Š๊ณ  ์ฒ˜์Œ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์ ์— ํ•˜๋Š”๊ฒƒ

  • e.g., ์Šคํ”„๋ง์—์„œ ๊ธฐ๋ณธ ๋นˆ ์ƒ์„ฑ์€ ์‹ฑ๊ธ€ํ„ด์ธ๋ฐ, Spring Batch๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ @StepScope๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” Step์˜ ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ๋นˆ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ฆ‰, Step์˜ ์‹คํ–‰๋งˆ๋‹ค ์ƒˆ๋กœ ๋นˆ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ฐ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. โ€” ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ 2, p261

์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ (chunk oriented processing)

**์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ (chunk oriented processing)**์ด๋ž€ ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ๋‚ด์—์„œ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.

**์ฒญํฌ(chunk)**๋ž€ ์•„์ดํ…œ์ด ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹๋˜๋Š” ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค.

readํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ์ง€์ •ํ•œ ์ฒญํฌ ๋‹จ์œ„(CHUNK_SIZE)์™€ ์ผ์น˜ํ•˜๋ฉด, write๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ์˜ ์ด์ ์€?

์ฒญํฌ๋กœ ๋‚˜๋ˆ„์ง€ ์•Š์•˜์„ ๋•Œ๋Š” 1000๊ฐœ ์ค‘ ํ•˜๋‚˜๋งŒ ์‹คํŒจํ•ด๋„ ๋‚˜๋จธ์ง€ 999๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กค๋ฐฑ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ฒญํฌ ๋‹จ์œ„๋ฅผ 10์œผ๋กœ ํ•ด์„œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ๋„์ค‘์— ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ฒญํฌ๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์Šคํ”„๋ง ๋ฐฐ์น˜์—์„œ๋Š” ์ฒญํฌ ๋‹จ์œ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•œ๋‹ค.

์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ์ด ์•„๋‹Œ ๋ฐฉ์‹ โ€” Tasklet

์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ์ด ์•„๋‹Œ ๋ฐฉ์‹์€ Tasklet์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Tasklet์€ ์ž„์˜์˜ Step์„ ์‹คํ–‰ํ•  ๋•Œ ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ฝ๊ธฐ, ์ฒ˜๋ฆฌ, ์“ฐ๊ธฐ๋กœ ๋‚˜๋‰œ ๋ฐฉ์‹์ด ์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ์ด๋ผ๋ฉด, ์ด๋ฅผ ๋‹จ์ผ ๊ฐœ๋…์œผ๋กœ ๋งŒ๋“  ๊ฒƒ์ด Tasklet์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

Tasklet ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด๋ถ€์— execute() ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋งŒ ์ง€์›ํ•œ๋‹ค. ๋‚ด๋ถ€์— ์›ํ•˜๋Š” ๋‹จ์ผ ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ž‘์—…์ด ๋๋‚˜๋ฉด RepeatStatus.FINISHED๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ž‘์—…์ด ๊ณ„์†๋œ๋‹ค๋ฉด RepeatStatus.CONTINUABLE์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Flow ์ œ์–ด

์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์„ธ๋ถ€์ ์ธ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜, ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ Step์˜ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์Šคํ”„๋ง ๋ฐฐ์น˜์—์„œ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” Flow์ด๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Step ์‹คํ–‰ํ•˜๊ธฐ

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

  1. TaskExecutor ๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ Step ๋™์ž‘์‹œํ‚ค๊ธฐ

  2. ์—ฌ๋Ÿฌ ๊ฐœ์˜ Flow ์‹คํ–‰์‹œํ‚ค๊ธฐ

  3. ํŒŒํ‹ฐ์…”๋‹์„ ์ด์šฉํ•œ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

REF

๊ทธ ์™ธ ์ฝ์–ด๋ณด๋ฉด ์ข‹์€ ๊ธ€์„ ๋ชจ์•„๋ณธ๋‹ค.

Spring Batch์™€ Querydsl | ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ

Last updated

Was this helpful?