실전코드/Spring, Java

[Spring Batch] 스프링 배치 프로세싱 개념

행수쌤 2023. 8. 19. 17:00
728x90
반응형

스프링 배치란?

스프링 배치(Spring Batch)는 스프링 프레임워크를 기반으로 한 대규모 데이터 처리 및 배치 작업을 위한 프레임워크입니다. 주로 대량의 데이터를 처리하거나 반복적인 작업을 효율적으로 처리하는 데 사용됩니다. 스프링 배치는 데이터 추출, 변환, 로딩(ETL) 프로세스를 관리하며, 작업의 실패 처리, 병렬 처리, 스킵 로직 등을 지원하여 안정적이고 확장 가능한 배치 처리를 가능하게 합니다.

스프링 배치의 주요 구성 요소와 개념은 다음과 같습니다:

1 Job: 배치 작업의 최상위 개념으로, 하나 이상의 스텝으로 구성됩니다. 일련의 스텝을 실행하고 모니터링하는 작업 단위입니다.

2. Step: Job 내에서 실행되는 단위 작업입니다. 하나의 스텝은 데이터 추출, 변환, 로딩 등을 수행할 수 있으며, 각 스텝은 다수의 처리 단계로 나뉩니다.

3. ItemReader: 데이터 소스로부터 데이터를 읽어오는 역할을 합니다. 파일, 데이터베이스, 메시지 큐 등 다양한 소스에서 데이터를 읽어올 수 있습니다.

4. ItemProcessor: 읽어온 데이터를 변환하거나 가공하는 역할을 합니다. 데이터의 유효성 검사, 변환 작업 등을 수행할 수 있습니다.

5. ItemWriter: 처리한 데이터를 목적지에 저장하는 역할을 합니다. 데이터베이스에 저장하거나 파일로 출력하는 등의 작업을 할 수 있습니다.

6. JobRepository: 배치 작업의 실행 상태와 관련된 메타데이터를 저장합니다. 이를 통해 작업의 재시작, 롤백 등을 관리할 수 있습니다.

7. JobLauncher: Job을 실행하는 역할을 합니다. 새로운 배치 작업을 시작하거나 이전에 실행 중이던 작업을 재시작할 때 사용됩니다.

스프링 배치의 구성은 XML 설정 또는 자바 기반 설정을 사용하여 정의할 수 있습니다. 이를 통해 배치 작업의 실행 흐름, 스텝 간의 순서, 데이터 소스 등을 정의할 수 있습니다.

스프링 배치는 대용량 데이터 처리 작업에 유용하며, 일괄 처리가 필요한 시나리오에 적합한 프레임워크입니다. 데이터 품질 향상, 일관성 유지 등의 목적으로 배치 작업을 구성하고 실행할 수 있습니다.

 

Job과 JobBuilderFactory

JobBuilderFactory는 스프링 배치에서 잡(Job)을 생성하고 구성하기 위한 빌더를 제공하는 클래스입니다. 이 클래스의 메서드들을 사용하여 잡을 생성하고 설정할 수 있습니다. 여기에서는 JobBuilderFactory의 대표적인 메서드 몇 가지에 대해 설명하겠습니다.

1. job(String name):
이 메서드는 새로운 잡을 생성합니다. name 파라미터는 생성되는 잡의 이름을 나타냅니다. 생성한 잡은 JobBuilder 인스턴스로 반환되며, 여기에 다양한 설정을 추가할 수 있습니다.

Job myJob = jobBuilderFactory.get("myJobName")
    // 다양한 설정 추가
    .build();


2. incrementer(…):
배치 잡의 실행을 추적하기 위해 사용되는 JobParametersIncrementer를 설정합니다. 이 메서드를 사용하여 잡이 실행될 때마다 다른 Job Parameters를 생성하여 각 실행을 구별할 수 있습니다.

Job myJob = jobBuilderFactory.get("myJobName")
    .incrementer(new RunIdIncrementer()) // 실행마다 새로운 Job Parameters 생성
    // 다양한 설정 추가
    .build();


3. start(Step step):
잡의 실행 흐름을 시작하는 스텝을 설정합니다. 이 메서드를 사용하여 잡 실행이 시작될 때 어떤 스텝을 먼저 실행할지 결정할 수 있습니다.

Job myJob = jobBuilderFactory.get("myJobName")
    // 다양한 설정 추가
    .start(myStep) // 실행 흐름을 myStep에서 시작
    .next(anotherStep) // myStep 실행 후 anotherStep으로 이동
    .build();


4. listener(…):
잡 실행에 대한 리스너를 설정합니다. 잡의 다양한 단계에서 발생하는 이벤트에 대한 처리를 추가할 수 있습니다.

Job myJob = jobBuilderFactory.get("myJobName")
    .listener(myJobExecutionListener) // 잡 실행 리스너 설정
    // 다양한 설정 추가
    .build();


5. validator(…):
잡의 구성을 검증하기 위한 JobParametersValidator를 설정합니다. 잡이 실행될 때 제공된 Job Parameters의 유효성을 검사하는 역할을 합니다.

Job myJob = jobBuilderFactory.get("myJobName")
    .validator(myJobParametersValidator) // 잡 파라미터 유효성 검사기 설정
    // 다양한 설정 추가
    .build();


위의 메서드들을 조합하여 스프링 배치 잡을 생성하고 설정할 수 있습니다. 각 메서드는 잡의 특정 부분을 다루는 역할을 하며, 이들을 조합하여 복잡한 배치 작업을 구성할 수 있습니다.

 

