배치란
데이터를 모아서 처리하는 방식입니다.
스케쥴이나 이벤트에 맞춰 실행됩니다. (트리거)
배치 서비스 기본 3단계
배치 서비스는 크게 3단계로 나뉘어져 있습니다.
- [Read] : 데이터를 파일, 데이터베이스, 메세지로부터 읽어옵니다.
- [Processing] : 읽은 데이터를 비즈니스 로직에 의해 처리합니다.
- [Write] : 처리된 데이터를 수정된 형태로 출력하고 삽입합니다.
배치의 특징
- UI가 없습니다. (별도 UI툴 사용 가능)
- 대량의 데이터를 모아서 처리합니다.
- 정해진 스케쥴에 맞춰 동작합니다.
- 한번 시작하면 어떻게든 종료됩니다.
Spring Batch
Spring Batch 대표 구성 요소
- Job, Step, Tasklet
- ItemReader
- ItemProcessor
- ItemWriter
Spring Batch 지원 기능
- 트랜잭션 관리
- 청크 단위의 처리
- 선언적 입출력 지원
- 병렬처리
- 시작, 중지, 재시작 지원
- 재시도 또는 건너뛰기 지원
- 웹기반 관리 인터페이스 제공 (Spring Cloud Data Flow)
Spring Batch 아키텍처
- 3개의 티어로 구성된 아키텍처
- 어플리케이션, 코어, 인프라스트럭처
- 어플리케이션
- 코어
- 잡, 스텝, 잡 런처, 잡 파라미터 등의 배치 도메인 요소들
- 인프라스트럭처
![](https://velog.velcdn.com/images/ekxk1234/post/66e32c9e-bd92-4ad6-9787-56fac1b49aff/image.png)
Spring Batch 필요 요소
![](https://velog.velcdn.com/images/ekxk1234/post/29459ab2-862c-4519-98e1-5d8c530c1522/image.png)
Job
- 외부 의존성 없이 독립성을 갖습니다.
- 스프링 배치에서 실행되는 처리 단위입니다.
- 스텝을 담는 컨테이너 개념입니다.
- 하나 또는 여러 개의 스텝으로 구성됩니다.
JobInstance
- Job의 논리적 실행 단위입니다.
- Job이 성공적으로 완료되면 다시 실행시킬 수 없습니다.
- Job 이름과 Job 파라미터로 구분됩니다.
- 동일한 Job 이름에 동일한 파라미터를 사용하여 단 한번만 실행합니다.
JobExecution
- Job을 실행한 것을 의미합니다.
- 실패든 성공이든 시도한 것을 나타냅니다.
JobParameter
JobListener
- Job 실행과 관련한 이벤트를 받을 수 있는 기능을 제공합니다.
JobListener 예시 코드
@BeforeJob
public void beforeJob(JobExecution jobExecution) {
if (jobExecution.getStatus() == BatchStatus.STARTED) {
log.info("============================================");
}
}
@AfterJob
public void afterJob(JobExecution jobExecution) {
if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("============================================");
}
}
Step
Job을 구성하고 있는 배치 작업의 독립적이고 순차적인 단위입니다.
- Tasklet 기반 Step
- Chunk 기반 Step
- 아이템 기반의 처리
- ItemReader
- ItemProcessor
- ItemWriter
Tasklet
- 단한 실행 처리
- execute 메서드
- 하나의 트랜잭션 단위로 동작
ItemReader
ItemReader 흐름
![](https://velog.velcdn.com/images/ekxk1234/post/8122c45e-0af9-4e23-a565-9582e5570613/image.png)
ItemProcessor
스텝에서 아이템에 대한 비지니스 처리를 나타내는 추상화 인터페이스
- 입력 소스에서 읽은 아이템 기반으로 특정 작업을 수행
- 처리를 완료 후 결과 아이템을 반환
- 입력 아이템의 타입과 결과 아이템의 타입이 다를 수 있다
- 여러번 전달되더라도 동일 결과를 갖는 멱등성을 갖어야 한다
![](https://velog.velcdn.com/images/ekxk1234/post/2bd1b7de-e781-4e18-a714-8b7fce9aa5b3/image.png)
ItemWriter
스텝에서 한 번에 하나의 배치 또는 묶음의 출력을 나타내는 추상화 인터페이스
- 스프링 배치에서 출력을 담당하는 전략 인터페이스
- 아이템을 하나하나 쓰지 않고 묶어서 쓴다.
- Chunk 단위
![](https://velog.velcdn.com/images/ekxk1234/post/77e72065-5dc0-45b6-bcee-7ada7b8f76b1/image.png)
ItemWriter 흐름
![](https://velog.velcdn.com/images/ekxk1234/post/fd1ae770-8502-432d-b7c6-8a2fb4e67357/image.png)
스프링 배치의 잡 처리 흐름
![](https://velog.velcdn.com/images/ekxk1234/post/439f66b1-ccdf-4bdc-adf0-3ca401382f20/image.png)
스프링 배치의 스텝 처리 흐름
Processer가 없는 경우 : Step → ItemReader → ItemWriter
![](https://velog.velcdn.com/images/ekxk1234/post/ecc13067-91fe-459f-bd57-d2744b35ff11/image.png)
Processer가 존재하는 경우 : Step → ItemReader → ItemProcessor → ItemWriter
![](https://velog.velcdn.com/images/ekxk1234/post/120f3fa6-5cb1-476d-bcdc-496db4dc755b/image.png)
순서
스텝은 각각 순서를 지정 가능
![](https://velog.velcdn.com/images/ekxk1234/post/d4e32b7f-86f0-48f6-8b4b-bcce25232bd0/image.png)
분기
Step은 스텝의 종료(ExitStatus)를 패턴 매칭하여 다른 스텝으로 분기 가능
![](https://velog.velcdn.com/images/ekxk1234/post/c982d8be-5450-4823-9d48-711dd2fc1136/image.png)
출처 : FastCampus
Git 주소