HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/Batch/
Spring Batch with file(.csv) -basic tutorial

Spring Batch with file(.csv) -basic tutorial

WhatSprinb Batch 란?스케줄러와의 차이점필요한 시점핵심 동작원리용어 설명처리 메커니즘처리흐름 관점Job 정보의 흐름 관점스프링배치 저장 정보장단점한계WhyHow REFER

What


Sprinb Batch 란?

  • 대량 데이터를 일괄적으로 처리 하기 위한 기술
 

스케줄러와의 차이점

Batch - 로직과 인프라 제공, Scheduling - 실생 시점 트리거 제공
사용의도가 다르다.
  • Batch는 대량 데이터를 일괄적으로 처리하기 위한 기술이고, 스케줄러는 특정 시간이나 주기에 따라 작업을 실행하는 기술이다.
  • 공식 문서에서도 공식 문서에서는 스케줄러를 대체하기 보다는 함께 작동하도록 설계 되어 있다. 라고 언급되어있으며 배치와 스케줄러는 아예 다른 것이 아니라 함께 사용해야하는 기술이다.
  • Batch 는 어떻게 대량 데이터를 처리할 것인가에 초점이 있고, 스케줄러는 언제 실행할 것인가 라는 시점에 초첨이 맞쳐져있다.
    • 이 둘을 활용하면 언제 대량 데이터를 일괄적으로 처리할 것인가로 활용될 수 있다.
 
Batch
역할
  • 대량의 데이터를 효율적으로 처리하기 위한 비동기적 작업 처리 기술
특징
  • 작업 단위를 Job과 Step으로 구성하여 관리함
  • 트랜잭션 관리, 재시도, 오류 처리 등의 기능을 제공
  • 작업의 상태 및 이력을 관리하여 중단된 작업의 재개가 가능합니다.
스케줄러
역할
  • 특정 시간이나 주기에 따라 작업을 실행하는 기능을 제공합니다.
특징
  • Cron 표현식 등을 사용하여 작업 실행 시점을 제어
  • 작업의 실행 주기 관리에 초점
  • Spring에서는 @Scheduled 어노테이션이나 Quartz와 같은 라이브러리를 사용
 
위 두가지 기술 중 고민이 있을 수 있는데, 이렇게 판단하는 것도 좋을것이라 생각한다.
 
  • 조금 작은 양이라면 오히려 배치라는 복잡성있는 기술보다는 스케줄러로 간단하게 처리하는게 더 효율적일 수 있다.(취급하는 단위가 크다면 배치를, 작으면 스케줄러로)
 
  • 체계적인 처리를 해야된다면 Batch를 간단한 처리라면 스케줄러로 하는 것이 효율적일 것이다.
    • batch는 데이터를 처리하기 위해 몇단계로 나누어서 처리하도록 설계되고 제공
    • Sucheduler는 이러한 단계는 따로 없어 개발자가 직접 만들어야 함
 
 
 

필요한 시점

  • 주기적으로 대량 데이터를 처리하고자 할떄 (with 자동화)
    • logging
    • Business Data
  • 체계적으로 대량 데이터를 처리하고 할 때,
    • 단계적 처리 (추출, 변환, 적재)
    • 트랜잭션(데이터 일관성을 보장하기 위한) 처리
    • 실패 후 사후처리 - 작업 재시작
    • 롤백처리 (건너뛰기)
  • 데이터 마이그레이션
    • 데이터베이스 간 대량 데이터 이동 및 변환
 
 
 

핵심 동작원리

 
[아키텍처]
notion image
 
 
💯
Batch의 핵심은 바로 “읽고→처리(가공)하고→쓴다” 순차성이 존재한다는 것이다.
notion image
 
 
이 부분을 Job, Step, ItemReader, ItemProcessor, ItemWriter 로 나뉘어서 구분을 한다.
 
이로인해 데이터를 체계적으로 관리할 수 있게 되고 코드를 읽는 개발자에게도 좋은 가독성을 제공할 수 있다.
 

용어 설명

Job과 Step
  • Job: 하나이상의 Step으로 구성된 단위
  • Step : 실제 작업이 수행되는 단위 (독립적 처리 단계를 의미)
    • 처리 방법의 종류
      • 단순 단일 작업 처리를 위한 방식(TaskletStep)
      • 대량 데이터를 청크 기반으로 쪼개어 조금씩 처리(데이터를 쪼개어서 처리하는 방식)하는 방식
 
