Study/스프링배치 완벽 가이드

Day 3. 잡과 스텝 이해하기

주지민 2021. 11. 6. 22:14
반응형
스프링 배치 완벽 가이드 내용 정리입니다
3장. 예제 잡 어플리케이션은 스킵했습니다

 

http://www.yes24.com/Product/Goods/99422216

 

스프링 배치 완벽 가이드 2/e - YES24

스프링 배치의 `Hello, World!`부터 최근 플랫폼의 발전에 따른 클라우드 네이티브 기술을 활용한 배치까지 폭넓은 스프링 배치 활용 방법과 이와 관련된 유용한 내용을 다룬다. 또한 스프링 프레임

www.yes24.com


1. 잡 소개하기

  • 잡은 처음부터 끝까지 독립적으로 실행할 수 있으며, 고유하고 순서가 지정된 여러 스텝의 목록이라고 정의할 수 있다
  • 특징
    • 유일하다 => 같은 잡을 통해서 동일한 구성을 필요한 만큼 실행할 수 있다
    • 순서를 가진 여러 스텝의 목록 => 모든 스텝을 논리적인 순서대로 실행할 수 있도록 구성되어있다
    • 처음부터 끝까지 실행 가능
    • 독립적이다 => 각 배치 잡은 외부 의존성의 영향을 받지 않고 실행할 수 있어야 한다
  • 잡의 생명주기
    • 잡의 실행은 Job Runner에서 시작된다
      • 잡 이름과 여러 파라미터를 받아들여 잡을 실행시키는 역할
      • 종류는 두가지가 있다 ( org.springframework.batch.core.launch.support )
      • CommandLineJobRunner
        • 스크립트 혹은 명령행에서 직접 잡을 실행시킬 때 사용
        • 스프링을 부트스트랩하고, 전달받은 파라미터를 사용해 요청된 잡을 실행
        • 별도의 구성이 없다면 기본적으로 ApplicationContext에 정의된 Job 타입의 모든 빈을 기동시에 실행한다
      • JobRegistryBackgroundJobRunner
        • JobRegistry를 생성하는 데 사용한다
        • 쿼츠나 JMX 후크와 같은 스케줄러를 사용해 Job을 실행하면, 스프링이 부트스트랩될 때 실행 가능한 잡을 가지고 있는 JobRegistry를 생성하게 된다
      • 스프링 배치는 org.springframework.batch.core.launch.support.SimpleJobLauncher라는 단일 JobLauncher만 제공한다
    • 코어 스프링의 Task Executor 인터페이스를 이용해 요청된 잡을 수행
      • org.springframework.core.task.TaskExecutor를 구성하는 방법에는 여러가지가 있다
      • 대표적으로 SyncTaskExecutor를 사용한다면 JobLauncher와 동일한 스레드에서 잡이 실행된다
    • 배치 잡이 실행되면 JobInstance가 생성된다
      • 잡의 논리적 실행을 나타낸다
      • JobName + JobParameters ( 실행시에 사용되는 파라미터 ) 조합으로 식별된다
      • 성공적으로 완료된 JobExecution이 있다면 완료된 것으로 간주

 

2. 기본 잡 구성해보기

  • 로컬 MySQL 스키마 생성
    // mysql -u "..." -p 접속
    CREATE SCHEME `spring_batch_guide` DEFAULT CHARACTER SET utf8;​
  • 프로퍼티 구성
    // application.yml
    
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/spring_batch_guide
        username: {username}
        password: {password}
    
      batch:
        jdbc:
          initialize-schema: always​
    • 로컬로 실행된 mysql과 연결했다
    • spring.batch.jdbc.initialize-schema
      • 데이터베이스에 배치 스키마가 존재하지 않는다면 자동으로 배치 스키마를 생성하도록 설정
      • always, embedded, none 세 가지 타입이 있다
      • 이렇게 설정되면 스프링 부트는 항상 배치 스키마를 생성하려고 시도한다, 만약 이미 스키마가 존재한다면 해당 시도가 실패하게 되지만 기본 설정에 따라 해당 실패는 무시되고 이후 과정이 문제없이 진행된다
  • HelloWorld Job 구성
    // HelloWorldJobConfiguration
    @RequiredArgsConstructor
    @EnableBatchProcessing
    @Configuration
    public class HelloWorldJobConfiguration {
    
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory;
    
        @Bean
        public Job helloWorldJob() {
            return this.jobBuilderFactory.get("helloWorldJob")
                    .start(helloWorldStep())
                    .build();
        }
    
        @Bean
        public Step helloWorldStep() {
            return this.stepBuilderFactory.get("helloWorldStep")
                    .tasklet((contribution, chunkContext) -> {
                        System.out.println("Hello, World!");
                        return RepeatStatus.FINISHED;
                    })
                    .build();
        }
    }​

    • @EnableBatchProcessing
      • 전에 설명한 대로 어플리케이션내에서 한번만 적용되며 배치 어플리케이션 구성에 필요한 각종 빈들을 정의하여 제공한다
    • JobBuilderFactory
      • 스프링 배치 잡을 구성하고 생성하는데 사용된다
      • get() 메서드에 Job 이름을 전달하면 JobBuilder를 얻을 수 있으며, 이를 통해 Job을 구성할 수 있다
    • StepBulderFactory
      • 스텝 빈을 정의하는데 사용
      • JobBuilderFactory와 마찬가지로 get() 메서드에 Step 이름을 전달하면 StepBuilder가 반환되며 해당 빌더를 통해 Step을 구성할 수 있다
      • Tasklet을 구현하므로 동작을 정의할 수 있다
728x90
반응형