2021/개발

Spring Batch - 기본 프로젝트 만들기

mjin.park 2021. 5. 1. 01:20

Spring Batch 를 활용한 기본적인 프로젝트를 만들어서 돌려보자.

(아래 작성한 소스코드는 여기에서 확인할 수 있다. 👉 github.com/mjin1220/spring-batch-project)

 

먼저 Spring Boot로 기본 프로젝트를 생성해본다.

자바 기본 프로젝트(with gradle)를 생성하고, 스프링 부트 공식 사이트에서 제공하는 build.gradle을 복사해서 적용한다.

복사한 설정 값 중에서 group, sourceCompatibility를 수정하고, 필요한 라이브러리가 있다면 더 추가한다.

plugins {
	id 'org.springframework.boot' version '2.4.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.mjin'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

 

위 build.gradle 파일은 기본적으로 웹 서버를 띄울 수 있는 세팅이다.

우리는 Spring Batch 를 수행할 것이므로 여기에서 조금 더 수정하도록 한다.

plugins {
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.mjin'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
//    implementation 'org.springframework.boot:spring-boot-starter-web'

    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-batch', version: '2.4.4'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '2.4.4'
    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.24'

    compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.20'
    annotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.20'

    testImplementation group: 'com.h2database', name: 'h2', version: '1.4.200'
    testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.4.4'
    testImplementation group: 'org.springframework.batch', name: 'spring-batch-test', version: '4.2.6.RELEASE'

}

test {
    useJUnitPlatform()
}

 

의존성 설정이 끝났으니, 이제 배치 잡을 수행할 수 있도록 코드를 작성해보자.

일단 Spring Boot 어플리케이션 메인 코드를 작성한다.

package com.mjin.spring_batch;

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableBatchProcessing // 배치 기능 활성화
public class BatchApplication {

    public static void main(String[] args) {
        SpringApplication.run(BatchApplication.class, args);
    }
}

 

메인 코드를 작성했으니, 이제 Batch Job을 하나 생성해보자.

package com.mjin.spring_batch.job;

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.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Slf4j
@RequiredArgsConstructor
@Configuration
public class SimpleJobConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("simpleJob")
                .start(simpleStep1())
                .build();
    }

    @Bean
    public Step simpleStep1() {
        return stepBuilderFactory.get("simpleStep1")
                .tasklet(((contribution, chunkContext) -> {
                    log.info(">>>> This is Step1");
                    return RepeatStatus.FINISHED;
                }))
                .build();
    }
}

 

하지만, 실행이 되지 않는다. 무엇이 문제인가...?

Spring Batch 는 메타 데이터 테이블이 필요하다. 메타 데이터 테이블에는 다음 내용들이 포함되어 있다.

  • 이전에 실행한 Job이 어떤 것들이 있는지
  • 최근 실패한 Batch Parameter가 어떤 것들이 있고, 성공한 Job은 어떤 것들이 있는지
  • 다시 실행한다면 어디서 부터 시작하면 될 지
  • 어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step들은 어떤 것들이 있는지

메타데이터를 저장하기 위한 DB 테이블들은 org.springframework.batch.core 패키지 안에 "schema-*.sql" 의 형태로 포함되어 있다.

MySQL을 사용하므로 schema-mysql.sql 파일의 내용을 복사하여 데이터베이스에 적용한다.

적용하면 아래와 같이 9개의 테이블이 생성된다.

생성된 테이블 목록

테이블을 생성하고, BatchApplication 파일을 실행하면 아래와 같이 로그나 DB 데이터에서 수행됨을 확인할 수 있다.

배치 프로젝트 수행 결과 로그

참고 자료
1. jojoldu.tistory.com/325?category=902551  
2.https://docs.spring.io/spring-batch/docs/3.0.x/reference/html/metaDataSchema.html
반응형

'2021 > 개발' 카테고리의 다른 글

SSO  (0) 2021.10.10
OAuth 2.0  (0) 2021.10.10
ELK - Elasticsearch 설치  (0) 2021.04.27
Spring Boot - An illegal reflective access operation has occurred  (0) 2021.04.24
JWT(JSON Web Token)  (0) 2021.02.06