IT/development

[springBoot] spring batch simple tasklet (feat. tasklet)

알 수 없는 사용자 2023. 11. 9. 21:05
반응형

목차

    spring batch tasklet

    스프링 배치를 이용한 정말 간단한 로그 찍는 프로그램이다.

    main method가 있는 클래스 😄

    package com.lsy.sample.springbatchvideo;
    
    import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @EnableBatchProcessing	// 배치 프로그램임을 알리는 애노테이션임, 중요!!
    @SpringBootApplication
    public class SpringBatchVideoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBatchVideoApplication.class, args);
        }
    
    }

    TestletJob 😊

    package com.lsy.sample.springbatchvideo.batch;
    
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.batch.core.Job;
    import org.springframework.batch.core.Step;
    import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
    import org.springframework.batch.core.configuration.annotation.JobScope;
    import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
    import org.springframework.batch.repeat.RepeatStatus;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Slf4j
    @RequiredArgsConstructor
    @Configuration
    public class TestletJob {
    	//생성자 의존성 주입
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory;
    	
        //job
        @Bean
        public Job taskletJob_batchBuild() {
            return jobBuilderFactory.get("taskletjob")
                    .start(taskletJob_step())
                    .next(taskletJob_step2(null))
                    .build();
        }
    	
        //step1
        @Bean
        public Step taskletJob_step() {
            return stepBuilderFactory.get("taskletJob_step1")
                    .tasklet((a, b) -> {
                        log.info(" ======> job =====> [step1]");
                        return RepeatStatus.FINISHED;
                    }).build();
        }
    	
        //step2
        @Bean
        @JobScope
        public Step taskletJob_step2(@Value("#{jobParameters[date]}") String date) {
            return stepBuilderFactory.get("taskletJob_step2")
                    .tasklet((a, b) -> {
                        log.info(" ======> [step1] =====> [step2] [{}]", date);
                        return RepeatStatus.FINISHED;
                    }).build();
        }
    
    }

    application.yml 😄

    logging:
      level:
        root: info
        com.lsy.sample: debug
    
    spring:
      jpa:
        hibernate:
          ddl-auto: update
          use-new-id-generator-mappings: true
        show-sql: true
        properties:
          hibernate:
            dialect: org.hibernate.dialect.MySQL57Dialect
      datasource:
        url: jdbc:mysql://{ip}:{port}/{dbname}?serverTimezone=Asia/Seoul
        username: #username
        password: #password
    
      batch:
        job:
          names: ${job.name:NONE}

    기본 tasklet부분과 meta table 연동해서 날짜 parameter 받아서 화면에 출력하는 정도이다.

    스프링 배치를 사용하기 위해선 메타 테이블이 있어야 한다.

    메타 테이블 스크립트는 batch.core 패키지안에 schema-"벤더사명".sql파일이 있는데 여기에 스크립트가 있고 IDE에서 파일명으로 "schema"를 검색하면 되며 이 스크립트를 db툴로 돌리면 된다.

    아키텍처 이미지는 구글링 하면 많이 나오므로 생략, 핵심은 아래와 같다.


    하나의 Job이 1개 이상의 Step을 품고 있고 이 Step에서 ItemReader를 통해 데이터를 읽고

    ItemProcessor로 읽은 데이터를 가공(선택사항)한 다음 ItemWriter를 통해 데이터를 쓰며 이런 job들은 JobRepository 역할을 하는 meta table에 저장된다.(이 테이블은 개발자가 수정 금지)


    batch-meta-table 🙂

    • batch_job_instance: 배치 인스턴스(최상위 부모, 동일한 job_name, job_key 중복 저장 X)
    • batch_job_execution: 부모 배치 인스턴스의 수행 결과 저장(job의 시작 ~ 종료까지의 관련 정보 저장(생성시간, 시작시간, 종료시간, 실행상태, 종료코드, 종료메시지 등))
    • batch_job_execution_context: 배치 실행 컨텍스트 저장(job의 실행 관련 context, 직렬화  context 정보 저장), 스텝 간 공유 가능
    • batch_job_execution_params: 배치 실행 parameter 정보 저장
    • batch_step_execution: 배치 스텝 수행 결과 저장으로 추정(스텝 관련 excution 정보 저장)
    • batch_step_execution_context: 배치 스텝 실행 컨텍스트 저장(스텝 실행 관련 context 정보 저장), 스텝 간 공유 불가
    • batch_job_seq: 부모 배치 인트선스 시퀀스
    • batch_job_execution_seq: 배치 인스턴스 실행결과 시퀀스
    • batch_step_execution_seq: 배치 스텝 실행결과 시퀀스

    개인 스터디 기록을 메모하는 공간이라 틀린점이 있을 수 있습니다.

    틀린 점 있을 경우 댓글 부탁드립니다.

    reference: https://www.youtube.com/watch?v=wy99cPHlMlA&list=PLogzC_RPf25HRSG9aO7qKrwbT-EecUMMR


    다음 내용

     

    [springBoot] spring batch jpa simpleDbReader (feat. DB)

    목차 아래 포스팅에서 이어진 내용입니다. [springBoot] Simple Spring Batch Tasklet(feat. simple) 스프링 배치를 이용한 정말 간단한 로그 찍는 프로그램이다. 기본 tasklet부분과 meta table 연동해서 날짜 paramete

    yaga.tistory.com

    반응형