개발 기록

> [Spring Batch] 스프링 배치 - 1. 입문 (개념과 흐름 파악) 본문

Spring

> [Spring Batch] 스프링 배치 - 1. 입문 (개념과 흐름 파악)

1z 2022. 10. 25. 13:23

1. 개념

스프링 배치 : 배치(일괄적인 반복 처리작업) 애플리케이션을 개발할 수 있도록 설계된  배치 프레임워크

 

(1) 기능과 특징

  • 트랜잭션관리
  • 청크 기반 처리
  • 선언적 I/O
  • 시작/중지/재 시작
  • 재시도/건너뛰기
  • 최적화 및 파티셔닝 기술
  • 로깅/추적

 

 

  사용 예

- 특정한 시점에 스케쥴러를 통해 자동화된 작업 (ex. 푸시알림, 월 별 리포트)

- 대량 정보의 자동화된 복잡한 처리. (ex. 시간 기반 이벤트:  월말 계산, 통지 또는 서신)

- 복잡한 비즈니스 규칙의 주기적 적용(예: 보험 혜택 결정 또는 요율 조정)

- 대용량 데이터의 포맷을 변경, 유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야하는 경우 (ex. 데이터 백업)


 

2. 배치 입문  

 

(1) 흐름

실행순서
JobLancher -> Job/JobParameter -> JobRepository -> new JobInstance vs Origin JobInstance

 

1. Job Launcher  매개변수로 전달된 특정 작업에 대한 작업 실행을 시작하고 JobRepository 를 통해 데이터베이스에 JobInstance를 등록한다.

2. Job이 실행되기 전, JobLauncher JobExecution, JobInstance, ExecutionContext를 만들어둔다. 이 때, BatchStatus.Started 설정해준다.

2. JobRepository 를 통해 작업 실행이 시작되었음을 등록하고 I/O 레코드, 상태, 작업 실행 완료와 같은 정보를 데이터베이스에 업데이트 한다.

3. Job은 실행 전 JobListner의 Before 메서드와 관련된 것이 있다면 수행한다.

4. 작업은 작업 실행 프로그램에서 실행되며, 작업 실행 컨텍스트에서 작업의 필요에 따라 상태 및 통계와 같은 메타 정보를 업데이트 한다. JobExecution은 Job의 "물리적" 실행을 나타낸다.

5. Step에 등록된 것을 순서대로 실행한다. 이 때, Step은 실행되면서 StepExecution, ExecutionContext를 만든다.

6. Step이 모두 실행되면 Listener에 등록된 After 메서드가 있는지 확인하고 수행한다.

7. Job이 수행이 완료되면, 2에서 만들어둔 JobExecution의 상태를 마지막으로 실행된 StepExecution의 상태와 동일하게 만들어둔다. 이 때, 마지막 Step이 실패했으면 JobExecution도 실패상태가 된다. 

 

★ 실행 특징

☞  배치가 실패하여 작업 재시작을 하게 된다면 처음부터가 아닌 실패한 지점부터 실행

☞  중복 실행을 막기 위해 성공한 이력이 있는 Batch는 동일한 Parameters로 실행 시 Exception 발생

☞  Spring에서 Batch Job을 실행시키기 위해서는 Quartz, Scheduler, Jenkins등 전용 Scheduler 사용

 

 

(2) 배치 용어

 

Job






Job - 배치 계층 구조에서 가장 상위에 있는 개념으로서 하나의 배치 작업을 의미
JobInstance - Job 의 실행 단위로 실행 단위 별 하나의 JobInstance 생성
ex. 1월 1일 A  JobInstance, 1월 2일 B JobInstance

- 처리 실패시 재실행 하더라도 해당  JobInstance는 본인이 맡은  job 만 처리한다. 

JobParameters - JobInstance 구별자 또는 매개변수
JobExecution - JobInstance 에 대한 실행 시도에 대한 객체 
ex. 2번 실행 시도하면 2개의 JobExecution 생성

- JobInstance 실행에 대한 상태,시작시간, 종료시간, 생성시간 등의 정보 저장
JobRepository 메타데이터 저장소(모든 배치 처리정보를 담고있는 매커니즘)

