[스프링 배치] 개요 및 아키텍처

조갱·2024년 9월 1일
0

스프링 배치

목록 보기
2/9

프로젝트 설정하기

의존성 설정

https://mvnrepository.com/artifact/org.springframework.batch/spring-batch-core

사용하는 빌드 툴에, 사용하고자 하는 버전을 프로젝트 의존성에 추가하자.

스프링 배치를 사용하기 위한 어노테이션

스프링 배치를 사용하기 위해서는 @EnableBatchProcessing 어노테이션을 적용해야 한다.

@SpringBootApplication
@EnableBatchProcessing
class SpringBatchApplication

fun main(args: Array<String>) {
    runApplication<SpringBatchApplication>(*args)
}

@EnableBatchProcessing 어노테이션

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({BatchConfigurationSelector.class})
public @interface EnableBatchProcessing {
    boolean modular() default false;
}

위 어노테이션을 보면, modular 라는 속성을 가진다. 기본값은 false 이다.

이 속성이 true 이면, ModularBatchConfiguration 이 실행되며,
false 이면 SimpleBatchConfiguration 이 실행된다.
(* Import 에 있는 BatchConfigurationSelector 코드를 보면 알 수 있다.)

modular 는 여러 Job을 동시에 실행하는 상황에서, 각 Job을 독립된 컨텍스트에서 실행하기 위해 설정한다.

일반적으로 SpringBatch 는 CronJob 과 같은 스케줄러와 함께 특정 Job만 실행시키기 때문에, modular 옵션을 사용할 일은 없다. 단지 '이런게 있다' 정도만 알아두자.

EnableBatchProcessing 어노테이션이 붙으면 실행되는 것

@EnableBatchProcessing 어노테이션이 붙으면 4가지 설정 클래스가 순서대로 실행된다.

  • SimpleBatchConfiguration
    (modular 속성에 따라 ModularBatchConfiguration 이 수행될 수도 있다.)
    • JobBuilderFactory 와 StepBuilderFactory 생성
    • 스프링 배치의 주요 구성 요소 생성 - 프록시 객체로 생성됨
  • BatchConfigurerConfiguration : BatchConfigurer 인터페이스를 구현하여 커스텀 가능
    • BasicBatchConfigurer
      • SimpleBatchConfiguration 에서 생성한 프록시 객체의 실제 대상 객체를 생성하는 설정 클래스
      • 빈으로 의존성 주입 받아서 주요 객체들을 참조해서 사용할 수 있다
    • JpaBatchConfigurer
      • JPA 관련 객체를 생성하는 설정 클래스
  • BatchAutoConfiguration
    • 스프링 배치가 초기화 될 때 자동으로 실행되는 설정 클래스
    • Job 을 수행하는 JobLauncherApplicationRunner 빈을 생성

간단한 배치 코드 작성하기

소스코드

@Configuration
class HelloJobConfiguration(
    val jobBuilderFactory: JobBuilderFactory,
    val stepBuilderFactory: StepBuilderFactory,
) {

    @Bean
    fun helloJob(): Job {
        return jobBuilderFactory.get("helloJob") // helloJob 이름으로 잡 생성
            .start(helloStep1())
            .next(helloStep2())
            .build()
    }

    @Bean
    fun helloStep1(): Step {
        return stepBuilderFactory.get("helloStep1") // helloStep1 이름으로 스텝 생성
            .tasklet { contribution, chunkContext ->
                println(" ============================")
                println(" >> Step1 executed")
                println(" ============================")
                RepeatStatus.FINISHED
            }.build()
    }

	@Bean
    fun helloStep2(): Step {
        return stepBuilderFactory.get("helloStep2") // helloStep2 이름으로 스텝 생성
            .tasklet { contribution, chunkContext ->
                println(" ============================")
                println(" >> Step2 executed")
                println(" ============================")
                RepeatStatus.FINISHED
            }.build()
    }
}

스프링 배치는 기본적으로 Job 생성 -> Step 실행 -> Tasklet 실행 순서로 이루어진다.
Job은 .next(Step) 메소드를 통해 여러 Step을 묶을 수 있다.

step에 정의된 tasklet은 기본적으로 무한반복이 된다.
그래서 tasklet 의 반환값을 RepeatStatus.FINISHED 로 설정함으로써 tasklet 실행이 완료되면 step을 끝낼 수 있다.

  • HelloJobConfiguration Class
    - BatchJob을 정의하고 @Configuration 어노테이션을 통해 Bean을 생성한다.
  • jobBuilderFactory
    - Job을 생성할 수 있는 빌더 팩토리이다.
  • stepBuilderFactory
    - Step을 생성할 수 있는 빌더 팩토리이다.
  • Job
    - 가장 큰 단위로, 여러개의 Step을 묶을 수 있다.
  • Step
    - 각 Step은 tasklet (실제 수행할 로직)을 정의할 수 있다.
  • tasklet
    - 실제 수행할 로직을 담는다.

DB 스키마

Schema-*.sql

스프링 배치는 Job, Step 을 관리하고, 히스토리를 저장하는 메타데이터 DB 테이블을 가진다.
DB와 연동된다면, 필수적으로 테이블이 DB에 존재해야 한다.

의존성을 추가하고, 의존성 내부를 살펴보면 schema-*.sql 파일을 확인할 수 있다.
DB 유형별로 제공하고 있으니 자신이 사용하는 DB의 쿼리를 확인해보자.

참고로, 본 포스팅에서는 mysql을 기준으로 한다.

스키마 생성 설정

스키마 생성은 수동/자동 방식을 사용할 수 있다.

수동 설정 : 위에 schema-mysql.sql파일을 직접 DB에 쿼리를 날려서 테이블을 생성해둔다.

자동 설정은 application.properties (사용하는 환경에 따라 application.yml) 으로 관리할 수 있다.
spring.batch.jdbc.initialize-schema 속성을 아래와 같이 설정할 수 있다.

  • ALWAYS
    • 쿼리를 항상 수행한다.
    • RDBMS 설정이 되어 있을 경우 내장DB 보다 RDBMS에 우선적으로 수행한다.
  • EMBEDDED (default)
    • 내장 DB일 때만 실행되며, 스키마가 자동 생성된다.
  • NEVER
    • 쿼리를 항상 수행하지 않는다.
    • 내장DB를 사용할 경우 테이블이 생성되지 않기 때문에 오류가 발생한다.

실제 운영 환경에서는 수동으로 테이블을 생성한 후, EMBEDDED(DEFAULT) 나 NEVER로 사용하는 것이 권장된다.

테이블에 대한 설명

테이블은 Job 관련 테이블과 Step 관련 테이블이 설정된다.

Job 관련 테이블

  • BATCH_JOB_INSTANCE
    • Job 이 실행될 때 Job Instance 정보가 저장된다.
    • 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 의 실행정보가 저장되며 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리
  • BATCH_STEP_EXECUTION_CONTEXT
    • Step 의 실행동안 여러가지 상태정보, 공유 데이터를 직렬화 (Json 형식) 해서 저장
    • Step 별로 저장되며 Step 간 서로 공유할 수 없음
profile
A fast learner.

0개의 댓글