ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 02. Hello Spring Batch Project
    BackEnd/Spring Batch 2021. 12. 11. 09:28
    반응형

    Overview

      해당 글에서는 간단한 스프링 배치 프로젝트를 생성하여 구조를 확인해 보겠습니다. 전체 소스코드는 https://github.com/HanseomKim/springbatch/tree/master/src/main/java/com/spring/springbatch 참고하시면 됩니다.

     

    1. 프로젝트 생성

      https://start.spring.io/ 에서 프로젝트를 생성합니다. [GENERATE]

      의존성으로는 Spring Batch, Lombok, H2 Database을 추가합니다. 다운로드 받은 폴더를 압축 해제하고 작업 폴더로 옮긴 후 IntelliJ에서 File > Open > 다운로드받은폴더\pom.xml을 열면 됩니다.

    https://start.spring.io/

      의존성으로 H2 Databse를 추가하지 않으면 초기화 시 Failed to determine a suitable driver class 원인으로 아래와 같이 애플리케이션이 실행되지 않습니다.

     

    2. @EnableBatchProcessing

      스프링 배치가 작동하기 위해 메인 함수가 있는 파일에 @EnableBatchProcessing 어노테이션을 선언합니다. @EnableBatchProcessing는 총 4개의 설정 클래스를 실행시키며 스프링 배치의 모든 초기화 및 실행을 구성합니다. 스프링 부트 배치의 자동 설정 클래스가 실행됨으로 빈으로 등록된 모든 Job을 검색해서 초기화와 동시에 Job을 수행하도록 구성됩니다.

    package com.spring.springbatch;
    
    import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @EnableBatchProcessing
    public class SpringbatchApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SpringbatchApplication.class, args);
    	}
    
    }

     

    3. HelloJobConfiguration

      helloJob이 구동되면 helloStepStart이 실행되고 helloStepNext가 실행되는 구조입니다. 코드에 대한 설명은 주석을 참고하시면 됩니다.

    package com.spring.springbatch;
    
    import lombok.RequiredArgsConstructor;
    import org.springframework.batch.core.Job;
    import org.springframework.batch.core.Step;
    import org.springframework.batch.core.StepContribution;
    import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
    import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
    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.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @RequiredArgsConstructor // @NonNull이나 final이 붙은 필드에 대해 생성자를 생성합니다. (의존성 주입)
    @Configuration           // 하나의 배치 Job을 정의하고 빈을 설정합니다.
    public class HelloJobConfiguration {
    
        private final JobBuilderFactory jobBuilderFactory;   // Job을 생성하는 빌더 팩토리입니다.
        private final StepBuilderFactory stepBuilderFactory; // Step을 생성하는 빌더 팩토리입니다.
    
        @Bean
        public Job helloJob() {
            return jobBuilderFactory.get("helloJob")        // helloJob 이름으로 Job을 생성합니다.
                    .start(helloStepStart())
                    .next(helloStepNext())
                    .build();
        }
    
        @Bean
        public Step helloStepStart() {
            return stepBuilderFactory.get("helloStepStart") // helloStep 이름으로 Step을 생성합니다.
                    // Step안에서 단일 태스크로 수행되는 로직을 구현합니다.
                    // return RepeatStatus.FINISHED or null: 1회만 수행합니다. 기본적으로 무한 반복입니다.
                    .tasklet(new Tasklet() {
                        @Override
                        public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                            // Business Logic
                            System.out.println("Hello Spring Batch !!");
                            return RepeatStatus.FINISHED;
                        }
                    })
                    .build();
        }
    
        @Bean
        public Step helloStepNext() {
            return stepBuilderFactory.get("helloStepNext")
                    .tasklet(new Tasklet() {
                        @Override
                        public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                            // Business Logic
                            System.out.println("Next step !!");
                            return RepeatStatus.FINISHED;
                        }
                    })
                    .build();
        }
    }

      수행결과는 아래와 같습니다.

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.5.7)
    
    2021-12-11 09:09:47.184  INFO 14272 --- [           main] c.s.springbatch.SpringbatchApplication   : Starting SpringbatchApplication using Java 16.0.1 on DESKTOP-BVP40EV with PID 14272 (C:\workspace\springbatch\springbatch\target\classes started by LG in C:\workspace\springbatch\springbatch)
    2021-12-11 09:09:47.187  INFO 14272 --- [           main] c.s.springbatch.SpringbatchApplication   : No active profile set, falling back to default profiles: default
    2021-12-11 09:09:48.716  INFO 14272 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
    2021-12-11 09:09:48.960  INFO 14272 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
    2021-12-11 09:09:49.138  INFO 14272 --- [           main] o.s.b.c.r.s.JobRepositoryFactoryBean     : No database type set, using meta data indicating: H2
    2021-12-11 09:09:49.407  INFO 14272 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : No TaskExecutor has been set, defaulting to synchronous executor.
    2021-12-11 09:09:49.533  INFO 14272 --- [           main] c.s.springbatch.SpringbatchApplication   : Started SpringbatchApplication in 3.362 seconds (JVM running for 4.487)
    2021-12-11 09:09:49.535  INFO 14272 --- [           main] o.s.b.a.b.JobLauncherApplicationRunner   : Running default command line with: []
    2021-12-11 09:09:49.617  INFO 14272 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=helloJob]] launched with the following parameters: [{}]
    2021-12-11 09:09:49.670  INFO 14272 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [helloStepStart]
    Hello Spring Batch !!
    2021-12-11 09:09:49.688  INFO 14272 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [helloStepStart] executed in 17ms
    2021-12-11 09:09:49.695  INFO 14272 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [helloStepNext]
    Next step !!
    2021-12-11 09:09:49.700  INFO 14272 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [helloStepNext] executed in 4ms
    2021-12-11 09:09:49.704  INFO 14272 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=helloJob]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 48ms
    2021-12-11 09:09:49.708  INFO 14272 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
    2021-12-11 09:09:49.711  INFO 14272 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
    
    Process finished with exit code 0

     

    [참고자료]

    https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard

    반응형

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

    06. Job  (0) 2021.12.16
    05. 스프링 배치 초기화 설정  (0) 2021.12.16
    04. 도메인 언어(Domain Language)  (0) 2021.12.15
    03. 메타데이터 스키마(Meta-Data Schema)  (0) 2021.12.11
    01. Spring Batch  (0) 2021.12.07

    댓글

Designed by Tistory.