- Job이 실행 시 JobRepository에 JobExecution, StepExecution 생성
- Execution 정보들을 저장하고 조회하며 사용한다.

JobLauncher 특정 작업에 대한 작업 실행을 시작
ex. jobLauncher .run("작업 이름", jobParameters);
Step





Step Step은 Job의 배치처리를 정의하고 순차적인 단계를 캡슐화 합니다. 
StepExecution - Step 실행 시도에 대한 객체
- 실제 시작이 될 때만 생성된다.
- JobExecution에 저장되는 정보, (read, write, commit , skip count) 등 정보 저장

ItemReader read
ItemWriter insert, update or send
ItemProcessor 데이터 처리 (write 전에 비즈니스 로직 적용 시)
Tasklet 각 step 에서 실행되는 로직
  ExecutionContext - 데이터를 공유 할 수 있는 데이터 저장소
( JobExecutionContext , StepExecutionContext )

- JobExecutionContext의 경우 Commit 시점에 저장
- StepExecutionContext는 실행 사이에 저장
- ExecutionContext를 통해 Step간 Data 공유가 가능
- Job 실패시 ExecutionContext를 통한 마지막 실행 값을 재구성 할 수 있다.

 

 


 

3. Step 을 구성하는 Tasket & Chunk 지향 처리

(1) Tasklet 처리 방식 

Tasklet은 하나의 메서드로 구성 되어있다. 이 메서드는 실패를 알리기 위해 예외를 반환 하거나 throw할 때까지 execute를 반복적으로 호출한다.

 

 

(2) Chunk 지향 처리 방식

1. 읽기 => 처리 (생략 가능) =>  쓰기 흐름로 실행 된다.

2. Chunk : 처리 되는 커밋 row 수

3. chunk 단위로 Transaction을 수행하기 때문에 실패시 Chunk 단위 만큼 rollback

 

 

 

 

(3) 배치 DataSourece 유형 

DataSource 기술 설명
Database JDBC 페이징, 커서, 일괄 업데이트 등 사용 가능 (JdbcBatchItemWriter)
Database Hibernate 페이징, 커서 사용 가능
Database JPA 페이징 사용 가능 (JpaPaginItemReader, JpaItemWriter)

File Flat file 지정한 구분자로 파싱 지원  (PlatFileItemReader)
File XML XML 파싱 지원

 

 

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

 


 

4. 스프링 배치 메타 데이터

* 메타 데이터: 데이터를 설명하는 데이터

Spring Batch의 메타 데이터는 다음과 같은 내용들을 담고 있다.

 

1. 이전에 실행한 Job

2. 최근 실패한 Batch Parameter & 성공한 Job

3. 재실행 지점

4. Job 에 대한 정보 ( Step 종류, 성공 Step ,실행 Step)

 

(1) 테이블 설명

  BATCH_JOB_EXECUTION_CONTEXT
: Job의 실행 하는 동안 여러가지 상태정보, 공유 데이터를 직렬화(Json 형식)해서 저장한다.
Step 간 서로 공유 가능하다.

 BATCH_JOB_EXECUTION_PARAMS
: Job과 함께 실행되는 JobParameter 정보.

  BATCH_JOB_INSTANCE
: Job 파라미터에 따라 생성되는 테이블
: Job이 실행될 때 JobInstance 정보가 저장되며 job_name과 job_key를 키로 하여 하나의 데이터가 저장된다.
: 동일한 job_name과 job_key로 중복 저장될 수 없다.

 BATCH_JOB_EXECUTION
: Job의 실행정보(성공,실패 내역)가 저장되며 Job 생성, 시간, 종료 시간, 실행상태, 메시지 등을 관리한다.

 BATCH_STEP_EXECUTION
: Step의 실행정보가 저장되며 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리한다.

 BATCH_STEP_EXECUTION_CONTEXT
: Step의 실행 하는 동안 여러가지 상태정보, 공유 데이터를 직렬화(Json 형식) 해서 저장한다.
: Step별로 저장되며 Step간 서로 공유할 수 없다.

 

 

 

 

 

 

 

참고

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