개발 기록
> [Spring Batch] 스프링 배치 - 1. 입문 (개념과 흐름 파악) 본문
■
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간 서로 공유할 수 없다. |
참고
'Spring' 카테고리의 다른 글
| > [Spring Batch] Job, Step 속성 (0) | 2022.10.28 |
|---|---|
| > [AOP] 3. 포인트컷(PointCut)의 다양한 표현식 (0) | 2022.10.27 |
| > [Spring Batch] Scope(@StepScope, @JobScope) & Job Parameter - 1. Job Parameter (0) | 2022.10.17 |
| > [AOP] 2. Aspect 생성과 지시자 사용 (0) | 2022.10.06 |
| > [AOP] 1. 개념 (0) | 2022.10.04 |