article thumbnail image
Published 2023. 6. 5. 15:25

스프링 배치란?

대용량 레코드 처리에 필수적인 기능을 제공

로깅/추적
트랜잭션 관리
작업 처리 통계
작업 재시작
건너뛰기
리소스 관리 등

또한 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 배치 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공

 

 

 

 

 

 

 

🤔그렇다면 Spring Batch 와 Scheduler의 차이는 무엇일까?


Spring BatchBatch Job을 관리하지만 Job을 구동하거나 실행시키는 기능은 지원하고 있지 않다.

Spring에서 Batch Job을 실행시키기 위해서는 Quartz, Scheduler, Jenkins등 전용 Scheduler를 사용해야 한다.

 

 

 

 

 

 

 

 

🔎용어!

Job
배치처리 과정을 하나의 단위로 만들어 놓은 객체
배치처리 과정에 있어 전체 계층 최상단에 위치

JobInstance
Job의 실행의 단위
Job을 실행시키게 되면 하나의 JobInstance가 생성
ex) 1월 1일 실행, 1월 2일 실행을 하게 되면 각각의 JobInstance가 생성되며
1월 1일 실행한 JobInstance가 실패하여 다시 실행을 시키더라도 이 JobInstance는 1월 1일에 대한 데이터만 처리

Step
잡을 구성하는 독립된 작업의 단위
Job은 최소한 1개 이상의 Step을 가져야 하며 Job의 실제 일괄 처리를 제어하는 모든 정보가 들어있다.
Step에는 Tasklet, Chunk 기반으로 2가지가 있다.

Tasklet
Step이 중지될 때까지 execute 메서드가 계속 반복해서 수행하고 수행할 때마다 독립적인 트랜잭션이 얻어진다.
초기화, 저장 프로시저 실행, 알림 전송과 같은 잡에서 일반적으로 사용된다.

Chunk
한 번에 하나씩 데이터(row)를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것
Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 된다.

StepExecution
StepExecution은 JobExecution과 동일하게 Step 실행 시도에 대한 객체를 나타냄
Job이 여러개의 Step으로 구성되어 있을 경우 이전 단계의 Step이 실패하면 이후 StepExecution은 생성되지 않는다.
StepExecution에는 JobExecution에 저장되는 정보 외에 read 수, write 수, commit 수, skip 수 등의 정보들도 저장이 됩니다.


ExecutionContext
Job에서 데이터를 공유 할 수 있는 데이터 저장소
Spring Batch에서 제공하는 ExecutionContext는 JobExecutionContext, StepExecutionContext 2가지 종류가 있으나 이 두가지는 지정되는 범위가 다릅니다.
JobExecutionContext는 Commit 시점에 저장
StepExecutionContext는 실행 사이에 저장
ExecutionContext를 통해 Step간 Data 공유가 가능하며 Job 실패시 ExecutionContext를 통한 마지막 실행 값을 재구성 할 수 있다.


JobRepository
모든 배치 처리 정보를 담고있는 매커니즘
일반적으로 관계형 데이터베이스를 사용하며 스프링 배치 내의 대부분의 주요 컴포넌트가 공유
Job 실행 ->  JobRepository에 JobExecution과 StepExecution을 생성
여기서 Execution 정보들을 저장하고 조회하며 사용

JobParameter
배치 작업이 수행될때 마다 전달되는Parameter
시작 시간, 데이타를 읽을 범위 등을 지정하여 Batch Job Instance를 생성한다면 이떄 넘어가는 인자가JobParameter이다

JobLauncher
Job과 JobParameters를 사용하여 Job을 실행하는 객체
Job.execute을 호출하는 역할

ItemReader
 Step에서 Item을 읽어오는 인터페이스.
ItemReader에 대한 다양한 인터페이스가 존재하며 다양한 방법으로 Item을 읽어 올 수 있다.

ItemProcessor
Reader에서 읽어온 Item을 데이터를 처리하는 역할
배치를 처리하는데 필수 요소는 아니다.

ItemWriter
처리 된 Data를 Writer 할 때 사용한다.
Writer는 처리 결과물에 따라 Insert가 될 수도 Update가 될 수도 Queue를 사용한다면 Send가 될 수도 있다.
Writer 또한 Read와 동일하게 다양한 인터페이스가 존재한다.
기본적으로 Item을 Chunk로 묶어 처리

 

chunk vs.tasklet

💡일반적으로 스프링 배치는 대용량 데이터를 다루는 경우가 많기 때문에 Tasklet보다 상대적으로 트랜잭션의 단위를 짧게 하여 처리할 수 있는 ItemReader, ItemProcessor, ItemWriter를 이용한 Chunk 지향 프로세싱을 이용한다.

 

chunk와 tasklet의 차이는 다음 포스팅에서 좀 더 자세하게 정리하였다.

https://develoyummer.tistory.com/91

 

관련 영상

https://www.youtube.com/watch?v=F9sDJrqs73s 

 

 

 

사용법


1. Spring batch Dependency추가

2. 애플리케이션 메인 클래스에 @EnableBatchProcessing(batch 기능 활성화) 어노테이션을 설정

 

3. Spring Batch 코드 작성

@Slf4j
@RequiredArgsConstructor
@Configuration // Spring Batch의 모든 Job은 @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 simpleStep1");
                return RepeatStatus.FINISHED;
            })
            .build();
    }

}

💡주의

기본적으로 H2 DB를 사용할 경우엔 Boot가 실행될 때 자동으로 메타 데이터를 생성해주지만, MySQL이나 Oracle과 같은 DB를 사용할 때는 자동으로 생성되지 않아 실행이 실패한다.

 

따라서 다른 DB를 사용할 경우 schema-mysql.sql 파일에 작성된 SQL실행하면 메타 테이블을 생성한 후 실행해주어야 한다.

 

메타데이터란?

데이터를 설명하는 테이블
이전에 실행한 Job이 어떤 것들이 있는지,
최근 실패한 Batch Parameter가 어떤것들이 있고, 성공한 Job은 어떤것들이 있는지
다시 실행한다면 어디서 부터 시작하면 될지
어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step들은 어떤것들이 있는지
등을 담고있다

 

메타데이터 테이블의 구조

 

 

 

프로젝트에서의 적용

 

https://develoyummer.tistory.com/90

 

프로젝트에서 Spring batch의 적용

yata project에서 기한이 만료된 게시글을 일정 시간마다 한번에 처리해야겠다는 생각을 하였고, spring batch기능을 통해 일괄처리해주기로 결정하였다. 🔎스프링 배치(Spring Batch) 대량의 데이터를

develoyummer.tistory.com

 

 

 



 

참고 자료

https://github.com/jojoldu/spring-batch-in-action/blob/master/2_Job%EC%83%9D%EC%84%B1.md

https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#configureStep

https://khj93.tistory.com/entry/Spring-Batch%EB%9E%80-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

https://devbksheen.tistory.com/284

 

복사했습니다!