본문 바로가기
백엔드

배치에서 tasklet과 chunk 비교

by 천검 2024. 11. 21.
반응형

늘 그랬듯이 tasklet과 chunk에 대해 Copilot에 물어본다.

배치 처리에서 tasklet과 chunk는 중요한 개념이야. 여기 간단하게 설명할게:

Tasklet
• 작은 작업 단위: Tasklet은 배치 작업을 수행하는 작은 단위를 의미해. 한 작업이 더 작은 여러 개의 tasklet으로 나뉘어서 처리될 수 있어.
• 독립적 수행: 각각의 tasklet은 다른 tasklet들과 독립적으로 수행될 수 있고, 결과적으로 병렬 처리를 가능하게 만들어줘.
• 유연성: 여러 작업 단위로 나눔으로써 작업을 더 유연하고 효율적으로 관리할 수 있어.

Chunk
• 데이터 묶음: Chunk는 데이터의 작은 묶음을 의미해. 예를 들어, 큰 데이터 세트를 더 작은 청크로 나누어 처리할 수 있어.
• 처리 효율성: 청크 단위로 나누어서 처리하면 메모리 사용을 최적화할 수 있고, 각 청크를 순차적으로 혹은 병렬로 처리할 수 있어.
• 기록 관리: 청크 단위로 작업을 나누면 각 청크의 처리 상태를 쉽게 관리하고 모니터링할 수 있어.

이 개념들은 배치 처리 시스템에서 작업을 더 효율적으로 관리하고, 병렬 처리와 같은 성능 최적화를 가능하게 해. 이해를 돕기 위해 더 많은 정보나 구체적인 예시가 필요하면 언제든 말해줘! 😊

 

비슷한데 tasklet은 독립단위 작업, chunk는 나눠서 하는 작업인거 같다. 예를 들어달라고 했다.

 

물론이야! 다음은 배치 처리에서 tasklet과 chunk를 사용하는 예시야:

Tasklet 예시
한 은행에서 고객 데이터를 갱신하는 배치 작업을 수행한다고 가정해보자. 이 작업을 더 작은 tasklet으로 나누어서 처리할 수 있어:
1. 고객 데이터 읽기 Tasklet: 고객 데이터를 데이터베이스에서 읽어오는 tasklet.
2. 고객 데이터 검증 Tasklet: 읽어온 데이터를 검증하는 tasklet. 예를 들어, 데이터의 형식이 올바른지 확인.
3. 고객 데이터 업데이트 Tasklet: 검증된 데이터를 새로운 값으로 업데이트하는 tasklet.
4. 결과 저장 Tasklet: 업데이트된 데이터를 다시 데이터베이스에 저장하는 tasklet.

각 tasklet은 독립적으로 수행될 수 있으며, 병렬로 실행하여 전체 작업의 속도를 높일 수 있어.

Chunk 예시
한 전자 상거래 회사에서 주문 데이터를 처리하는 배치 작업을 수행한다고 가정해보자. 이 작업을 청크로 나누어서 처리할 수 있어:
1. 데이터 나누기: 전체 주문 데이터를 일정한 크기의 청크로 나눔. 예를 들어, 한 번에 1000개의 주문을 하나의 청크로 묶음.
2. 청크 처리: 각 청크를 독립적으로 처리함. 예를 들어, 1000개의 주문을 읽어서 각 주문에 대한 처리를 진행.
o 청크 1: 주문 1~1000 처리
o 청크 2: 주문 1001~2000 처리
o 청크 3: 주문 2001~3000 처리
3. 결과 저장: 각 청크가 처리된 후, 결과를 데이터베이스에 저장.

이렇게 하면 메모리 사용을 최적화하고, 여러 청크를 병렬로 처리하여 작업의 효율성을 높일 수 있어.

이해가 잘 되었기를 바라! 더 궁금한 점이 있으면 언제든지 물어봐. 😊

 

근데 얘 지금 어느덧 반말중...

스프링 배치 구현 예를 들어달라고 했다.

스프링 배치(Spring Batch)는 배치 처리 작업을 쉽게 구현할 수 있도록 도와주는 프레임워크야. Tasklet과 Chunk 기반의 배치 작업을 예시로 설명할게.

Tasklet 기반 배치 작업 예시
Tasklet을 사용한 배치 작업은 단일 작업을 독립적으로 수행하는 방식이야.

 

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job")
                .start(step())
                .build();
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("step")
                .tasklet(tasklet())
                .build();
    }

    @Bean
    public Tasklet tasklet() {
        return (contribution, chunkContext) -> {
            System.out.println("Tasklet executed!");
            return RepeatStatus.FINISHED;
        };
    }
}
Chunk 기반 배치 작업 예시
Chunk 기반 배치 작업은 데이터를 청크 단위로 나누어 처리하는 방식이야.
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class ChunkBatchConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("chunkJob")
                .start(step())
                .build();
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("chunkStep")
                .<String, String>chunk(10)
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .build();
    }

    @Bean
    public ItemReader<String> reader() {
        return new ItemReader<String>() {
            private String[] input = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};

            private int index = 0;

            @Override
            public String read() {
                if (index < input.length) {
                    return input[index++];
                } else {
                    return null;
                }
            }
        };
    }

    @Bean
    public ItemProcessor<String, String> processor() {
        return item -> item.toUpperCase();
    }

    @Bean
    public ItemWriter<String> writer() {
        return items -> items.forEach(System.out::println);
    }
}

 

예시 설명

1. Tasklet 기반 배치 작업: tasklet() 메서드에서 작은 작업을 정의하고, Step과 Job을 구성해. 이 예시에서는 단순히 "Tasklet executed!"라는 메시지를 출력해.

2. Chunk 기반 배치 작업: ItemReader, ItemProcessor, ItemWriter를 사용하여 데이터를 읽고, 처리하고, 쓰는 작업을 정의해. 여기서는 문자열 배열을 읽어서 대문자로 변환한 후 출력해.

스프링 배치를 이용하면 배치 작업을 쉽게 구현하고 관리할 수 있어. 더 궁금한 점이 있으면 언제든 물어봐! 😊

 

오늘은 여기까지

반응형

댓글