반응형

@notepad_jj2

츄르사려고 코딩하는집사입니다.


Spring Batch

1. Spring Batch 정의 및 특징

1) Spring Batch는 Spring Framework의 3대 요소인 DI, AOP, 서비스 추상화 + Batch Application의 특성을 포함


2) Spring Batch는 Logging, 추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 최적화 및 파티셔닝 기술을 통해 대용량 레코드 처리 및 고성능 배치 작업을 할 수 있도록 서비스를 제공하는 필수적인 기능을 가지고 있다.


3) Spring Batch에서 배치 수행이 실패하면, 처음부터가 아닌 실패한 지점부터 다시 배치를 수행한다.


4) Spring Batch에서 중복 실행을 막기 위해 배치가 성공적으로 수행 됐으면 로그를 남기는데, 그 로그와 동일한 Parameter로 실행 시 Exception이 발생하도록 하고 있다.


5) Spring Batch는 Scheduler가 아니고, Spring Batch에서 Batch Job을 관리하지만, Job을 구동하거나 실행시키는 기능은 지원하지 않고 있다.

 

6) Spring에서 Batch Job을 실행시키기 위해서는 Quartz, Job Scheduler, Jenkins 등 전용 Scheduler를 사용해야 한다. 그래서, 대부분은 Spring Batch에 Quartz를 많이 사용한다. 즉, 정해진 스케쥴링에 따라 Quartz가 Spring Batch를 호출하여 Spring Batch를 실행하는 구조다.

 

2. Spring Batch 4.0에서 지원하는 Reader & Writer

 

여기서, 가장 많이 사용했던 것입니다.

DataSource 기술 비고
DataBase JDBC 페이징, 커서, 일괄 처리 사용 가능
DataBase JPA 페이징 사용
File XML XML 파싱

 

3. Spring Batch의 전체적인 틀

 

Batch DB에 저장되어 있는 데이터를 READ하고, READ한 데이터를 기반으로 스케쥴링을 돌려 ETL 후, NEW DATA를 만들어 다른 DB에 Write를 하는 틀을 가지고 있습니다.

 

4. Spring Batch 계층 구조

1) Application

- 개발자가 작성한 모든 배치 작업과 사용자 정의 코드

 

2) Batch Core

- 배치 작업을 시작하고 제어하는데 필요한 핵심 런타임 클래스

- JobLauncher, Job, Step

 

3) Batch Infrastructure

- 개발자와 Application에서 사용하는 Reader와 Writer, RetryTemplate 등의 서비스

 

즉, 개발자는 Application 계층의 비지니스 로직에 집중하고, Batch 실행, 동작과 관련된 것은 Batch Core에 있는 클래스스를 이용하여 제어할 수 있다.

 

5. Spring Batch 구조

Spring Batch structure

1) Tier

i) Run Tier

- Application의 예약 및 시작과 관련되어 있는 계층

- Batch Process의 시간 기반 및 스케쥴링을 제공하며, 병렬 처리 기능 제공

 

ii) Job Tier

- Batch Process의 전체 실행 담당

- Batch 단계를 순차적으로 실행하여 모든 단계가 올바른 상태인지 적절한 정책이 시행 되도록 함

- Job Launcher를 통해 Job이 돈다.

- Job Launcher 및 Job이 실행 될 때 JobExecution이 JobRepository에 저장 및 조회

 

iii) Application Tier

- 프로그램을 실행하는 데 필요한 구성 요소 포함

- 요구된 배치의 기능을 처리하고 Tasklet 실행에 대한 정책 시행

- 여기서, Step이 실행 중에 JobRepository에 StepExecution이 저장 및 조회

 

iv) Data Tier

- DB, Data File 등의 DataSource와 연결 제공

 

2) 색상 박스 구분

i) 노란색

- 스케쥴러 또는 DB와 같은 외부 Application

- Spring Batch와 별도로 고려되어야 한다는 점이 중요

 

ii) 주황색

- Application Service

- 대부분의 Service는 Spring Batch에서 제공

- 원하는 구조가 있으면 따로 수정할 수 있음

 

iii) 초록색

- 개발자가 구성해야 하는 파트

- 일정한 주기대로 작업이 시작되도록 설정

- 작업을 실행하는 방법 등

 

Spring Batch를 사용하는 이유

1. 일별, 월별, 연별 등의 기준에 따른 집계

- 실시간으로 데이터를 집계할 경우에는 데이터가 너무 많아 서버에 과부하가 걸려 서버가 다운될 수 있습니다. 그래서, 실시간 데이터 집계에 맞는 인프라가 구성되어 있다면 문제 없지만, 그렇지 않을 경우에는 아래와 같이 정해진 스케쥴링에 따라 Spring Batch를 실행하여 오더 데이터를 기준으로 기간별 집계 데이터를 만들어 고객사의 기간별 집계 데이터 요청에 응답을 할 수 있도록 하는 것이 Spring Batch를 사용하는 이유입니다.

 

2. ERP와의 연동

- 물류 분야에서 개발을 하게 되면, 해외 고객사들은 거의 Manhattan, SAP 등의 거대 ERP를 사용합니다.

그래서, Manhattan이나 SAP에서 Delivery Note를 내려 받고, DN(Delivery Note) 문서에서 데이터를 크롤링하여 SCM에 사용하곤 합니다.

