์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- aws ์ฟ ํฐ
- Kafka
- ์ ํจ์ค ๋น๋ ์ค๋ฅ
- docker compose
- ์ ํจ์ค ์ค์ผ์ค๋ฌ
- s3 ์ด๋ฏธ์ง ๋ค์ด๋ก๋
- s3 log ์ ์ฅ
- ํ์ดํผ๋ฐ์ด์
- docker-compose kafka
- ํ๋ก๊ทธ๋๋จธ์ค ํฉ์นํ์์๊ธ
- private subnet ec2 ๋ก์ปฌ ์ ์
- prod docker-compose
- s3 ์ด๋ฏธ์ง ์ ์ฅ
- jvm ๋ฐ๋ฐ๋ฅ๊น์ง ํํค์น๊ธฐ
- docker ps -a
- Entity
- aws saa ํฉ๊ฒฉ
- Codedeploy ์ค๋ฅ
- docker
- ์๋ฐ
- ๋ค์ค ์ปจํ ์ด๋
- ํ๋ก๊ทธ๋๋จธ์ค ์ปฌ๋ฌ๋ง๋ถ
- ํ๋ก๊ทธ๋๋จธ์ค
- nGrinder
- ์คํํ๋ ๋ฏธ์ค
- JPA
- redis ํ ์คํธ์ฝ๋
- ์๋ฒ ํฐ์ง๋ ๋์ปค ์ฌ์คํ
- redis ์กฐํ
- AWS Certified Solutions Architect - Associate
- Today
- Total
๐๐ข๐๐ โ๐๐๐ ๐๐๐ก๐๐ ๐๐๐๐โง
[Spring Batch] Tasklet, Chunk ๋ณธ๋ฌธ
[Spring Batch] Tasklet, Chunk
๐คRyusun๐ค 2023. 6. 22. 21:08์คํ๋ง ๋ฐฐ์น ๋์ ๊ตฌ์กฐ
step์์ tasklet ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ItemReader/ItemProcessor/ItemWriter ๋จ์๋ก Chunk ์งํฅ ํ๋ก์ธ์ฑ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
Tasklet ๋ฐฉ์
- ๋จ๊ณ ๋ด์์ ๋จ์ผ ํ์คํฌ๋ฅผ ์ํํ๊ธฐ ์ํ ๊ฒ์ผ๋ก ์์์ Step์ ์คํํ ๋ ์ฝ๊ธฐ/์ฒ๋ฆฌ/์ฐ๊ธฐ๋ฅผ ํ๋์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์
- ์ฆ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ณผ์ ์ด tasklet์์์ ํ๋ฒ์ ์ด๋ค์ง๋ค
- Job ๊ตฌ์ฑ ํด๋์ค ์ธ๋ถ์ tasklet ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์ฐธ์กฐํ๋ ๋ฐฉ์์ด๋ค.
- Step์์ chunk() ๋์ tasklet()์ ์ฌ์ฉํ๋ค.
- tasklet์ ์ธ๋ถ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ tasklet ์์ ์ ์ ์ํ๋ค.
- tasklet ์์
์ ์ ์ํ ์ธ๋ถ ํด๋์ค์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Tasklet์ implements ๋ฐ์์ ๊ตฌํ์ ํด์ผํ๋ค. ๊ทธ์ ๋ฐ๋ผ execute ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- execute ๋ฉ์๋ ์ธ์ contribution/chunkContext
- contribution - ํ์ฌ ๋จ๊ณ ์คํ์ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ๋ค์ ์ ๋ฌ๋๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ
- chunkContext - ์คํ ์์ ์ Job ์ํ ์ ๊ณต. ํธ์ถ ๊ฐ์๋ ๊ณต์ ๋์ง๋ง ์ฌ์์ ๊ฐ์๋ ๊ณต์ ๋์ง ์๋๋ค.
*tasklet ํด๋์ค๊ฐ ์ฌ์ฌ์ฉ์ด ๋ ์ ์๋ ์ํฉ์ ์ ํฉํ๋ค.
- .๋ฐฐ์น ์ฒ๋ฆฌ๊ณผ์ ์ด ์ฌ์ด ๊ฒฝ์ฐ ์ฝ๊ฒ ์ฌ์ฉ๋๋ฉฐ, ๋๋์ฒ๋ฆฌ ๊ฒฝ์ฐ ๋ ๋ณต์กํด์ง ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด tasklet์ Job ๊ตฌ์ฑ ํด๋์ค ๋ด๋ถ์ tasklet ๊ตฌํ๋ถ๋ฅผ ๋ฃ์ด์ ํ๋์ ํด๋์ค๋ก ํ๋์ ์ ๋ฌด๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ด๋ค.
Chunk ๋ฐฉ์
- Chunk ๊ธฐ๋ฐ : ํ๋์ ํฐ ๋ฉ์ด๋ฆฌ๋ฅผ n๊ฐ์ฉ ๋๋ ์ ์คํ
- Chunk ๊ธฐ๋ฐ Step์ ItemReader, ItemProcessor, ItemWriter๊ฐ ์๋ค.
- ItemReader๋ ๋ฐฐ์น ์ฒ๋ฆฌ ๋์ ๊ฐ์ฒด๋ฅผ ์ฝ์ด ItemProcessor ๋๋ ItemWriter์๊ฒ ์ ๋ฌํ๋ค.
- ์๋ฅผ ๋ค๋ฉด, ํ์ผ ๋๋ DB์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค.
- ItemProcessor๋ input ๊ฐ์ฒด๋ฅผ output ๊ฐ์ฒด๋ก filtering ๋๋ processing ํด ItemWriter์๊ฒ ์ ๋ฌํ๋ค.
- ์๋ฅผ ๋ค๋ฉด, ItemReader์์ ์ฝ์ ๋ฐ์ดํฐ๋ฅผ ์์ ๋๋ ItemWriter ๋์์ธ์ง filtering ํ๋ค.
- ItemProcessor๋ optional ํ๋ค.
- ItemProcessor๊ฐ ํ๋ ์ผ์ ItemReader ๋๋ ItemWriter๊ฐ ๋์ ํ ์ ์๋ค.
- ItemWriter๋ ๋ฐฐ์น ์ฒ๋ฆฌ ๋์ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ์๋ฅผ ๋ค๋ฉด, DB update๋ฅผ ํ๊ฑฐ๋, ์ฒ๋ฆฌ ๋์ ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ ๋ณด๋ธ๋ค.
Chunk ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ์ฒ๋ฆฌ
// step๋ฅผ chunk๋ก ์์ฑํด๋ณด๊ธฐ
@Bean
public Step chunkBaseStep(){
return stepBuilderFactory.get("chunkBaseStep")
.<String, String> chunk(10)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.build();
}
private ItemWriter<String> itemWriter() {
return items -> log.info("chunk item size: {}", items.size());
}
private ItemProcessor<String, String> itemProcessor() {
//return ๊ฐ์ด null์ด๋ฉด wrtier๋ก ๋์ด๊ฐ์ง์๋๋ค.
return item -> item + "spring batch";
}
private ItemReader<String> itemReader() {
//ListItemReader๋ ์คํ๋ง์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต. ๋ฆฌ์คํธ๋ฅผ ๋ฐ์์100๊ฐ์ readํ๋ค.
return new ListItemReader<>(getItems());
}
chunksize๋ก ์ฒ๋ฆฌ ์, Step์ .chunksize(ํฌ๊ธฐ) ๋ก ์ ์ํ๋ฉฐ ์์ ์ฒ๋ฆฌ๋ ํ์
์ ์ ์ํ๋ค.
Processor์์๋ ์์ ๋งํ๊ฒ๊ณผ ๊ฐ์ด <reader์์ ์ฝ์ ํ์
, writer์ ๋ณด๋ผ ํ์
> ์ผ๋ก ์ ์ํด ์ฒ๋ฆฌํ๋ค.
<String,String>
์์ String์ reader์์ ์ฝ์ ๋ฐ์ดํฐ์ ํ์
์ด๊ณ
๋ค์ String์ writer์์ ๋ฐ์ ๋ฐ์ดํฐ์ ํ์
์ด๋ค.
๋ฐ๋ผ์ processor ์ฒ๋ฆฌ ํจ์์์๋ ์/๋ค ํ์
์ ๋ชจ๋ ์ ์ธํด์ ํํฐ๋ ๋ฐ์ดํฐ ๋ณํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
Reader์์๋ ๋ฆฌํด์ผ๋ก ์ ์ธํ ListItemReader๋ spring batch์์ ์ ๊ณตํ๋ item์ฒ๋ฆฌ ํด๋์ค์ด๋ค.
getItems์์ ๊ฐ์ ธ์จ List<String>์ LIstItemReader์์ ์์์ item๋ฐํํด์ค๋ค.
Writer์์๋ <String>์ด์ง๋ง, List<String>๋จ์๋ก ์ฒ๋ฆฌ๋๋ฉฐ,
items๋ฅผ ๋ฐ์ log๋ฅผ ์ถ๋ ฅํ๋ฉด chunksize=10๊ฐ์ฉ ์ฝ์ String์ด List๋ก ์ถ๋ ฅ๋๋ค.
Tasklet ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ์ฒ๋ฆฌ
@Bean
public Step taskBaseStep(){
return stepBuilderFactory.get("taskBaseStep")
.tasklet(this.tasklet())
.build();
}
// chunk ๋ฐฉ์์ tasklet ๋ฐฉ์์ผ๋ก ๊ตฌํ
private Tasklet tasklet() { //Tasklet ํด๋์ค ์ค์ , TaskletStepBuidler๋ฅผ ๋ฐํํ๋ค.
List<String> items = getItems();
return (contribution, chunkContext) -> {
StepExecution stepExecution = contribution.getStepExecution();
int chunkSize = 10;
int fromIndex = stepExecution.getReadCount();
int toIndex = fromIndex + chunkSize;
if (fromIndex >= items.size()){
return RepeatStatus.FINISHED;
}
List<String> subList = items.subList(fromIndex, toIndex);
log.info("chunk item size: {}", subList.size());
stepExecution.setReadCount(toIndex);
return RepeatStatus.CONTINUABLE;
//๋ง์ฝ fromIndex ๊ฐ 10์ด๊ณ , toIndex๊ฐ 10์ด๋ฉด ์ธ๋ฑ์ค10๋ฒ๋ถํฐ 10๊ฐ์ item๋ฅผ ๊บผ๋ผ์ ์๋ค๋๋ป
};
}
tasklet์ contributution์์ StepExecution ์ผ๋ก step์ด ์ผ๋ง๋ ์ฒ๋ฆฌ๋๊ณ ์๋์ง์ ์ ๋ณด๋ฅผ ์ ์ ์๋ค.
(chunksize๋ฅผ 10์ผ๋ก ์ ์ํ๊ณ readCount๋ก ํ์ด์ง์ ์ฒ๋ฆฌ)
๋น๊ต์ ๋๋ ๋ฐ์ดํฐ๋ chunk๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋๊ฒ ๋ ๊ฐ๋จํ๋ค.
์ฐธ์กฐ
https://choisblog.tistory.com/80
https://velog.io/@gkskaks1004/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98%EC%9D%98-Tasklet-%EB%B0%A9%EC%8B%9D%EA%B3%BC-Chunk-Tasklet-%EB%B0%A9%EC%8B%9D
'๐ฃ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐บ๐ถ๐ป๐ด๐ป > ๐๐ฉ๐ซ๐ข๐ง๐ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] RestTemplate, UriComponentsBuilder (0) | 2023.06.28 |
---|---|
[Spring Batch] JobInstance, JobParameter, JobExecution, JobScope (0) | 2023.06.23 |
[Spring] Batch (0) | 2023.06.21 |
[Spring] RestTemplate (0) | 2023.05.19 |
[Spring] MockWebServer (0) | 2023.05.17 |