반응형
프로젝트 환경 설정
- 배치의 환경 설정을 하는 방법은 2가지가 있다.
- Intelij를 활용한 프로젝트 구축
- Intelij - new(상단 막대바 위치) - Spring Initilalizer(좌측 상태바 위치)
- Spring Boot 기반 프로젝트를 생성하는 방법
- https://start.spring.io/ 이동 - dependency에서 Spring Batch 추가
💡 일반 Spring Boot 프로젝트가 있으면 아래의 코드만 dependency에 추가해주자
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<scope>test</scope>
</dependency>
//mysql, h2 connector
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 다음 작업을 위해서는 Docker 기반 Server를 Intelij와 연동해야한다.
- 컨테이너 기반 Server를 사용하지 않고 Local Server를 사용해도 괜찮다.
- 필자는 일단 앞으로의 예제를 컨테이너 Server 기반으로 테스트 작업을 진행하겠다.
💡 필자의 Docker 설치 정리글
Docker에서 동작하는 MySql을 Intelij와 연동하기
Spring Batch 예제 살펴보기
@EnableBatchProcessing이란?
- 스프링 배치가 작동하기 위해 선언해야하는 어노테이션이다.
- 스프링 배치는 4개의 설정 클래스를 실행시켜야만 초기화 및 실행 구성이 갖추어진다.
- 스프링 부트 배치의 자동 설정 클래스가 실행되어 빈으로 등록된 모든 Job을 검색해서 초기화와 동시에 Job을 수행하도록 구성된다.
Spring Batch의 도메인
Job
- 실행해야할 업무를 의미함
Step
- 업무중에서 동작할 업무의 순서를 의미함
TASKLET이란
- Step에서 동작할 실제 동작할 로직을 의미한다.
- 기본값으로는 반복수행하도록 설정되어있다.
- 반복 수행하도록 설정하고 싶지 않다면 RepeatStaus.FINISHED;
- 반복 수행하도록 설정하고 싶다면 RepeatStatus.*CONTINUABLE*;
💡 아래 예제 코드를 살펴보며 실제로 동작해보고 코드를 분석해보자
@RequiredArgsConstructor
@Configuration
public class HelloJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job helloJob(){
return this.jobBuilderFactory.get("step2.job")
.start(helloStep1())
.next(helloStep2())
.build();
}
@Bean
public Step helloStep1(){
return stepBuilderFactory.get("helloStep1")
/**
* 이론에서 말했던 Tasklet 영역이다.
* 기본값 으로는 무한 반복이 기본값이다.
*/
.tasklet(new Tasklet() {
/**
* RepeatStatus가
* 객체의 이름이 RepeatStatus것 만큼 이 안에서 동작할 step이 반복적으로 동작할 지 아니면 한 번만 동작할 지를 결정한다.
* execute의 반환값이 null이라면 한 번 실행되고 정지된다.
* RepeatStatus와 같은 의미를 가지는것이 RepeatStatus.FINISHED이다.
* 반복적으로 값을 동작시키고 싶다면 RepeatStatus.CONTINUABLE로 설정하면 된다.
*/
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("=================================");
System.out.println(" >> Step1 has executed");
System.out.println("=================================");
return RepeatStatus.CONTINUABLE;
}
}).build();
}
@Bean
public Step helloStep2(){
return stepBuilderFactory.get("helloStep2")
.tasklet((contribution, chunkContext) -> {
System.out.println("=================================");
System.out.println(" >> Step2 has executed");
System.out.println("=================================");
return RepeatStatus.FINISHED;
}).build();
}
}
- @Configuration 선언
- 하나의 배치 Job 을 정의하고 빈 설정
- JobBuilderFactory
- Job 을 생성하는 빌더 팩토리
- StepBuilderFactory
- Step 을 생성하는 빌더 팩토리
- Job
- helloJob 이름으로 Job 생성
- Step
- helloStep 이름으로 Step 생성
- Tasklet
- Step 안에서 단일 태스크로 수행되는 로직 구현
중간 정리
💡 Job이 구동되면 Step을 실행하고 Step이 구동되면 Tasklet이 실행된다.
Spring 배치 DB 스키마 생성
- 스프링 배치는 실행하는 동안의 데이터와 관리를 위한 목적으로 여러 도메인들의 정보를 저장, 업데이트, 조회할 수 있는 DB 스키마를 제공한다.
- 이를 통해 저장된 정보를 기반으로 과거, 현재 실행에 대한 정보를 확인하고 작업들에 대한 성공 실패여 부 등을 관리하여 배치 작업을 진행하는 동안의 문제 발생시 빠른 대처가 가능하다.
- DB와 연동할 경우 필수적으로 메타 테이블이 생성 되어야 한다.
💡 DB 스키마의 위 • /org/springframework/batch/core/schema-*.sql에 위치한다.
스키마 생성 방법
- 수동 생성
- 직접 쿼리를 작성해서 DB 스키마를 작성하는 방법이다.
- 자동 생성
- spring.batc.jdbc.initalize-schema 설정을 통해 자동으로 DB 스키마를 생성할 수 있다.
- 생성 옵션
- ALWAYS : 스크립트 항상 실행, RDBMS 설정이 되어 있을 경우 내장 DB 보다 우선적으로 실행
- EMBEDDED : 내장 DB일 때만 실행되며 스키마가 자동 생성됨, 기본값
- NEVER : 스크립트를 항상 실행 안한다. 내장 DB 일경우 스크립트가 생성이 안되기 때문에 오류 발생하므로 운영에서 수동으로 스크립트 생성 후 설정하는 것을 권장한다.
- spring.batc.jdbc.initalize-schema 설정을 통해 자동으로 DB 스키마를 생성할 수 있다.
DB 스키마 종류
- 총 6개의 테이블로 이루어져 있으며 Job관련 테이블과 Step 관련 테이블로 이루어져 있다.
Job 관련 테이블
- BATCH_JOB_INSTANCE
- Job 이 실행될 때 JobInstance 정보가 저장되며 job_name과 job_key를 키로 하여 하나의 데이터가 저장 동일한 job_name 과 job_key 로 중복 저장될 수 없다
- BATCH_JOB_EXECUTION
- job 의 실행정보가 저장되며 Job 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리
- BATCH_JOB_EXECUTION_PARAMS
- Job과 함께 실행되는 JobParameter 정보를 저장
- BATCH_JOB_EXECUTION_CONTEXT
- Job 의 실행동안 여러가지 상태정보, 공유 데이터를 직렬화 (Json 형식) 해서 저장
- Step 간 서로 공유 가능함
Step 관련 테이블
- BATCH_STEP_EXECUTION
- Step 의 실행정보가 저장되며 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리
반응형
'Spring Batch' 카테고리의 다른 글
6.Spring Batch의 Flow (1) | 2024.11.07 |
---|---|
5.Spring Batch의 Step (0) | 2024.11.07 |
4.Spring Batch의 Job (0) | 2024.11.06 |
3.Spring Batch 도메인 이해하기 (0) | 2024.11.02 |
1.Spring Batch 소개 (0) | 2022.07.04 |