2.Spring Batch 시작하기
Spring Batch

2.Spring Batch 시작하기

반응형

프로젝트 환경 설정

  • 배치의 환경 설정을 하는 방법은 2가지가 있다.
    • Intelij를 활용한 프로젝트 구축
    • Intelij - new(상단 막대바 위치) - Spring Initilalizer(좌측 상태바 위치)

  • Spring Boot 기반 프로젝트를 생성하는 방법

💡 일반 Spring Boot 프로젝트가 있으면 아래의 코드만 dependency에 추가해주자

			<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>	
				<dependency>
            <groupId>org.springframework.batch</groupId>
            <artifactId>spring-batch-test</artifactId>
            <scope>test</scope>
        </dependency>

				//mysql, h2 connector
				<dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
  • 다음 작업을 위해서는 Docker 기반 Server를 Intelij와 연동해야한다.
  • 컨테이너 기반 Server를 사용하지 않고 Local Server를 사용해도 괜찮다.
  • 필자는 일단 앞으로의 예제를 컨테이너 Server 기반으로 테스트 작업을 진행하겠다.

💡 필자의 Docker 설치 정리글

Docker에서 동작하는 MySql을 Intelij와 연동하기

Spring Batch 예제 살펴보기

@EnableBatchProcessing이란?

  • 스프링 배치가 작동하기 위해 선언해야하는 어노테이션이다.
  • 스프링 배치는 4개의 설정 클래스를 실행시켜야만 초기화 및 실행 구성이 갖추어진다.
  • 스프링 부트 배치의 자동 설정 클래스가 실행되어 빈으로 등록된 모든 Job을 검색해서 초기화와 동시에 Job을 수행하도록 구성된다.

Spring Batch의 도메인

Job

  • 실행해야할 업무를 의미함

Step

  • 업무중에서 동작할 업무의 순서를 의미함

TASKLET이란

  • Step에서 동작할 실제 동작할 로직을 의미한다.
  • 기본값으로는 반복수행하도록 설정되어있다.
  • 반복 수행하도록 설정하고 싶지 않다면 RepeatStaus.FINISHED;
  • 반복 수행하도록 설정하고 싶다면 RepeatStatus.*CONTINUABLE*;

💡 아래 예제 코드를 살펴보며 실제로 동작해보고 코드를 분석해보자

@RequiredArgsConstructor
@Configuration
public class HelloJobConfiguration {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job helloJob(){
        return this.jobBuilderFactory.get("step2.job")
                .start(helloStep1())
                .next(helloStep2())
                .build();
    }

    @Bean
    public Step helloStep1(){
        return stepBuilderFactory.get("helloStep1")
                /**
                 * 이론에서 말했던 Tasklet 영역이다.
                 * 기본값 으로는 무한 반복이 기본값이다.
                 */
                .tasklet(new Tasklet() {
                    /**
                     * RepeatStatus가
                     * 객체의 이름이 RepeatStatus것 만큼 이 안에서 동작할 step이 반복적으로 동작할 지 아니면 한 번만 동작할 지를 결정한다.
                     * execute의 반환값이 null이라면 한 번 실행되고 정지된다.
                     * RepeatStatus와 같은 의미를 가지는것이 RepeatStatus.FINISHED이다.
                     * 반복적으로 값을 동작시키고 싶다면 RepeatStatus.CONTINUABLE로 설정하면 된다.
                     */
                    @Override
                    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("=================================");
                        System.out.println(" >> Step1 has executed");
                        System.out.println("=================================");
                        return RepeatStatus.CONTINUABLE;
                    }
                }).build();
    }

    @Bean
    public Step helloStep2(){
        return stepBuilderFactory.get("helloStep2")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("=================================");
                    System.out.println(" >> Step2 has executed");
                    System.out.println("=================================");
                    return RepeatStatus.FINISHED;
                }).build();
    }
}
  • @Configuration 선언
    • 하나의 배치 Job 을 정의하고 빈 설정
  • JobBuilderFactory
    • Job 을 생성하는 빌더 팩토리
  • StepBuilderFactory
    • Step 을 생성하는 빌더 팩토리
  • Job
    • helloJob 이름으로 Job 생성
  • Step
    • helloStep 이름으로 Step 생성
  • Tasklet
    • Step 안에서 단일 태스크로 수행되는 로직 구현

중간 정리

💡 Job이 구동되면 Step을 실행하고 Step이 구동되면 Tasklet이 실행된다.

Spring 배치 DB 스키마 생성

  • 스프링 배치는 실행하는 동안의 데이터와 관리를 위한 목적으로 여러 도메인들의 정보를 저장, 업데이트, 조회할 수 있는 DB 스키마를 제공한다.
  • 이를 통해 저장된 정보를 기반으로 과거, 현재 실행에 대한 정보를 확인하고 작업들에 대한 성공 실패여 부 등을 관리하여 배치 작업을 진행하는 동안의 문제 발생시 빠른 대처가 가능하다.
  • DB와 연동할 경우 필수적으로 메타 테이블이 생성 되어야 한다.

💡 DB 스키마의 위 • /org/springframework/batch/core/schema-*.sql에 위치한다.

스키마 생성 방법

  • 수동 생성
    • 직접 쿼리를 작성해서 DB 스키마를 작성하는 방법이다.
  • 자동 생성
    • spring.batc.jdbc.initalize-schema 설정을 통해 자동으로 DB 스키마를 생성할 수 있다.
      • 생성 옵션
      • ALWAYS : 스크립트 항상 실행, RDBMS 설정이 되어 있을 경우 내장 DB 보다 우선적으로 실행
      • EMBEDDED : 내장 DB일 때만 실행되며 스키마가 자동 생성됨, 기본값
      • NEVER : 스크립트를 항상 실행 안한다. 내장 DB 일경우 스크립트가 생성이 안되기 때문에 오류 발생하므로 운영에서 수동으로 스크립트 생성 후 설정하는 것을 권장한다.

DB 스키마 종류

  • 총 6개의 테이블로 이루어져 있으며 Job관련 테이블과 Step 관련 테이블로 이루어져 있다.

Job 관련 테이블

  • BATCH_JOB_INSTANCE
    • Job 이 실행될 때 JobInstance 정보가 저장되며 job_name과 job_key를 키로 하여 하나의 데이터가 저장 동일한 job_name 과 job_key 로 중복 저장될 수 없다

  • BATCH_JOB_EXECUTION
    • job 의 실행정보가 저장되며 Job 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리

  • BATCH_JOB_EXECUTION_PARAMS
    • Job과 함께 실행되는 JobParameter 정보를 저장

  • BATCH_JOB_EXECUTION_CONTEXT
    • Job 의 실행동안 여러가지 상태정보, 공유 데이터를 직렬화 (Json 형식) 해서 저장
    • Step 간 서로 공유 가능함

Step 관련 테이블

  • BATCH_STEP_EXECUTION
    • Step 의 실행정보가 저장되며 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리

반응형

'Spring Batch' 카테고리의 다른 글

6.Spring Batch의 Flow  (1) 2024.11.07
5.Spring Batch의 Step  (0) 2024.11.07
4.Spring Batch의 Job  (0) 2024.11.06
3.Spring Batch 도메인 이해하기  (0) 2024.11.02
1.Spring Batch 소개  (0) 2022.07.04