1. 스프링 배치 소개
개요
배치 처리에 요구하는 재사용 가능한 자바 기반 배치 아키텍처 표준의 필요성이 대두
배치 핵심 패턴
- Read - 데이터베이스, 파일, 큐에서 다량의 데이터 조회한다
- Process - 특정 방법으로 데이터를 가공한다
- Write - 데이터를 수정된 양식으로 다시 저장한다
배치 시나리오
- 배치 프로세스를 주기적으로 커밋
- 동시 다발적인 Job의 배치 처리, 대용량 병렬 처리
- 의존관계가 있는 step 여러 개를 순차적으로 처리
- 조건적 Flow 구성을 통한 체계적이고 유연한 배치 모델 구성
- 반복, 재시도, Skip 처리
아키텍처

(출처: https://docs.spring.io/spring-batch/docs/4.3.x/reference/html/images/spring-batch-layers.png)
Application
- 스프링 배치 프레임워크를 통해 개발자가 만든 모든 배치 Job과 커스텀 코드를 포함
- 개발자는 업무로직의 구현에만 집중하고 공통적인 기반기술을 프레임웍이 담당하게 한다
Batch Core(Job 명세서)
- Job을 실행, 모니터링, 관리하는 API로 구성되어 있다
- JobLauncher, Job, Step, Flow 등이 속한다
Batch Infrastructure
- Application, Core 모두 공통 Infrastructure 위에서 빌드한다
- Job 실행의 흐름과 처리를 위한 틀을 제공함
- Reader, Processor Writer, Skip, Retry 등이 속한다
2. 스프링 배치 시작
프로젝트 구성
https://start.spring.io 에서 생성
스프링 배치 활성화
• @EnableBatchProcessing
스프링 배치가 작동하기 위해 선언해야 하는 어노테이션

- 총 4개의 설정 클래스를 실행시키며 스프링 배치의 모든 초기화 및 실행 구성이 이루어진다
- 스프링 부트 배치의 자동 설정 클래스가 실행됨으로 빈으로 등록된 모든 Job 을 검색해서 초기화와 동시에 Job 을 수행하도록 구성됨
스프링 배치 초기화 설정 클래스
1. BatchAutoConfiguration
• 스프링배치가 초기화 될 때 자동으로 실행되는 설정 클래스
• Job 을 수행하는 JobLauncherApplicationRunner 빈을 생성
2. SimpleBatchConfiguration
• JobBuilderFactory 와 StepBuilderFactory 생성
• 스프링배치의 주요 구성 요소 생성-프록시 객체로 생성됨
3. BatchConfigurerConfiguration
• BasicBatchConfigurer
- SimpleBatchConfiguration 에서 생성한 프록시 객체의 실제 대상 객체를 생성하는 설정 클래스
- 빈으로 의존성 주입 받아서 주요 객체들을 참조해서 사용할 수 있다
• JpaBatchConfigurer
- JPA관련 객체를 생성하는 설정 클래스
• 사용자 정의 BatchConfigurer 인터페이스를 구현하여 사용할 수 있음

Job 이 구동되면 Step 을 실행하고 Step 이 구동되면 Taskelt 을 실행하도록 설정함

DB스키마 생성
- 스프링 배치의 실행 및 관리를 위한 목적으로 여러 도메인들(Job, Step, JobParameters..) 의 정보들을 저장, 업데이트, 조회할 수 있는 스키마 제공
- 실행이력과, 성공과 실패 여부 등을 관리해 리스크 발생시 빠른 대처 가능
- DB 연동 시 메타 테이블이 생성 필수
- 파일 위치 : /org/springframework/batch/core/schema-*.sql
- DB 유형별로 제공

( 출처: https://docs.spring.io/spring-batch/docs/3.0.x/reference/html/metaDataSchema.html )
- Job 이 실행될 때 JobInstance 정보가 저장되며 job_name과 job_key를 키로 하여 하나의 데이터가 저장
- 동일한 job_name 과 job_key 로 중복 저장될 수 없다
- job 의 실행정보가 저장되며 Job 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리
- Job과 함께 실행되는 JobParameter 정보를 저장
- Job 의 실행동안 여러가지 상태정보, 공유 데이터를 직렬화 (Json 형식) 해서 저장
- Step 간 서로 공유 가능함
- Step 의 실행정보가 저장되며 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리
- Step 의 실행동안 여러가지 상태정보, 공유 데이터를 직렬화 (Json 형식) 해서 저장
- Step 별로 저장되며 Step 간 서로 공유할 수 없음
Job 관련 테이블
•BATCH_JOB_INSTANCE
| JOB_INSTANCE_ID | 고유하게 식별할 수 있는 기본 키 |
| VERSION | 업데이트 될 때 마다 1씩 증가 |
| JOB_NAME | Job 을 구성할 때 부여하는 Job 의 이름 |
| JOB_KEY | job_name과 jobParameter 를 합쳐 해싱한 값을 저장 |
•BATCH_JOB_EXECUTION
| JOB_EXECUTION_ID | JobExecution 을 고유하게 식별할 수 있는 기본 키, JOB_INSTANCE 와 일대 다 관계 |
| VERSION | 업데이트 될 때마다 1씩 증가 |
| JOB_INSTANCE_ID | JOB_INSTANCE 의 키 저장 |
| CREATE_TIME | 실행(Execution)이 생성된 시점을 TimeStamp 형식으로 기록 |
| START_TIME | 실행(Execution)이 시작된 시점을 TimeStamp 형식으로 기록 |
| END_TIME | 실행이 종료된 시점을 TimeStamp으로 기록하며 Job 실행 도중 오류가 발생해서 Job 이 중단된 경우 값이 저장되지 않을 수 있음 |
| STATUS | 실행 상태 (BatchStatus)를 저장 (COMPLETED, FAILED, STOPPED…) |
| EXIT_CODE | 실행 종료코드(ExitStatus) 를 저장 (COMPLETED, FAILED…) |
| EXIT_MESSAGE | Status가 실패일 경우 실패 원인 등의 내용을 저장 |
| LAST_UPDATED | 마지막 실행(Execution) 시점을 TimeStamp 형식으로 기록 |
•BATCH_JOB_EXECUTION_PARAMS
| JOB_EXECUTION_ID | JobExecution 식별 키, JOB_EXECUTION 과는 일대다 관계 | |
| TYPE_CD | STRING, LONG, DATE, DUBLE 타입정보 | |
| KEY_NAME | 파라미터 키 값 | |
| STRING_VAL | 파라미터 문자 값 | |
| DATE_VAL | 파라미터 날짜 값 | |
| LONG_VAL | 파라미터 LONG 값 | |
| DOUBLE_VAL | 파라미터 DOUBLE 값 | |
| IDENTIFYING | 식별여부 (TRUE, FALSE) |
•BATCH_JOB_EXECUTION_CONTEXT
| JOB_EXECUTION_ID | JobExecution 식별 키, JOB_EXECUTION 마다 각 생성 |
| SHORT_CONTEXT | JOB 의 실행 상태정보, 공유데이터 등의 정보를 문자열로 저장 |
| SERIALIZED_CONTEXT | 직렬화(serialized)된 전체 컨텍스트 |
Step 관련 테이블
•BATCH_STEP_EXECUTION
| STEP_EXECUTION_ID | Step 의 실행정보를 고유하게 식별할 수 있는 기본 키 |
| VERSION | 업데이트 될 때마다 1씩 증가 |
| STEP_NAME | Step 을 구성할 때 부여하는 Step 이름 |
| JOB_EXECUTION_ID | JobExecution 기본키, JobExecution 과는 일대 다 관계 |
| START_TIME | 실행(Execution)이 시작된 시점을 TimeStamp 형식으로 기록 |
| END_TIME | 실행이 종료된 시점을 TimeStamp 으로 기록하며 Job 실행 도중 오류가 발생해서 Job 이 중단된 경우 값이 저장되지 않을 수 있음 |
| STATUS | 실행 상태 (BatchStatus)를 저장 (COMPLETED, FAILED, STOPPED…) |
| COMMIT_COUNT | 트랜잭션 당 커밋되는 수를 기록 |
| READ_COUNT | 실행시점에 Read한 Item 수를 기록 |
| FILTER_COUNT | 실행도중 필터링된 Item 수를 기록 |
| WRITE_COUNT | 실행도중 저장되고 커밋된 Item 수를 기록 |
| READ_SKIP_COUNT | 실행도중 Read가 Skip 된 Item 수를 기록 |
| WRITE_SKIP_COUNT | 실행도중 write가 Skip된 Item 수를 기록 |
| PROCESS_SKIP_COUNT | 실행도중 Process가 Skip 된 Item 수를 기록 |
| ROLLBACK_COUNT | 실행도중 rollback이 일어난 수를 기록 |
| EXIT_CODE | 실행 종료코드(ExitStatus) 를 저장 (COMPLETED, FAILED…) |
| EXIT_MESSAGE | Status가 실패일 경우 실패 원인 등의 내용을 저장 |
| LAST_UPDATED | 마지막 실행(Execution) 시점을 TimeStamp 형식으로 기록 |
•BATCH_STEP_EXECUTION_CONTEXT
| STEP_EXECUTION_ID | StepExecution 식별 키, STEP_EXECUTION 마다 각 생성 |
| SHORT_CONTEXT | STEP 의 실행 상태정보, 공유데이터 등의 정보를 문자열로 저장 |
| SERIALIZED_CONTEXT | 직렬화(serialized)된 전체 컨텍스트 |
3. 스프링 배치 도메인 이해
- 도메인 이해 – JobInstance, JobExecution, StepExecution, ExecutionContext, JobParameter, JobRepository, JobLauncher
Job
Job
기본 개념
- 배치 계층 구조의 최상위 개념, 하나의 배치 작업을 의미
- Job Configuration을 통해 생성되는 배치 작업 정의 객체
- 여러 Step을 포함하는 컨테이너 (최소 1개 이상의 Step 필요)
- 순차적으로 Step 을 실행시키는 Job
- 특정한 조건과 흐름에 따라 Step 을 구성하여 실행시키는 Job

JobInstance
기본 개념
• Job이 실행될 때 생성되는 Job의 논리적 실행 단위 객체로서 고유하게 식별 가능한 작업 실행을 나타냄
• Job의 설정과 구성은 동일하지만 Job이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job의 실행을 구분해야 함
- 예를 들어 하루에 한 번 씩 배치 Job이 실행된다면 매일 실행되는 각각의 Job 을 JobInstance 로 표현합니다.
JobInstance 생성 및 실행
• 새 Job + JobParameter → 새로운 JobInstance 생성
• 동일 Job + JobParameter → 기존 JobInstance 재사용
- 내부적으로 JobName + jobKey (jobParametes 의 해시값) 를 가지고 JobInstance 객체를 얻음
• Job 과는 1:M 관계
BATCH_JOB_INSTANCE 테이블과 매핑
• JOB_NAME (Job) 과 JOB_KEY (JobParameter 해시값) 가 동일한 데이터는 중복해서 저장할 수 없음

JobParameters
기본 개념
- Java -jar LogBatch.jar requestDate=20210101
- JobParameterBuilder, DefaultJobParametersConverter
- @Value(“#{jobParameter[requestDate]}”), @JobScope, @StepScope 선언 필수
JobExecution
- 시작시간, 종료시간 ,상태(시작됨,완료,실패),종료상태의 속성을 가짐
- JobExecution은 'FAILED' 또는 'COMPLETED‘ 등의 Job의 실행 결과 상태를 가지고 있음
- JobExecution 의 실행 상태 결과가 'COMPLETED’ 면 JobInstance 실행이 완료된 것으로 간주해서 재실행이 불가함
- JobExecution 의 실행 상태 결과가 'FAILED’ 면 JobInstance 실행이 완료되지 않은 것으로 간주해서 재실행이 가능함
- JobParameter 가 동일한 값으로 Job 을 실행할지라도 JobInstance 를 계속 실행할 수 있음
- JobExecution 의 실행 상태 결과가 'COMPLETED’ 될 때까지 하나의 JobInstance 내에서 여러 번의 시도가 생길 수 있음
Step
- 가장 기본이 되는 클래스로서 Tasklet 타입의 구현체들을 제어한다
- 멀티 스레드 방식으로 Step 을 여러 개로 분리해서 실행한다
- Step 내에서 Job 을 실행하도록 한다
- Step 내에서 Flow 를 실행하도록 한다


StepExecution
- 시작시간, 종료시간 ,상태(시작됨,완료,실패), commit count, rollback count 등의 속성을 가짐
- Step의 StepExecution 이 모두 정상적으로 완료 되어야 JobExecution이 정상적으로 완료된다
- •Step의 StepExecution 중 하나라도 실패하면 JobExecution 은 실패한다
StepContribution

JobRepository

JobLanuncher
- JobLanucher.run(Job, JobParameters)
- 동기적 실행(SyncTaskExecutor, 기본값)
- JobExecution 을 획득하고 배치 처리를 최종 완료한 이후 Client 에게 JobExecution 을 반환
- 스케줄러에 의한 배치처리에 적합
- 비동기적 실행(SimpleAsyncTaskExecutor )
- JobExecution 을 획득한 후 Client 에게 바로 JobExecution 을 반환하고 배치처리를 완료한다
- HTTP 요청에 의한 배치처리에 적합

4. 스프링 배치 청크 프로세스
Chunk
- Chunk 란 여러 개의 아이템을 묶은 하나의 덩어리(Block)
- 한번에 하나씩 아이템을 입력 받아 Chunk 단위의 덩어리로 만든 후 Chunk 단위로 트랜잭션을 처리함, 즉 Chunk 단위의 Commit 과 Rollback 이 이루어짐
- 일반적으로 대용량 데이터를 한번에 처리하는 것이 아닌 청크 단위로 쪼개어서 더 이상 처리할 데이터가 없을 때까지 반복해서 입출력하는데 사용됨

- Chunk<I> vs Chunk<O>
- Chunk<I> 는 ItemReader 로 읽은 하나의 아이템을 Chunk 에서 정한 개수만큼 반복해서 저장하는 타입
- Chunk<O> 는 ItemReader 로부터 전달받은 Chunk<I> 를 참조해서 ItemProcessor 에서 적절하게 가공, 필터링한 다음 ItemWriter 에 전달하는 타입

아키텍처


5. 스프링 배치 멀티 스레드 프로세싱
스프링 배치 스레드 모델
• 스프링 배치는 기본적으로 단일 스레드 방식으로 작업을 처리한다
• 성능 향상과 대규모 데이터 작업를 위한 비동기 처리 및. Scaleout기능을 제공한다
• Local 과 Remote 처리를 지원한다
1. AsyncItemProcessor / AsyncItemWriter
• ItemProcessor 에게 별도의 스레드가 할당되어 작업을 처리하는 방식
2. Multi-threaded Step
• Step 내 Chunk 구조인 ItemReader, ItemProcessor, ItemWriter 마다 여러 스레드가 할당되어 실행 하는 방법
3. Remote Chunking
• 분산환경처럼 Step 처리가 여러 프로세스로 분할되어 외부의 다른 서버로 전송되어 처리하는 방식
4. Parallel Steps
• Step 마다 스레드가 할당되어 여러개의 Step을 병렬로 실행하는 방법
5. Partitioning
• Master/Slave 방식으로서 Master 가 데이터를 파티셔닝 한 다음 각 파티션에게 스레드를 할당하여 Slave 가 독립적으로 작동하는 방식
참고자료
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard
'cs > dev' 카테고리의 다른 글
| [DB]파티셔닝? 샤딩? 레플리케이션? (partitioning? sharding? replication?) (0) | 2025.10.16 |
|---|---|
| [CS]RDB단점과 NoSQL이란? (0) | 2025.10.16 |
| [CS]프로세스, 스레드, 멀티태스킹, 멀티스레딩, 멀티프로세싱, 멀티프로그래밍까지 (0) | 2025.09.27 |
| 2022년 한이음 ICT 멘토링 후기 [공공데이터를 이용한 마이데이터 서비스 개발] (0) | 2025.09.26 |
| 2022년 한이음 ICT 멘토링 후기[챗봇을 활용한 학사관리 시스템 구축] (0) | 2025.09.26 |