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

Spring Batch

ํŒจ์ŠคํŠธ์บ ํผ์Šค ์ฑŒ๋ฆฐ์ง€ 21์ผ์ฐจ - Spring Batch 3

๐Ÿ“Œ spring-batch 3

 

โœ”๏ธ JobExecutionContext

  • Step ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ
    ex) job์˜ execution context ์ ‘๊ทผ
    JobExecution jobExecution = stepExecution.getJobExecution();
    JobInstance jobInstance = jobExecution.getJobInstance();
    ExecutionContext jobExecutionExecutionContext = jobExecution.getExecutionContext();

 

โœ”๏ธ StepExecutionContext

  • ํ•œ Step ๋‚ด์—์„œ๋งŒ ๋ฐ์ดํ„ฐ ์œ ํšจํ•˜๋‹ค.
  • Step ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. โŒ
    ex) step์˜ execution context ์ ‘๊ทผ
    StepExecution stepExecution = contribution.getStepExecution();
    ExecutionContext stepExecutionExecutionContext = stepExecution.getExecutionContext();

 

โœ”๏ธ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

Tasklet

  • ๋น„๊ต์  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋Œ€๋Ÿ‰ ์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ํฐ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๊ธฐ๋Š” ๋ถ€์ ํ•ฉํ•˜๋‹ค. (๊ฐ€๋Šฅ์€ ํ•จ)

Chunk

  • ๋Œ€๋Ÿ‰์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ Tasklet๋ณด๋‹ค ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    ex) 10000๊ฐœ ๋ฐ์ดํ„ฐ๋ฅผ 1000๊ฐœ์”ฉ 10๊ฐœ ๋ฉ์–ด๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌ
    Tasklet์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด 10000๊ฐœ๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋™์œผ๋กœ 1000๊ฐœ์”ฉ ๋ถ„ํ• 

 

โœ”๏ธ ChunkBasedStep

stepBuilderFactory.get("stepName")
    .<String, String>chunk(10) // ๋ฐฐ์น˜๋ฅผ 10๋ฒˆ์— ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌ
    .reader(itemReader())
    .processor(itemProcessor())
    .writer(itemWriter())
    .build()
  • itemReader() ์—์„œ null์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ step ๋ฐ˜๋ณตํ•œ๋‹ค.

โœ”๏ธ TaskBasedStep

stepBuilderFactory.get("stepName")
    .tasklet()
    .build();

 

โœ”๏ธ chunk ๋ฉ”์„œ๋“œ
<input,output>chunk(int)

  • itemReader์—์„œ input ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
  • itemProcessor์—์„œ input ํƒ€์ž… ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ output ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
  • itemWriter๋Š” itemProcessor๋กœ๋ถ€ํ„ฐ output ํƒ€์ž… ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • outputํƒ€์ž… ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ chunk ์‚ฌ์ด์ฆˆ
    • itemWriter์—์„œ ํ•œ step์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ํฌ๊ธฐ = chunk size

 

โœ”๏ธ ListItemReader
์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ List<T>๋ฅผ ๋ฐ›๋Š”๋‹ค.

  • ์˜ˆ์ œ์—์„œ ItemReader์—์„œ List๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

โœ”๏ธ Task ๊ธฐ๋ฐ˜ step์—์„œ chunk ๊ตฌํ˜„

  • ์ฝ”๋“œ๋กœ chunk ์‚ฌ์ด์ฆˆ๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ผ์„œ ๊ตฌํ˜„ํ•œ๋‹ค.
StepExecution stepExecution = contribution.getStepExecution();

int chunkSize = 10;
int fromIdx = stepExecution.getReadCount();
int toIdx = fromIdx + chunkSize;

if (fromIdx >= testData.size()) return RepeatStatus.FINISHED;

log.info("(task) chunk size = {}", testData.subList(fromIdx, toIdx).size());

stepExecution.setReadCount(toIdx);

return RepeatStatus.CONTINUABLE;

 

โœ”๏ธ Task ๊ธฐ๋ฐ˜ step์—์„œ chunk ๊ตฌํ˜„ (JobParameters ์‚ฌ์šฉ)
์‹คํ–‰์‹œ์ ์— ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์œ ์—ฐํ•œ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•˜๋‹ค.

StepExecution stepExecution = contribution.getStepExecution();
JobParameters jobParameters = stepExecution.getJobParameters();

int chunkSize = 
Integer.parseInt(jobParameters.getString("chunkSize", "0"));

 

โœ”๏ธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ง€์ •
Edit Contribution - Program arguments
-chunkSize=20 --job.names=chunkProcessingJob

 


 

๐Ÿ‘  ์ˆ˜๊ฐ•์ธ์ฆ

 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ์ฐธ์—ฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.