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 |