Spring

스프링 배치(Spring Batch)로 대용량 데이터 관리하기

날아 2024. 4. 1. 14:34

토이 프로젝트를 진행하며 대용량 데이터를 일괄적으로 관리하기 위해 Spring batch를 사용하였다. 

복습 겸 구조를 이해하기 위해 글로 정리해보려하고 한다. 

 

1. Spring Batch 란

Spring batch란 스프링에서 제공하는 대용량 데이터 처리를 위한 기능을 제공하는 프레임워크이다. 
배치란 일괄처리를 의미한다. 즉, Spring batch는 지정한 스케줄러에 의해 정해진 시간에 맞춰 작업을 수행한다.
기능으로는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등이 있다.

 

Spring Batch는 스케줄러인가? 

결론적으로 Spring Batch는 스케줄러가 아니다. 

Batch는 데이터를 대용량으로 일괄처리하기 위한 Job이라는 형태의 객체를 제공할 뿐이고, 해당 Job을 제공받아 실행하는 스케줄러는 별도로 정의해야한다. 

스케줄링(Scheduling)

정해진 일정 또는 주기에 따라 작업을 실행하는 기능이다.

스케줄러의 형태는 @Scehduled 어노테이션을 붙이는 가장 기본적인 형태부터, Quartz까지 다양하게 정의될 수 있다. 

주로 백그라운드 작업, 일정한 주기로 데이터를 처리하는 작업, 리소스 관리 등에 활용한다. 

 

Spring Batch를 사용하는 경우 (일괄 처리가 필요한 경우)

  • 대용량의 비즈니스 데이터를 복잡한 과정으로 처리해야 하는 경우
  • 특정한 시점에 스케줄러를 통해 자동화된 작업이 필요한 경우 
  • 대용량 데이터의 포맷을 변경, 유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야 하는 경우

 

나의 프로젝트의 경우, 게시글에서 설정해둔 마감 공고 기한이 지나면 매주 월요일 자정을 기반(Sechduler)으로 게시글을 unrolled로 변경하고 조회 서비스에서 제외(Spring Batch)하고자 하였다. 

 

Spring Batch 아키텍처

 

  • Job Sceduler
    • 정의된 배치Job을 일정 주기마다 실행시켜주는 Scheduler 객체
    • Batch와는 직접적인 연관이 없다.
  • Job Launcher
    • 실재로 Batch Job을 실행시켜주는 객체
    • Job Instance를 구분하기 위한 Job Parameter를 입력할 수 있다.
  • Job Instance
    • Job의 실행 단위
    • Job을 실행시키게 되면 하나의 Job Instance가 생성 
    • Job의 재실행 가능 여부 검증, 실행 방법, 파라미터 유효성 검증 등을 수행
    • 예시) 1월 첫째주 월요일, 둘째주 월요일 실행을 하게 되면 각각의 Job Instance 가 생성되며 첫째주 실행한 인스턴스가 실패하여 다시 실행을 시키더라도 이 Job Instance는 첫째주에 대한 데이터만 처리한다. 
  • Job Parameter
    • 배치 작업이 수행될 때마다 전달되는 파라미터
    • String, Double, Long, Date 4가지 형식 지원 
    • 예시) 시작 시간, 데이터를 읽을 범위 등
  • Job
    • 실제 데이터를 Batch로 처리하기 위한 작업 단위
    • 최소한 1개 이상의 Step을 가져야 한다.
  • Step
    • Job을 구성하는 독립된 작업의 단위
    • 순차적인 단계를 캡슐화
    • Tasklet, Chunk의 2가지 기반이 존재
    • 예시) Job을 떡볶이 만들기 레시피에 비유한다면, Job은 재료준비-재료손질-조리 라는 과정대로 진행될 것이고 이와 같은 각 순서들이 Step이라고 볼 수 있다. 
  • ExecutionContext
    • Job에서 데이터를 공유할 수 있는 데이터 저장소
    • Spring Batch에서 제공하는 ExecutionContext는 JobExecutionContext, StepExecutionContext가 존재
    • 이 두가지는 지정되는 범위가 다르다.
    • JobExecutionContext : Commit 시점에 저장
    • StepExecutionContext : 실행 사이에 저장 
    • ExecutionContext를 통해 Step간 데이터 공유 가능
    • Job 실패시 ExecutionContext를 통한 마지막 실행 값을 재구성 가능 
  • JobRepository
    • 정의된 Job의 처리를 위한 메타데이터가 저장되어있는 저장소 
  • ItemReader
    • Step에서 배치 처리할 Item을 읽어오는 역할 
  • ItemProcessor
    • Reder로 읽어온 Item 데이터를 가공/처리하는 역할 
    • 배치를 처리하는데 필수 요소는 아님 
  • ItemWriter
    • Processor로 가공/처리 된 데이터들을 데이터베이스에 저장하는 역할 

 

Step 방식 - tasklet, chunk

 

tasklet 방식

  • Step이 중지될 때까지 execute 메서드가 반복 수행하고 수행할 때마다 독립적인 트랜잭션이 얻어진다.
  • 초기화, 저장 프로시저 실행, 알림 전송과 같은 Job에서 일반적으로 사용 
  • 계속 진행할지 아니면 끝낼지 두가지 경우만 제공 
  • 데이터 처리 과정이 tasklet 안에서 한 번에 이루어지고, 배치 처리 과정이 쉬운 경우 사용된다.

chunk 방식 

 

  • 한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다룬다.
  • Chunl 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영된다. 
  • 대용량 데이터를 처리할 경우 사용된다.
  • ItemReader와 ItemProcessor에서 데이터는 1건씩 다뤄지고, ItemWriter에선 Chunk 단위로 한번에 처리

 

참고 블로그