청크 기반 처리
  • 읽고 ⇒ 가공 ⇒ 쓴다
  • 장점: 효율적인 메모리 사용과 트랜잭션 관리가 가능하고 이로 인해 성능향상을 도모할 수 있다.
 
트랜잭션 관리
  • 각 청크는 하나의 트랜잭션으로 관리되어 진다.
  • 청크 내에 예외 발생시 모든 작업이 롤백된다.
  • 재시도 및 스킵 기능을 통해 오류 발생시 유연하게 대응이 가능하다.
 
메타데이터 관리
  • 실행상태와 이력을 메타데이터 테이블로 저장한다.
  • 이를 통해 작업 재시도, 재시작, 모니터링이 가능하다.
  • 주요 메타데이터 테이블: BATCH_JOB_INSTANCE BATCH_JOB_EXECUTION BATCH_STEP_EXECUTION
 
실제로도 이 메타 정보가 라이브러리에 포함되는 걸 볼 수 있다.
notion image
notion image

처리 메커니즘

notion image

처리흐름 관점

  1. JobScheduler 가 배치를 트리거링 하면 JobLauncher 를 실행한다.
  1. JobLauncher 는 Job을 실행한다. 이때 JobExecution 을 수행하고, Execution Context 정보를 이용한다.
  1. Job은 자신에게 정으된 Step을 실행한다. 이때 StepExecution을 수행하고, Execution Context 정보가 전달되어 수행된다.
  1. Step은 Tasklet과 Chunk모델을 가지고 있으며 위 그림에서는 Chunk 모델로 수행되게 된다.
  1. Chunk 모델은 ItemReader를 통해서 소스 데이터를 읽어 들인다.
  1. ItemProcessor를 통해서 읽어들인 청크단위 데이터를 처리한다. 처리는 데이터를 변환하거나 가공하는 역할을 하게 된다.
  1. ItemWriter는 처리된 청크 데이터를 쓰기작업한다. 다양한 Writer를 통해 데이터베이스에 저장하거나, 파일로 쓰는 역할을 하게 된다.

Job 정보의 흐름 관점

  1. JobLauncher는 JobRepository를 통해서 JobInstance정보를 데이터베이스에 등록한다.
  1. JobLauncher는 JobRepository를 통해서 Job Execution 을 통해 Job 수행하고 실행 정보를 데이터베이스에 저장한다.
  1. JobStep은 JobRepository를 통해서 I/O 레코드와 상태정보를 저장한다.
  1. 잡이 완료되면 JobRepository를 통해서 데이터베이스에 완료 정보를 저장한다.

스프링배치 저장 정보

  • JobInstance
    • JobInstance는 잡 이름과 전달 파라미터를 정의한다.
    • Job이 중단되는 경우 다음 실행할때 중단 이후부터 실행하도록 지원한다.
    • Job이 재실행을 지원하지 않는경우, 혹은 성공적으로 처리된 경우 배치를 재실행 한다면 중복 수행되지 않도록 종료한다.
  • JobExecution / ExecutionContext
    • JobExecution
      • JobExecution은 잡의 물리적인 실행을 나타낸다.
      • JobInstance와 달리 동일한 Job이 여러번 수행될 수 있다.
      • 그러므로 JobInstance 와 JobExecution은 1:N 관계가 된다.
    • ExecutionContext
      • ExecutionContext는 각각의 JobExecution 에서 처리 단계와 같은 메타 정보들을 공유하는 영역이다.
      • ExecutionContext는 주로 스프링배치가 프레임워크 상태를 기록하는데 사용하며, 또한 애플리케이션에서 ExecutionContext에 액세스 하는 수단도 제공된다.
      • ExecutionContext에 저장되는 객체는 java.io.Serialized를 구현하는 클래스이어야 한다.
  • StepExecution / ExecutionContext
    • StepExecution
      • StepExecution은 Step을 물리적인 실행을 나타낸다.
      • Job은 여러 Step을 수행하므로 1:N 관계가 된다.
    • ExecutionContext
      • Step내부에 데이터를 공유해야하는 공유 영역이다.
      • 데이터의 지역화 관점에서 여러 단계에 공유 할 필요가 없는 정보는 Job내 ExecutionContext를 이용하는 대신에, Step 단계 내의 ExecutionContext를 사용해야한다.
      • StepExecutionContext에 저장되는 데이터는 반드시 java.io.Serializable 를 구현해야한다.
  • JobRepository
    • JobExecution과 StepExecution등과 같이 배치 실행정보나 상태, 결과정보들이 데이터베이스에 저장될 필요가 있으며 이를 처리하는 것이 JobRepository이다.
    • 즉 스프링배치를 수행하기 위해서 이를 저장할 데이터베이스가 필요하다.
    • 이렇게 저장된 정보를 활용하여 스프링배치는 배치 잡을 재실행 하거나, 정지된 상태 후부터 수행할 수 있는 수단을 제공하게 된다.
 
 

