[Spring Batch 2편] SpringBatch 실행법 & 아키텍처 알아보기

송하연·2024년 10월 15일
0
post-thumbnail

이전 글 - 스프링 배치 기초 세팅

Tasklet을 만들어 SpringBatch 실행해보기

오늘의 실습
1. Tasklet 구현체를 생성한다.
2. @Configuration을 통해서 생성할 배치 빈을 스프링에 등록한다.
3. Job, Step 을 생성하고 빈에 등록한다.
4. 실행 결과를 확인한다.

1. Tasklet 구현체 생성

GreetingTask.java 클래스를 만들어 아래의 코드를 작성해주었다.

package com.example.springbatch;


import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.InitializingBean;

@Slf4j
public class GreetingTask implements Tasklet, InitializingBean {
    @Override
    public RepeatStatus execute(StepContribution contribution,
                                ChunkContext chunkContext) throws Exception {
        log.info("------------------ Task Execute -----------------");
        log.info("GreetingTask: {}, {}", contribution, chunkContext);

        return RepeatStatus.FINISHED;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("----------------- After Properites Sets() --------------");
    }
}

1. 클래스 정의

GreetingTask는 Spring Batch의 Tasklet 인터페이스와 Spring의 InitializingBean 인터페이스를 구현한 클래스이다.

  • Tasklet : Spring Batch의 작업(Task)을 정의하는 인터페이스
  • InitializingBean: 스프링 빈의 생명주기에서 빈이 모든 프로퍼티 설정을 마치면 호출되는 afterPropertiesSet 메서드를 구현할 수 있도록 하는 인터페이스

2. execute 메서드

Tasklet 인터페이스에 정의된 메서드로 execute 메서드 안에서 태스크가 실행된다.

execute 메서드의 파라미터
StepContribution: 현재 실행 중인 스텝에 대한 상태를 담고 있는 객체
ChunkContext: 청크(작업의 묶음)에 대한 정보를 담고 있는 객체

execute 메서드의 반환값 => RepeatStatus

  • FINISHED: Tasklet이 종료되었음을 나타낸다.
  • CONTINUABLE: 계속해서 태스크를 수행하도록 한다.
  • continueIf(condition): 종료/지속을 결정한다.

3. afterPropertiesSet 메서드

InitializingBean 인터페이스에 정의된 메서드로 스프링 빈이 생성되고 모든 설정이 완료된 후 자동으로 호출되는 역할을 한다.

2. @Configuration을 통해서 생성할 배치 빈을 스프링에 등록

BasicTaskJobConfiguration.java 클래스를 만들어 스프링 컨테이너에 배치 관련 빈을 등록해주었다.

package com.example.springbatch.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Configuration
public class BasicTaskJobConfiguration {

// 3번에서 여기에 코드 작성할거임
    
}

BasicTaskJobConfiguration은 Spring Batch에서 배치 작업(Task)을 설정하기 위해 사용되는 클래스이다

3. Job, Step 을 생성하고 빈에 등록

이제 BasicTaskJobConfiguration클래스 안에 Job과 Step을 생성하고 빈으로 등록해보자.

package com.example.springbatch.config;

import com.example.springbatch.GreetingTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

@Slf4j
@Configuration
public class BasicTaskJobConfiguration {
    @Autowired
    PlatformTransactionManager transactionManager;

    @Bean
    public Tasklet greetingTasklet() {
        return new GreetingTask();
    }
    @Bean
    public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
        log.info("------------------ Init myStep -----------------");

        return new StepBuilder("myStep", jobRepository)
                .tasklet(greetingTasklet(), transactionManager)
                .build();
    }

    @Bean
    public Job myJob(Step step, JobRepository jobRepository) {
        log.info("------------------ Init myJob -----------------");
        return new JobBuilder("myJob", jobRepository)
                .incrementer(new RunIdIncrementer())
                .start(step)
                .build();
    }
}

1. step() 메서드

