[Spring Batch] 3. ์คํ๋ง ๋ฐฐ์น ๋๋ฉ์ธ ์ดํด
1. Job
1) ๊ธฐ๋ณธ ๊ฐ๋
- ๋ฐฐ์น ๊ณ์ธต ๊ตฌ์กฐ์์ ๊ฐ์ฅ ์์์ ์๋ ๊ฐ๋ ์ผ๋ก์ ํ๋์ ๋ฐฐ์น์์ ์์ฒด๋ฅผ ์๋ฏธ
(ex. API ์๋ฒ์ ์ ์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ํต๊ณ ์๋ฒ๋ก ์ฎ๊ธฐ๋ ๋ฐฐ์น = Job ์์ฒด)
- Job Configuration์ ํตํด ์์ฑ๋๋ ๊ฐ์ฒด ๋จ์๋ก์ ๋ฐฐ์น์์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๊ณ ์คํํ ๊ฒ์ธ์ง ์ ์ฒด์ ์ผ๋ก ์ค์ ํ๊ณ ๋ช ์ธํด ๋์ ๊ฐ์ฒด
- ๋ฐฐ์น Job์ ๊ตฌ์ฑํ๊ธฐ ์ํ ์ต์์ ์ธํฐํ์ด์ค์ด๋ฉฐ, ์คํ๋ง ๋ฐฐ์น๊ฐ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ฅผ ์ ๊ณต
- ์ฌ๋ฌ Step์ ํฌํจํ๊ณ ์๋ ์ปจํ ์ด๋๋ก์ ๋ฐ๋์ ํ ๊ฐ ์ด์์ Step์ผ๋ก ๊ตฌ์ฑํด์ผํจ
2) ๊ธฐ๋ณธ ๊ตฌํ์ฒด
[ 1. SimpleJob ]
- ์์ฐจ์ ์ผ๋ก Step์ ์คํ์ํค๋ Job
- ๋ชจ๋ Job์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ํ์ค ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์
[ 2. FlowJob ]
- ํน์ ํ ์กฐ๊ฑด๊ณผ ํ๋ฆ์ ๋ฐ๋ผ Step์ ๊ตฌ์ฑํ์ฌ ์คํ์ํค๋ Job
- Flow ๊ฐ์ฒด๋ฅผ ์คํ์์ผ์ ์์ ์ ์งํ
- JobLauncher (Job ์คํ) ์ด job ๊ฐ์ฒด์ parameters ๊ฐ์ฒด๋ก Job ์คํ
- Job์ ํ๋์ ๋๋ฉ์ธ ๊ฐ์ฒด (์ธํฐํ์ด์ค๋ก ์ ๊ณต)
- Steps๋ผ๋ List ๋ณ์ ๊ฐ์ง๊ณ ์์
- ํ๋์ ๋ช ์ธ์/์ค๊ณ์๊ณ Step์ ํฌํจํ๋ ์ปจํ ์ด๋ ์ญํ ์ ํจ
- Job ์ต์์ Interface
- void execute ๋ฉ์๋ (JobeExecution) ๋๋ฉ์ธ ๊ฐ์ฒด ์ธ์๋ก ๋ฐ์์ ์คํ
- ์ด Interface๋ฅผ ์์ํ ์ถ์ํด๋์ค AbstractJob (ํ๋ ๊ฐ์ง)
- ์ด ์ถ์ํด๋์ค๋ฅผ ์์๋ฐ๋ ๋ ๊ฐ์ Job
* Job ์ค์ -> Step ์ค์ -> Joblauncher๊ฐ Job ์คํ -> Job ๊ตฌ๋ -> Job์ด Step ์คํ -> Tasklet ์คํ
2. JobInstance
1) ๊ธฐ๋ณธ ๊ฐ๋
- Job์ด ์คํ๋ ๋ ์์ฑ๋๋ Job์ ๋ ผ๋ฆฌ์ ์คํ ๋จ์ ๊ฐ์ฒด๋ก์ ๊ณ ์ ํ๊ฒ ์๋ณ ๊ฐ๋ฅํ ์์ ์คํ์ ๋ํ๋
- Job์ ์ค์ ๊ณผ ๊ตฌ์ฑ์ ๋์ผํ์ง๋ง Job์ด ์คํ๋๋ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ด์ฉ์ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ Job์ ์คํ์ ๊ตฌ๋ถํด์ผํจ
ex) ํ๋ฃจ์ ํ ๋ฒ์ฉ ๋ฐฐ์น Job์ด ์คํ๋๋ค๋ฉด ๋งค์ผ ์คํ๋๋ ๊ฐ๊ฐ์ Job์ JobInstance๋ก ํํ
- JobInstance ์์ฑ ๋ฐ ์คํ
> ์ฒ์ ์์ํ๋ Job + JobParameter์ผ ๊ฒฝ์ฐ ์๋ก์ด JobInstance ์์ฑ
> ์ด์ ๊ณผ ๋์ผํ Job + JobParameter์ผ๋ก ์คํํ ๊ฒฝ์ฐ ์ด๋ฏธ ์กด์ฌํ๋ JobInstance ๋ฆฌํด
> ๋ด๋ถ์ ์ผ๋ก JobName + JobKey (JobParameter์ ํด์๊ฐ)๋ฅผ ๊ฐ์ง๊ณ JobInstance ๊ฐ์ฒด๋ฅผ ์ป์
- Job๊ณผ 1:M ๊ด๊ณ
2) BATCH_JOB_INSTANC ํ ์ด๋ธ๊ณผ ๋งตํ
- JOB_NAME(Job) ๊ณผ JOB_KEY(JobParameter ํด์๊ฐ)๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ ์ค๋ณตํด์ ์ ์ฅํ ์ ์์
- Job / JobParameters ํค ๊ฐ์ผ๋ก ๊ธฐ์กด ์กด์ฌํ๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์๋ก์ด JobInstance ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด JobInstance ๋ฆฌํด
JobRunner
package io.springbatch.springbatch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class JobRunner implements ApplicationRunner {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Override
public void run(ApplicationArguments args) throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addString("name", "user1")
.toJobParameters();
jobLauncher.run(job, jobParameters);
}
}
-> ์คํ ์ํค๋ฉด JobInstance ํ ์ด๋ธ์ ์ ์ฅ๋จ
-> ๋์ผํ ํ๋ผ๋ฏธํฐ๋ก ์คํ์ํค๋ฉด ์๋์ ๊ฐ์ ์๋ฌ ์ถ๋ ฅ๋๋ฉด์ ๋ฐฐ์น ์คํจ
Caused by: org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for identifying parameters={'name':'{value=user1, type=class java.lang.String, identifying=true}'}. If you want to run this job again, change the parameters. |
3. JobParameter
1) ๊ธฐ๋ณธ ๊ฐ๋
- Job์ ์คํํ ๋ ํจ๊ป ํฌํจ๋์ด ์ฌ์ฉ๋๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ๋๋ฉ์ธ ๊ฐ์ฒด
- ํ๋์ Job์ ์กด์ฌํ ์ ์๋ ์ฌ๋ฌ๊ฐ์ JobInstance๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ฉ๋
- JobParameter์ JobInstance๋ 1:1 ๊ด๊ณ
2) ์์ฑ ๋ฐ ๋ฐ์ธ๋ฉ
- ์ดํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ฃผ์ (Java -jar LogBatch.jar / requestDate = 20210101) ๋ด๋ถ์ ์ผ๋ก ์ธ์๋ก
- ์ฝ๋๋ก ์์ฑ (JobParameterBuilder >= DefaultJobParametersConverter)
- SpEL์ด์ฉ (@Value("#{JobParamter[requestDate]}"), @JobScope, @StepScope) ์ ์ธ ํ์)
3) BATCH_JOB_EXECUTION_PARAM ํ ์ด๋ธ๊ณผ ๋งตํ
- JOB_EXECUTION๊ณผ 1:M ๊ด๊ณ
- JobParameter Wrapper (๋ด๋ถ์ ์ผ๋ก LinkedHashMap)
- ํ๋ผ๋ฏธํฐ ๊ฐ ์ ์ฅ (Object ํ์ / ParameterType)
- ํ๋ผ๋ฏธํฐ ํ์ ๊ตฌ๋ถ (STRING / DATE / LONG / DOUBLE)
package io.springbatch.springbatch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class JobParameterTest implements ApplicationRunner {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Override
public void run(ApplicationArguments args) throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addString("name", "user4")
.addLong("seq", 2L)
.addDate("date", new Date())
.addDouble("age", 15.5)
.toJobParameters();
jobLauncher.run(job, jobParameters);
}
}
4. JobExecution
1) ๊ธฐ๋ณธ ๊ฐ๋
- JobInstance์ ๋ํ ํ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด๋ก์ Job ์คํ ์ค์ ๋ฐ์ํ ์ ๋ณด ์ ์ฅ ๊ฐ์ฒด
(์์์๊ฐ / ์ข ๋ฃ์๊ฐ / ์ํ ์์ฑ ๊ฐ์ง)
- JobInstance์์ ๊ด๊ณ
> JobExecution์ FAILED ๋๋ COMPLICATED ๋ฑ์ Job์ ์คํ ๊ฒฐ๊ณผ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์
> JobExecution์ ์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ COMPLICATED๋ฉด JobInstance ์คํ์ด ์๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํด ์ฌ์คํ ๋ถ๊ฐ
> JobExecution์ ์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ FAILED๋ฉด JobInstance ์คํ์ด ์๋ฃ๋์ง ์์ ๊ฒ์ผ๋ก ๊ฐใด์ฃผํด ์ฌ์คํ ๊ฐ๋ฅ
JobParameter๊ฐ ๋์ผํ ๊ฐ์ผ๋ก Job์ ์คํํ ์ง๋ผ๋ JobInstance๋ฅผ ๊ณ์ ์คํ ๊ฐ๋ฅ
> JobExecution์ ์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ COMPLICATED ๋ ๋๊น์ง ํ๋์ JobInstance ๋ด์์ ์ฌ๋ฌ ๋ฒ์ ์๋ ์๊ธธ ์ ์์
์ ๋ฆฌ) Job + JobParameter -> JobInstance 1๊ฐ -> JobExecution ์ฌ๋ฌ๊ฐ
2) BATCH_JOB_EXECUTION ํ ์ด๋ธ๊ณผ ๋งตํ
- JobInstance์ JobExecution์ 1:M์ ๊ด๊ณ๋ก์ JobInstance์ ๋ํ ์ฑ๊ณต/์คํจ ๋ด์ญ ๊ฐ์ง
5. Step
1) ๊ธฐ๋ณธ ๊ฐ๋
- Batch Job์ ๊ตฌ์ฑํ๋ ๋ ๋ฆฝ์ ์ธ ํ๋์ ๋จ๊ณ๋ก์ ์ค์ ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ์ ์ํ๊ณ ์ปจํธ๋กคํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋๋ฉ์ธ ๊ฐ์ฒด
- ๋จ์ํ ๋จ์ผ ํ ์คํฌ ๋ฟ ์๋๋ผ ์ ๋ ฅ๊ณผ ์ฒ๋ฆฌ ๊ทธ๋ฆฌ๊ณ ์ถ๋ ฅ๊ณผ ๊ด๋ จ๋ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ๋ ๋ชจ๋ ์ค์ ๋ค์ ๋ด๊ณ ์์
- ๋ฐฐ์น์์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๊ณ ์คํํ ๊ฒ์ธ์ง Job์ ์ธ๋ถ ์์ ์ Task ๊ธฐ๋ฐ์ผ๋ก ์ค์ ํ๊ณ ๋ช ์ธํด ๋์ ๊ฐ์ฒด
- ๋ชจ๋ Job์ ํ๋ ์ด์์ step์ผ๋ก ๊ตฌ์ฑ๋จ
2) ๊ธฐ๋ณธ ๊ตฌํ์ฒด
- TaskletStep : ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ํด๋์ค๋ก์ Tasklet ํ์ ์ ๊ตฌํ์ฒด๋ค์ ์ ์ด
- PartitionStep : ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก Step์ ์ฌ๋ฌ ๊ฐ๋ก ๋ถ๋ฆฌํด์ ์คํ
- JobStep : Step ๋ด์์ Job์ ์คํํ๋๋ก ํจ (Job -> Step -> Job -> Step)
- FlowStep : Step ๋ด์์ Flow๋ฅผ ์คํํ๋๋ก ํจ (Flow = ์คํ ๊ณผ ๊ฐ์ ๋จ์)
Job = ๋ช
์ธ์ Step = ๋น์ฆ๋์ค ๋ก์ง (tasklet ๊ธฐ๋ฐ ์์ ) |
Job ๋๋ฉ์ธ ๋น ์์ฑ -> ์ฌ๋ฌ๊ฐ ์คํ ํฌํจ (๋ฆฌ์คํธ์ ๋ด์๋ ) ๊ฐ๊ฐ ์คํ ์ executeํด์ ์คํ
-> Step์ ๋ด๋ถ์ ์ผ๋ก tasklet ์ธํฐํ์ด์ค ๊ฐ์ฒด ํฌํจ -> Step์ด Tasklet execute
-> Tasklet ์์ Chunk ๊ธฐ๋ฐ (reader writer) or customized ๋ ๋จ์ task
3) API ์ค์ ์ ๋ฐ๋ฅธ ๊ฐ Step ์ค์
tasklet -> step -> Job ์์ผ๋ก ๋ง๋ค์ด์ง
'๐จโ๐ป Web Development > Spring - Batch' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Batch] 2. ์คํ๋ง ๋ฐฐ์น ์์ (0) | 2023.11.20 |
---|---|
[Spring Batch] 0. ์๋ก & 1. ์คํ๋ง ๋ฐฐ์น ์๊ฐ (1) | 2023.11.13 |
์ต๊ทผ๋๊ธ