장단점

 
장점
  • 효율적인 자원활용
    • 대량데이터를 일괄 처리하여 시스템 부하를 낮출 수 있다.
  • 신뢰성
    • 트랜잭션 관리와 오류 복구 기능을 제공하여 데이터 일관성있게 처리 가능하다
  • 유연성
    • 하나의 작업(JOB)을 여러 단계(Step) 으로 나누어서 처리할 수 있다.
  • 확장성
    • 병렬 처리 및 분산처리 기능 또한 제공하여 성능을 향상시킬 수 있다.
  • 풍부한 기능 제공
    • 로그 추적, 재시도, 스킵, 청크 처리 등 다양한 기능을 제공한다.
 
단점
  • 러닝 커브가 존재하여 복잡성이 존재한다.
  • 실시간 처리 부적합하다.
  • 비동기 처리로 인해 디버깅에 어려움이 있다.
 

한계

  • 실시간성 부족
  • 복잡한 설정
  • 메모리 사용량 문제 발생 여지 충분
  • 의존성
 
Batch 사용시 주의사항
  • 트랜잭션 처리
  • 청크 사이즈
  • 예외 처리 전략
  • 성능 최적화
  • 리소스 관리
  • 로그 및 모니터링
 

Why


  • 대량 데이터를 일괄적으로 처리함으로써 복잡한 비즈니스 성 대량 데이터를 손쉽게 처리가 가능하다.
    • 한번 처리하는 코드를 작성하면 인적 낭비를 줄일 수 있다. (with 자동화)
  • 또한 이런 데이터를 단계적으로 처리함으로써 유지보수성 또한 뛰어나며 가독성 측면의 향상또한 증가한다.

How


feat: spring batch 기본 튜토리얼

 REFER


Getting Started | Creating a Batch Service
Learn how to create a basic batch-driven solution.
Getting Started | Creating a Batch Service
https://spring.io/guides/gs/batch-processing
Getting Started | Creating a Batch Service
The Domain Language of Batch :: Spring Batch
To any experienced batch architect, the overall concepts of batch processing used in Spring Batch should be familiar and comfortable. There are “Jobs” and “Steps” and developer-supplied processing units called ItemReader and ItemWriter. However, because of the Spring patterns, operations, templates, callbacks, and idioms, there are opportunities for the following:
The Domain Language of Batch :: Spring Batch
https://docs.spring.io/spring-batch/reference/domain.html
Spring Boot With Spring Batch | Baeldung
Learn how to create a simple Spring Batch job using Spring Boot.
Spring Boot With Spring Batch | Baeldung
https://www.baeldung.com/spring-boot-spring-batch
Spring Boot With Spring Batch | Baeldung
[SpringBatch 연재 02] SpringBatch 코드 설명 및 아키텍처 알아보기
데보션 (DEVOCEAN) 기술 블로그 , 개발자 커뮤니티이자 내/외부 소통과 성장 플랫폼
[SpringBatch 연재 02] SpringBatch  코드 설명 및 아키텍처 알아보기
https://devocean.sk.com/blog/techBoardDetail.do?page=&boardType=undefined&query=&ID=166690&searchData=&subIndex=&searchText=&techType=&searchDataSub=&searchDataMain=
[SpringBatch 연재 02] SpringBatch  코드 설명 및 아키텍처 알아보기