Spring Batch 입문에서 운영까지 시리즈 마지막 48편. 공식 FAQ 7가지 + 자주 만나는 운영 Q&A, 1~48편 완주 회고, 입문자 → 운영자 학습 경로, Spring Batch 6.0 의 핵심 변경 종합, 시리즈 1 (자바 백엔드 입문 59편) + 시리즈 2 (데이터 인프라 130편) + 시리즈 3 (Spring Batch 48편) 의 통합 학습 그림, 더 깊은 학습 자료까지. 237편 누적 학습 노트의 마무리.
Spring Batch 입문에서 운영까지 시리즈 48편 중 마지막 48편. 1편 Spring Batch 입문 부터 시작해 48주제 의 학습 노트를 마무리해요. FAQ + 회고 + 학습 가이드.
Part 1: 공식 FAQ 7가지
Spring Batch 공식 문서의 자주 묻는 질문 정리 + 시리즈 글 연결.
Q1: 여러 thread · process 로 Job 실행 가능?
A — 3가지 방법. 단 정말 필요한지 검토 우선.
- Step 에 TaskExecutor 추가 (37편 Multi-threaded Step) —
TaskExecutor(쓰레드 풀 실행기) 를 끼우는 방식이고, Step 이 idempotent (같은 입력 = 같은 결과) 일 때만 안전 - PartitionStep (37편 Partitioning) — Step 을 partition 단위로 쪼개 병렬 실행하는 구조라 IO 집약 batch 권장,
scope="step"필수 - Remote Chunking (44편) — chunk 를 원격 worker 에 분배하는 패턴이라 JMS (Java Messaging Service) 등 durable middleware (메시지 유실 없는 미들웨어) 필요
→ 측정 후 결정. Partitioning 이 가장 안전.
Q2: ItemReader 를 thread-safe 하게?
A — read() 를 synchronized wrapping (동기화로 감싸기).
→ 25편 SynchronizedItemStreamReader. 단:
- 재시작 안전성 잃음
- step 을 non-restartable 로 mark
- saveState=false 권장 (36편)
Q3: 프레임워크 클래스 extend 권장?
A — 비권장. Composition (조합) 또는 fork (포크) 권장.
Generally you can expect anything at the top level of org.springframework.batch.* to be public, but not necessarily sub-classable. Extending our concrete implementations is discouraged. — 공식 reference
→ 인터페이스만 의존 = 최대 portability (이식성).
Q4: Spring Batch vs Quartz?
A — 서로 다른 목적. 함께 사용 가능.
| Spring Batch | Quartz | |
|---|---|---|
| 목적 | 대용량 데이터 처리 | task scheduling |
| chunk·transaction | ✓ | X |
| Cron · 시간 trigger | X | ✓ |
일반적 조합 — Quartz 가 cron trigger + Spring Batch 가 처리. 또는 43편 Spring Integration messaging trigger.
Q5: Spring Batch Job scheduling?
A — 별도 scheduling 도구 사용. Spring Batch 는 scheduler 가 아님.
옵션:
- Quartz — Java 표준
- OS cron — 가벼움
- Control-M · Autosys — enterprise scheduler (기업용 스케줄러)
- Spring @Scheduled — 가장 단순
@Scheduled(cron = "0 0 2 * * *")
public void launchDailyJob() throws Exception {
JobParameters params = new JobParametersBuilder()
.addLong("run.id", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(dailyJob, params);
}
Q6: 성능 · 확장성 최적화?
A — Step 의 책임. 37편 6가지 scaling 전략 종합:
- Multi-threaded Step
- Parallel Steps
- Local Chunking (v6 신규)
- Remote Chunking
- Partitioning
- Remote Step (v6 신규)
→ 측정 + 적절한 전략 선택.
Q7: Messaging 으로 batch 확장?
A — SEDA (Staged Event-Driven Architecture) 패턴.
A pipeline approach to batch processing is highly beneficial, leading to resilience and high throughput. — 공식 reference
→ 42·43·44편 Spring Batch Integration. 메시지 기반 batch.
Part 2: 운영 Q&A — 자주 만나는 자리
Q: 같은 parameter 로 Job 다시 못 돌리나요?
A — JobInstance already exists — 같은 identifying parameter (식별용 파라미터) 의 COMPLETED JobInstance 가 재실행 불가.
해결:
1. run.id timestamp 추가 (가장 흔함) — 21편·43편
2. JobParametersIncrementer (파라미터 자동 증가기) — 자동 증가
3. JOB_KEY 직접 정리 (실수 위험) — 47편
Q: Job 이 STARTED 상태로 멈췄어요
A — JVM crash · kill -9 · OOM 가능성. abnormal termination (비정상 종료).
해결 (47편):
UPDATE BATCH_JOB_EXECUTION
SET STATUS = 'ABANDONED',
EXIT_CODE = 'ABANDONED',
END_TIME = NOW(),
VERSION = VERSION + 1
WHERE JOB_EXECUTION_ID = ?;
→ 그 후 재시작 가능 상태.
Q: Chunk size 어떻게 정하나요?
A — 측정 + 데이터 특성.
권장 시작점: - DB → DB = 500~1000 - 외부 API 호출 = 10~50 (API rate-limit) - 큰 객체 (메모리 부담) = 50~200 - 단순 라인 변환 = 1000+
측정 — chunk size 변경 + throughput (처리량) 측정 + 메모리 모니터링.
Q: Skip vs Retry 언제?
A — 데이터의 근본 성격.
| Skip | Retry | |
|---|---|---|
| 의미 | invalid (영구) | transient (일시) |
| 예 | 잘못된 데이터 row | DB deadlock · API 503 |
| 입력 | 같은 입력 다시 = 같은 실패 | 같은 입력 다시 = 성공 가능 |
→ 14편·15편·39편. 둘 다 적용 가능 (다른 예외 type).
Q: ExecutionContext vs DB column?
A — 데이터의 크기·중요도.
| 자리 | 권장 |
|---|---|
| 소량 state (position·count) | ExecutionContext |
| 대량 데이터 | DB column |
| 다른 batch 와 공유 | DB column |
| 운영자 가시성 필요 | DB column |
| Spring Batch 내부 사용 | ExecutionContext |
→ 24편·36편 Process Indicator (처리 표시자) 비교.
Q: 운영 환경 schema 자동 생성?
A — spring.batch.jdbc.initialize-schema: never + DBA 명시 schema.
자동 생성 = 실수 시 prod 데이터 손실. 운영 안전선.
Q: Multi-threaded Step 에서 Reader thread-safety?
A — 대부분 reader NOT thread-safe:
| Reader | thread-safe |
|---|---|
| FlatFileItemReader | X |
| JdbcCursorItemReader | X |
| StaxEventItemReader | X |
| JdbcPagingItemReader | ✓ |
| KafkaItemReader | (partition 단위 안전) |
해결 = 25편 SynchronizedItemStreamReader wrap 또는 Partitioning 전환.
Part 3: 1~48편 완주 회고
Part 1 — 입문·기본 (1~4편)
무엇을 배웠나 — Spring Batch 의 존재 이유, 기본 도메인 객체 5개 (Job · JobInstance · JobExecution · Step · StepExecution), Spring Batch 6 의 새 기능들.
핵심 — 대량 처리 + restart 안전성 + transaction 관리 = Spring Batch 의 3대 가치.
Part 2 — Job 설정·실행 (5~10편)
무엇을 배웠나 — JobRepository · JobOperator · JobLauncher 의 역할 분담, ResourcelessJobRepository (v6), CommandLineJobOperator (v6), Job parameter validation, JobExplorer 의 metadata 조회.
핵심 — Job 의 lifecycle + 실행 컨트롤 plane. @EnableBatchProcessing vs DefaultBatchConfiguration 선택.
Part 3 — Step·Chunk Processing (11~18편)
무엇을 배웠나 — chunk-oriented processing 의 내부 메커니즘, restart 위치 추적, skip · retry · transaction attributes, ItemStream 등록의 6가지 자리, Step Listener 6종.
핵심 — chunk 가 Spring Batch 의 심장. transaction · skip · retry · ItemStream 이 한 chunk 안에서 함께 동작.
Part 4 — TaskletStep · Flow Control (19~21편)
무엇을 배웠나 — TaskletStep 의 단발 작업, Flow Control 의 5 패턴 (sequential · conditional · decision · split · stop&restart), Late Binding + StepScope/JobScope.
핵심 — chunk 외 자리 + Job 의 흐름 설계. Late Binding 으로 Job 시작 시점에 동적 주입.
Part 5 — ItemReader · ItemWriter 기본 (22~26편)
무엇을 배웠나 — read()·write(Chunk) 의 contract, Delegate Pattern 의 ItemStream 등록 함정, 표준 구현체 카탈로그, Custom Reader/Writer 작성, idempotency 원칙.
핵심 — 데이터 입출력 의 표준 추상화. 대부분 운영에서는 표준 구현체 + Late Binding 으로 충분.
Part 6 — File · DB Reader/Writer 심화 (27~34편)
무엇을 배웠나 — Flat File · XML · JSON · Multi-file 의 reader/writer 옵션, Database 의 cursor vs paging, JdbcBatchItemWriter UPSERT 패턴, flush 시점 함정.
핵심 — 실전 데이터 포맷 별 깊은 옵션. 운영 환경의 80% 이상이 이 자리.
Part 7 — ItemProcessor · 재사용 (35~36편)
무엇을 배웠나 — ItemProcessor 의 3가지 반환 (non-null · null filter · 예외 skip), CompositeItemProcessor 체인, ValidatingItemProcessor, 기존 Service wrap (ItemReaderAdapter), Process Indicator 패턴.
핵심 — 변환·필터·검증의 자리. null = filter, 예외 = skip 의 명확 분리.
Part 8 — Scaling · Parallel (37편)
무엇을 배웠나 — 6가지 scaling 전략 (Multi-threaded · Parallel Steps · Local Chunking v6 · Remote Chunking · Partitioning · Remote Step v6). 결정 트리.
핵심 — 측정 우선. 대부분 환경 = Partitioning 권장.
Part 9 — Repeat · Retry · Testing (38~40편)
무엇을 배웠나 — RepeatTemplate · CompletionPolicy · ExceptionHandler 의 building block, Spring Batch 6 의 Spring Retry 제거 + Framework core retry, @SpringBatchTest + StepScopeTestExecutionListener + MetaDataInstanceFactory.
핵심 — Spring Batch 의 내부 building block + 테스트. Repeat 이해 = 프레임워크 이해.
Part 10 — Patterns · Integration · Observability (41~45편)
무엇을 배웠나 — Common Patterns 8가지 카탈로그, Spring Batch Integration 의 6 결합점, 메시지 기반 Job 실행, AsyncItemProcessor + Async Writer, Remote Chunking · Partitioning 구체 구현, Micrometer (메트릭 라이브러리) Observability + Tracing.
핵심 — 현장 운영 패턴 + 분산 처리 + 관측성. Micrometer 가 가장 즉시 도입할 가치.
Part 11 — 운영·완주 (46~48편)
무엇을 배웠나 — JFR (Java Flight Recorder, JVM 프로파일러) · Meta-Data Schema 6 테이블 · 운영 SQL · Glossary.
핵심 — DB metadata 와 JVM profiling 으로 운영 troubleshooting. Micrometer + JFR 결합.
Part 4: 학습 경로 가이드
입문자 — "Spring Batch 처음 봐요"
1주차: 1~4편 (입문) + 11편 Step Overview + 12편 Chunk Configuring.
2주차: 5~10편 (Job 설정) + 19편 TaskletStep + 20편 Flow Control.
3주차: 22~26편 (ItemReader/Writer 기본) + 27·28·29·30편 (Flat File).
4주차: 34편 (Database) + 35편 (ItemProcessor) + 13편 (Restart) + 14·15편 (Skip · Retry).
최소 학습 분량 = 20편. 이것만으로도 간단한 batch 운영 가능.
중급 — "기본 알아요, 운영 자신감 ↑"
추가 학습 = +15편:
- 16편 Transaction Attributes
- 17·24편 ItemStream 깊이
- 18편 Step Listener
- 21편 Late Binding
- 31·32편 XML · JSON
- 33편 Multi-file
- 36편 Process Indicator
- 37편 Scaling
- 38·39편 Repeat · Retry building block
- 40편 Testing
- 41편 Common Patterns
- 45편 Observability
→ 누적 35편. 운영 자신감.
상급 — "분산 batch · 큰 시스템 설계"
남은 +13편:
- 25편 Reader/Writer 카탈로그
- 26편 Custom
- 42~44편 Spring Batch Integration
- 46편 JFR
- 47편 Schema
→ 48편 완주. 어떤 batch 환경도 자신 있게 설계.
Part 5: Spring Batch 6.0 핵심 변경
4편 whatsnew-v6 의 요약 + 시리즈 통틀어 등장한 변경:
의존성 변경
- Spring Retry 제거 → Spring Framework 7 core retry (39편)
- Jackson 3 — XML 처리 등 (31편)
- JUnit 4 미지원 → Jupiter (5) 필수 (40편)
신규 기능
- ResourcelessJobRepository (47편) — DB 없이 in-memory
- CommandLineJobOperator (8편) — 새 CLI runner
- JFR support (46편) — JVM 프로파일링
- Local Chunking (37편) — single-process chunk parallel
- Remote Step (37편) — Step 자체 원격 실행
- CompositeItemReader (22편·26편) — 여러 reader 순차
deprecated
batch-integrationXML namespace — v7 제거 예정 (42편)@EnableBatchProcessing(dataSourceRef = ...)옵션 일부 변경
→ Spring Batch 5 → 6 upgrade 시 이 4가지 영역 점검.
Part 6: 시리즈 1·2·3 통합 학습 그림
시리즈 1 — 자바 백엔드 입문 (59편)
자바 백엔드 입문 1편 부터 — Spring Framework · Spring Boot · JPA · MyBatis 기초.
→ Spring Batch 의 underlying framework 기초. Bean lifecycle · DI · AOP · Configuration · Component scanning 이해.
시리즈 2 — 백엔드 데이터 인프라 (130편)
PostgreSQL · Redis · Kafka 각각 — 데이터 저장소 · 캐시 · 메시지 brokers 깊이.
→ Spring Batch 의 주요 데이터 소스: - PostgreSQL = JdbcBatchItemWriter · JdbcPagingItemReader 의 typical 대상 (34편) - Redis = caching · enrichment processor 의 helper (35편) - Kafka = KafkaItemReader/Writer · Remote Chunking message channel (25편·44편)
시리즈 3 — Spring Batch (48편)
이 시리즈. batch 처리 자체.
3 시리즈 통합 = 백엔드 엔지니어 완성
[시리즈 1: 자바 백엔드 입문 (59편)]
기초 framework 이해
↓
[시리즈 2: 데이터 인프라 (130편)]
PostgreSQL · Redis · Kafka 깊이
↓
[시리즈 3: Spring Batch (48편)]
batch 처리 완성
↓
[운영 환경 자신감]
- online 시스템 (시리즈 1)
- 데이터 layer (시리즈 2)
- 야간 batch · 정산 · ETL (시리즈 3)
총 237편 누적 학습 노트. 백엔드 엔지니어의 full stack 그림.
Part 7: 더 깊은 학습 자료
공식
- Spring Batch 공식 reference — 시리즈의 1차 source
- Spring Batch samples — 실전 예제 모음
- Spring Framework 7 Resilience — retry 변경 (39편)
- Micrometer documentation — 메트릭 · 트레이싱 (45편)
책
- Spring Batch in Action (Manning) — 깊은 실전 (조금 오래된 버전)
- Definitive Guide to Spring Batch (Apress, Michael Minella) — 최신 운영 패턴
학습 자료
- Spring Tips by Josh Long (YouTube)
- Spring Boot 의
spring-boot-starter-batchsource code - Spring Batch GitHub issues — 운영 자주 만나는 자리 검색
Part 8: 마지막 한 마디
48편을 마치며 — Spring Batch 의 진짜 가치 는 single-threaded 단순함 + chunk 의 transaction 안전성 + 확장 가능성 의 균형. 측정 + 점진적 개선.
대부분 운영 환경:
- 단순 batch =
@Scheduled+JobLauncher+FlatFileItemReader/Writer+JdbcBatchItemWriter - 확장 필요 = Multi-threaded Step → Partitioning
- 이벤트 기반 = Spring Integration messaging
- 관측성 = Micrometer + Prometheus + Grafana
- troubleshooting = JFR + JMC (Java Mission Control, JFR 분석 GUI)
이 5단계가 Spring Batch 운영의 일반적 진화 경로.
237편 누적 학습 노트 — 짧은 글로 압축 한 운영 지식. 실무에서 책상에 펼쳐 둘 참고자료가 되었으면 합니다.
시리즈 인덱스 — 48편 한눈에
Part 1 — 입문·기본
Part 2 — Job 설정·실행
Part 3 — Step · Chunk Processing
- Step Overview
- Chunk Configuring
- Step Restart
- Skip Logic
- Retry Logic
- Transaction Attributes
- ItemStream Registering
- Step Listeners
Part 4 — TaskletStep · Flow Control
Part 5 — ItemReader · ItemWriter 기본
Part 6 — File · DB Reader/Writer
- Flat Files Overview
- Field Set
- Flat File Reader
- Flat File Writer
- XML Reader/Writer
- JSON Reader/Writer
- Multi-File Input
- Database Reader/Writer
Part 7 — ItemProcessor · 재사용
Part 8 — Scaling · Parallel
Part 9 — Repeat · Retry · Testing
Part 10 — Patterns · Integration · Observability
- Common Patterns
- Integration Overview
- Launching via Messages
- Async · Externalization
- Observability · Micrometer
Part 11 — 운영·완주
- Java Flight Recorder
- Meta-Data Schema
- 이 글 — FAQ + 완주 종합 (현재 글)
시리즈 완주
1편 부터 시작한 48편 학습 노트 가 여기서 마무리. 누적 237편 (시리즈 1·2·3 합산) 의 백엔드 학습 자산.
시리즈를 처음부터 다시 읽거나 특정 자리만 다시 찾을 때 47편 인덱스 가 빠른 검색 도움. 시험·실무 직전 압축 노트 가 각 글 끝에 있으니 그 자리만 펼쳐 보기 도 권장.
읽어 주셔서 감사합니다. 모든 글에 작성자의 책상 위 운영 노트 같은 마음으로 담았습니다.
공식 문서: Spring Batch FAQ · Spring Batch Reference 에서 원문을 확인할 수 있어요.