Step과 StepBuilderFactory

StepBuilderFactory는 스프링 배치에서 스텝(Step)을 생성하고 구성하기 위한 빌더를 제공하는 클래스입니다. 이 클래스의 메서드들을 사용하여 스텝을 생성하고 설정할 수 있습니다. 아래에는 StepBuilderFactory의 대표적인 메서드 몇 가지를 설명하겠습니다.

1. step(String name):
이 메서드를 사용하여 새로운 스텝을 생성합니다. name 파라미터는 생성되는 스텝의 이름을 나타냅니다. 생성한 스텝은 StepBuilder 인스턴스로 반환되며, 여기에 다양한 설정을 추가할 수 있습니다.

Step myStep = stepBuilderFactory.get("myStepName")
    // 다양한 설정 추가
    .build();


2. chunk(int chunkSize):
스텝의 처리 단위(chunk) 크기를 설정합니다. chunkSize 파라미터는 한 번의 트랜잭션으로 처리될 아이템의 개수를 지정합니다. 스텝의 실행 시, 지정한 크기만큼의 아이템이 아이템 리더에서 읽어와서 프로세싱 후 아이템 라이터로 저장됩니다.

Step myStep = stepBuilderFactory.get("myStepName")
    .<InputType, OutputType>chunk(chunkSize) // 아이템 처리 단위를 설정
    // 다양한 설정 추가
    .build();


3. reader(ItemReader reader):
스텝의 아이템 리더(ItemReader)를 설정합니다. 아이템 리더는 스텝 실행 시 데이터를 읽어오는 역할을 합니다.

Step myStep = stepBuilderFactory.get("myStepName")
    .<InputType, OutputType>chunk(chunkSize)
    .reader(myItemReader) // 아이템 리더 설정
    // 다양한 설정 추가
    .build();


4. processor(ItemProcessor processor):
스텝의 아이템 프로세서(ItemProcessor)를 설정합니다. 아이템 프로세서는 읽어온 데이터를 변환하거나 가공하는 역할을 합니다.

Step myStep = stepBuilderFactory.get("myStepName")
    .<InputType, OutputType>chunk(chunkSize)
    .reader(myItemReader)
    .processor(myItemProcessor) // 아이템 프로세서 설정
    // 다양한 설정 추가
    .build();


5. writer(ItemWriter writer):
스텝의 아이템 라이터(ItemWriter)를 설정합니다. 아이템 라이터는 프로세싱한 데이터를 저장하거나 출력하는 역할을 합니다.

Step myStep = stepBuilderFactory.get("myStepName")
    .<InputType, OutputType>chunk(chunkSize)
    .reader(myItemReader)
    .processor(myItemProcessor)
    .writer(myItemWriter) // 아이템 라이터 설정
    // 다양한 설정 추가
    .build();


위의 메서드들을 사용하여 스텝을 구성하고 생성할 수 있습니다. 이를 통해 각 스텝이 처리할 아이템의 단위, 데이터 리더, 프로세서, 라이터 등을 설정할 수 있습니다.

 

배치 실행

스프링 배치에서 특정 Job을 외부에서 실행시키는 방법은 JobLauncher를 사용하는 것입니다. JobLauncher는 잡(Job)을 실행하는 역할을 합니다. 외부에서 Job을 실행시키려면 다음 단계를 따를 수 있습니다:

1. Job과 JobLauncher 설정:
먼저 스프링 배치의 Job과 JobLauncher를 설정해야 합니다. 이를 위해 ApplicationContext에서 Job과 JobLauncher 빈을 가져와야 합니다.

@Autowired
private Job myJob; // 실행시킬 Job 빈

@Autowired
private JobLauncher jobLauncher; // Job을 실행시키는 빈


2. JobParameters 생성:
Job을 실행할 때 필요한 파라미터를 JobParameters로 생성해야 합니다. JobParameters는 Job의 실행을 고유하게 식별하는 데 사용됩니다. 예를 들어, 같은 Job을 여러 번 실행하더라도 파라미터 값이 다르다면 각 실행은 별개로 추적됩니다.

JobParameters jobParameters = new JobParametersBuilder()
    .addString("parameterName", "parameterValue")
    // 다른 파라미터 추가
    .toJobParameters();


3. Job 실행:
JobLauncher를 사용하여 Job을 실행합니다. 생성한 JobParameters를 전달하여 실행하고자 하는 Job을 실행시킵니다.

JobExecution jobExecution = jobLauncher.run(myJob, jobParameters);

전체 코드 예제는 다음과 같습니다:

@Autowired
private Job myJob; // 실행시킬 Job 빈

@Autowired
private JobLauncher jobLauncher; // Job을 실행시키는 빈

public void runMyJob() {
    try {
        JobParameters jobParameters = new JobParametersBuilder()
            .addString("parameterName", "parameterValue")
            // 다른 파라미터 추가
            .toJobParameters();

        JobExecution jobExecution = jobLauncher.run(myJob, jobParameters);
        // jobExecution에서 실행 결과와 관련된 정보 확인 가능
    } catch (JobExecutionException e) {
        e.printStackTrace();
        // 실행 중 예외 처리
    }
}

위의 코드 예제에서 runMyJob() 메서드를 호출하면 지정한 파라미터와 함께 Job이 실행됩니다. 이렇게 외부에서 Job을 실행시키는 방법을 사용하면 프로그래밍 방식으로 배치 작업을 트리거하고 모니터링할 수 있습니다.

728x90
반응형