-
Spring Batch 프로젝트 생성하기 - Spring Boot 2.7.5프로젝트/스프링 배치 튜토리얼 2023. 2. 5. 00:01728x90
프로젝트 생성하기
Generate로 프로젝트를 생성하고 압축을 풀어줍니다.
Intellij에서 프로젝트 시작하기
파일 -> 열기 -> 압축 푼 프로젝트 경로 -> build.gradle.kts 열기
Simple Job 생성하기
@SpringBootApplication @EnableBatchProcessing class BatchApplication fun main(args: Array<String>) { runApplication<BatchApplication>(*args) }
Spring Batch 기능 활성화 어노테이션 EnableBatchProcessing을 추가합니다.
job 패키지 성상 및 SimpleJobConfiguration 파일 생성
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 @Configuration class SimpleJobConfiguration( private val jobBuilderFactory: JobBuilderFactory, private val stepBuilderFactory: StepBuilderFactory, ) { @Bean fun simpleJob() : Job { return jobBuilderFactory.get("simpleJob") .start(simpleStep1()) .build() } @Bean fun simpleStep1() : Step { return stepBuilderFactory.get("simpleStep1") .tasklet { contribution, chunkContext -> println(">>>>> This is Step1") RepeatStatus.FINISHED } .build() } }
@Configuration : Spring Batch의 모든 Job은 @Configuration으로 등록해서 사용합니다.
jobBuilderFactory.get("simpleJob") : simpleJob이란 이름의 Batch Job을 생성합니다.
stepBuilderFactory.get("simpleStep1") : simpleStep1이란 이름의 Batch Step을 생성합니다.
.tasklet{contribution, chunkContext -> } : Step안에서 수행될 기능들을 명시합니다. Batch가 수행되면 This is Step 1가 출력됩니다.
Job 안에는 여러 Step이 존재하고 Step안에 Tasklet 혹은 Reader & Processor & Writer 묶음이 존재합니다.
Job 안에 여러 Step이 있다는 것은 쉽게 이해되지만, Step이 품고 있는 단위가 애매해 보일 수 있습니다.
Tasklet 하나와 Reader, Processor, Writer 한 묶음이 같은 레벨입니다.
따라서 Reader & Processor가 끝나고 Tasklet으로 마무리 짓는 등으로 만들 순 없습니다.
프로그램 실행하기
: Job: [SimpleJob: [name=simpleJob]] launched with the following parameters: [{}] : Executing step: [simpleStep1] >>>>> This is Step1 : Step: [simpleStep1] executed in 14ms : Job: [SimpleJob: [name=simpleJob]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 30ms
매우 간단하게 Spring Batch가 수행되었고 "이제 애플리케이션 코드만 작성하면 되는구나" 라고 생각할 수 있습니다.
하지만 Spring Batch에선 메타 데이터 테이블들이 필요합니다.
메타 데이터란, 데이터를 설명하는 데이터입니다.
Spring Batch의 메타데이터
- 이전에 실행한 Job이 어떤것들인지
- 최근 실패한 Batch Parameter가 어떤 것들이 있고, 성공한 Job은 어떤것들이 있는지
- 다시 실행한다면 어디서부터 시작하면 될지
- 어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step들은 어떤것들이 있는지
MySQL으로 프로그램 실행해보기
H2 데이터베이스를 사용하는 경우에는 내부적으로 메타데이터를 만들어줍니다.
MySQL을 통해 프로그램을 실행하면 어떻게 될까요?
Database 만들기
create database spring_batch;
build.gradle.kts 의존성 추가하기
runtimeOnly("mysql:mysql-connector-java")
application.yml 작성하기
spring: profiles: active: mysql --- spring: datasource: hikari: jdbc-url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: driver-class-name: org.h2.Driver config: activate: on-profile: local --- spring: datasource: hikari: jdbc-url: jdbc:mysql://localhost:3306/spring_batch username: root password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver config: activate: on-profile: mysql
profile을 mysql으로 설정하고 실행합니다.
실행 시 발생하는 에러
Caused by: java.sql.SQLSyntaxErrorException: Table 'spring_batch.batch_job_instance' doesn't exist
메타 테이블 데이터인 BATCH_JOB_INSTANCE가 존재하지 않는다는 에러와 함께 배치가 실패했음을 알 수 있습니다.
MySQL Batch Table 구성하기
위는 필요한 메타 테이블 구조입니다.
MySQL이나, Oracle과 같은 DB를 사용할 때는 개발자가 직접 생성해야만 합니다.
그러면 일일이 해당 스키마 들을 만들어야 할까요?
Spring Batch에 해당 스키마들이 이미 존재하기 때문에, 이를 그대로 복사해서 create table 하면 됩니다.
Windows 기준으로 Intellij 단축기 Ctrl+N을 통해 schema 파일 탐색을 합니다.
여기에서 schema-mysql.sql을 찾습니다.
이제 MySQL에 해당 SQL문으로 테이블을 추가해주고 실행해보면 해당 에러가 사라지며 잘 실행됩니다.
참고자료
https://jojoldu.tistory.com/325
'프로젝트 > 스프링 배치 튜토리얼' 카테고리의 다른 글
Spring Batch 데이터베이스와 함께 사용하기 (0) 2023.10.11 Spring Batch 프로젝트 생성하기 - Spring Boot 3.1 (0) 2023.10.09 JobParameters Intellij 환경 변수 설정 (0) 2023.02.14 SpringBatch Cursor 기반 vs Paging 기반 (0) 2023.02.07 Spring Batch란? (0) 2023.02.04