Spring Batch의 Step을 정의하는 메서드이다.
Step은 배치 작업에서 실제 실행되는 하나의 단계를 의미하며, 이 단계에서 Tasklet을 실행하게된다.

  • 스프링 배치는 보통 데이터소스와 함께 작업하므로 파라미터 값으로PlatformTransactionManager가 필요하다.
  • StepBuilder를 통해 Step을 생성하며, myStep이라는 이름을 부여, 이를 jobRepository에 등록한다.

2. myJob() 메서드

Spring Batch의 Job을 정의하는 메서드이다.
Job은 배치 작업의 전체적인 흐름을 관리하는 역할을 한다.

  • JobBuilder를 동해서 이름이 myJob인 잡을 생성한다.
  • RunIdIncrementer를 사용하여 매번 실행될 때마다 고유의 실행 ID를 부여하여 유니크한 잡을 실행할 수 있게한다.
  • start(step)은 위에서 정의한 Step을 Job의 시작 단계로 설정한다.

4. 스프링부트 어플리케이션 실행

이제 스프링부트 어플리케이션을 시작해보자!

afterPropertySet(), Job, Step, Tasklet 순으로 실행됨을 확인할 수 있다.

Spring Batch 아키텍처 알아보기

Spring Batch는 다음과 같은 아키텍처를 가진다.

Spring Batch 아키텍처 구성 요소

JobLauncher: 배치 작업을 시작하는 주체로 사용자가 작업을 실행하고자 할 때, JobLauncher를 통해 요청한다.

Job: 배치 작업의 전체 흐름을 정의하는 단위로 여러 개의 Step으로 구성될 수 있다.

Step: Job의 하위 단위로, 실제 배치 처리를 수행하는 단위이다.
각각의 Step은 ItemReader, ItemProcessor, ItemWriter를 사용하여 데이터를 처리한다.

ItemReader: 소스 데이터(예: 데이터베이스, 파일 등)를 읽어오는 역할
ItemProcessor: ItemReader에서 읽은 데이터를 처리하는 역할
ItemWriter: 처리된 데이터를 실제로 출력하는 역할

JobRepository : 배치 작업의 메타데이터 및 실행 정보를 저장하고 관리한다.

Spring Batch 처리 흐름

  1. JobScheduler가 배치를 트리거하면 JobLauncher가 실행
  2. JobLauncherJobExecution을 통해 Job을 실행하고 Execution Context 정보를 사용
  3. Job은 정의된 Step을 실행하며, StepExecution이 수행되고 Execution Context 정보가 전달
  4. Step은 Chunk 모델로 처리
    • ItemReader가 데이터 읽기
    • ItemProcessor가 데이터 처리
    • ItemWriter가 결과 기록

Job 정보의 흐름

  1. JobLauncher는 JobRepository에 JobInstance 정보를 저장
  2. JobExecution이 Job을 수행하고 JobRepository에 실행 정보를 저장
  3. JobStep은 JobRepository에 I/O 레코드와 상태정보를 저장
  4. Job이 완료되면 완료 정보를 JobRepository에 저장

Spring Batch 저장 정보

JobInstance : Job의 이름과 파라미터를 정의하고 중단 시 다음 실행을 지원

JobExecution: Job의 물리적 실행을 나타내며, JobInstance와 1(JobInstance):N(JobExecution) 관계

ExecutionContext: JobExecution 에서 처리 단계와 같은 메타 정보 공유

StepExecution: Step의 물리적 실행을 나타내며, Job과 1(Job):N(Step) 관계

JobRepository: 배치 실행 정보와 결과를 데이터베이스에 저장

마무리

지금까지 Tasklet을 만들어 SpringBatch 실행하는 방법과 SpringBatch 아키텍처에 대해 알아보았다.

참고글 - [SpringBatch 연재 02] SpringBatch 코드 설명 및 아키텍처 알아보기
깃허브 - https://github.com/hysong4u/springbatch

profile
개발 기록 끄적끄적✏️ #백엔드개발자

0개의 댓글