이제, SCM에서 오더들을 처리하고, 그 결과와 현황을 ERP에 리턴해줘야 하는데, 여기서 사용되는 것이 Spring Batch입니다.


Spring Batch 용어

1. Job

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

- 즉, 전체 Batch Process를 캡슐화하는 객체.

- 다른 Spring Project와 같이, XML 또는 Java로 설정할 수 있다.

- Job은 1개 이상의 Step을 가지기 때문에, StepInstance의 컨테이너라고 할 수 있음

- Business Logic을 가지고 있는 각 Step을 결합하고, 모든 Step에 전역 속성을 설정할 수 있음

 

1) Job 설정에 필요한 구성 요소

i) 작업의 이름

ii) Step Instance의 정의 및 순서

iii) 작업 재시작 여부

 

2. JobInstance

- Job의 실행 단위를 나타낸다.
- Job을 실행시키게 되면 하나의 JobInstance가 생성된다.
- 오전에 Job을 실행하면 1개의 JobInstance가 생기고, 오후에 Job을 실행하면 또 다른 1개의 JobInstance가 생성된다. 그래서, 오전에 실행한 Job을 다시 실행하게 되면 JobInstance는 새로 생성되지 않고, 오전에 실행한 배치에 대해서만 다시 실행한다.

 

3. Job Execution

- JobExecution은 JobInstance의 실행 시도에 대한 객체
- 오전에 실행한 JobInstance가 실패한 경우에 다시 JobInstance를 실행해도 처음부터가 아닌 실패한 지점에서부터 다시 실행이 되는데, 이 경우에는 실패한 JobInstance와 다시 재실행한 JobInstance가 새로 생겨서 JobInstance의 상태, JobInstance의 생성 시간, 실행한 시작 시간, 종료 시간 등의 정보를 가지고 있어 History성처럼 사용된다.


4. Step

- Step은 Job의 배치처리를 정의하고 순차적인 단계를 캡슐화
- Job은 1개 이상의 Step을 가져야 함
- Job의 실제 일괄 처리를 제어하는 모든 정보가 들어 있음
- Step은 Tasklet 처리 방식과 Chunk 지향 처리 방식을 지원


5. StepExecution

- JobExecution과 돌일하게 Step의 실행 시도에 대한 객체
- Job이 여러 개의 Step으로 구성되어 있을 경우 이전 단계의 Step이 실패하게 되면 다음 단계가 실행되지 않아 실패 이후의 StepExecution이 생성되지 않음
- 실제 시작이 될 때만 StepExecution이 생성
- JobExecution이 가지는 정보에 read 수, write 수, commit 수, skip 수 등의 정보도 저장


6. ExecutionContext

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


7. JobRepository

- 모든 Batch 처리 정보를 담고있는 Repository
- Job이 실행되면 JobRepository에 JobExecution과 StepExecution을 생성
- JobRepository에서 Execution 정보를 저장하고 조회


8. JobLauncher

- Job과 JobParameters를 사용하여 Job을 실행하는 객체


9. ItemReader

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


10. ItemWriter

- 처리된 데이터를 Insert 또는 update 또는 Send(Queue 사용) 할 때 사용
- ItemWriter는 ItemReader처럼 다양한 인터페이스가 존재하며 Writer는 Item을 Chunk로 묶어 처리


11. ItemProcessor

- Reader에서 읽어온 Item 데이터를 처리
- ItemProcessor는 Batch를 처리하는데 필수 요소는 아니며, ItemReader, ItemWriter, ItemProcessor 처리를 분리하여 각 역할을 명확하게 구분


Job

1. Job의 구조

 

1) Job은 1개 이상의 Step을 가져야 한다.(1:N 구조)

2) Job은 1개 이상의 StepInstance를 가질 수 있다.(1:N 구조)

3) 1개의 Step은 ItemReader, ItemProcessor, ItemWriter를 1개씩 가진다.(1:1 구조)

 

2. Job의 프로세스

- Job은 실행될 때마다 JobInstance가 생성된다.

- 여기서, JobInstance가 실행되면, 실행 될 때마다 JobExecution이 생성이 된다.

- JobExecution을 생성해서 실행에 실패하면, 다시 JobInstance를 실행할 때, JobExecution의 상태를 보고 Failed와 같이 실패를 했으면 다시 실행을 한다.(CASE 1)

- JobExecution을 생성해서 실행에 성공하면, 다시 JobInstance를 실행할 때, JobExecution의 상태를 보고 Success와 같이 성공을 했으면 Exception을 던진다.(CASE 2)

 

3. Job 생성

- Job 객체를 만드는 Builder는 대표적으로 여러 빌더를 통합하여 처리하는 JobBuilderFactory가 있습니다.

- 이 JobBuilderFactory로 Job을 쉽게 만들 수 있음

public class JobBuilderFactory {
    private JobRepostiroy jobrepository;

    public JobBuilderFactory(JobRepository jobRepository){
        this.jobrepository = jobrepository;
    }

    public JobBuilder get(String name){
        JobBuilder builder = new JobBuilder(name).repository(jobrepository);
        return builder;
    }
    
}

 



참고자료


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://deeplify.dev/back-end/spring/batch-architecture-and-components

 

https://cheese10yun.github.io/spring-batch-basic/

 

 

 

 

 

 

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기