본문 바로가기
스프링 관련/Spring Batch

스프링 배치

by 문자메일 2024. 10. 9.

Ch 01. Batch 프로그램

 

현업에서의 배치 프로그램

 

배치 프로그램?

정해진 시간에 일괄적으로 작업을 처리한다. (대체로 대용량 데이터)

 

배치 프로그램은 보이지 않지만 늘 존재한다.

서비스를 운영하는 관점에서 주기적으로 작업을 처리하려면 배치 프로그램을 사용해야 한다.

 

 

배치 프로그램이 필요한 상황

1. 필요한 데이터를 모아서 처리해야 할 때 (ex : 월별 거래 명세서 생성 )

2. 일부러 지연시켜 처리할 때 ( ex : 주문한 상품을 바로 배송 처리 하지 않고, 일정 시간 뒤 처리 )

3. 자원을 효율적으로 활용하기 위해 ( ex : 트래픽이 적은 시간 대에 서버 리소스를 활용 )

 

 

데이터 처리 배치 프로그램 살펴보기

1. 각 서비스의 데이터를 데이터 웨어하우스에 저장할 때 ( ETL - Extract-Transform-Load )

2. 아마존에서 연관 상품을 추천하는 데이터 모델을 만들 때

3. 유저의 리텐션 등 마케팅에 참고할 데이터 지표를 집계할 때

 

 

서비스 배치 프로그램 살펴보기

1. 메시지, 이메일, 푸시 등을 발송할 때

2. 데이터를 마이그레이션 할 때

3. 실패한 트랜잭션을 재처리 할 때

4. 쿠폰, 포인트 등이 만료되었을 때 소진시키는 처리를 할 때

5. 월말 또는 월초에 특정 데이터를 생성할 때 - 월별 거래 명세서

 

 

Spring Batch를 쓰는 이유

 

Spring Batch란? 

가볍고 다양한 기능을 가진 배치 프레임 워크

견고한 배치 어플리케이션 개발이 가능하도록 디자인 되어있다.

기업 시스템의 매일 운영에 필수적인 수준

 

 

Spring 기반이다!

- 스프링으로 작성된 코드를 재활용할 수 있다. 기존 Spring 프로젝트의 코드를 활용하거나 모듈을 이용할 수 있다.

- 만약 배치용 코드를 새로 작성하다면 Python, Shell script, Go 등 다른 언어로 비슷한 처리를 새로 구현해야 한다.

- 배치 처리를 위한 로직을 새로 만드는 것보다 스프링 배치에서 제공하는 기능을 이용하는게 생산성 있는 방법이다.

 

 

다양한 기능을 제공한다.

- 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 재시작, 건너 뛰기 등 대용량 처리에 필수적인 기능들을 제공

- 멀티 코어 또는 멀티 서버에서 처리를 분산하는 기능을 제공한다.

-> 프레임워크가 제공하는 기능들을 이해하고 잘 사용하면 된다.

 

 

Ch 02. Spring Batch 아키텍처

1. Spring Batch 도메인

 

  • JobLauncher는 Job을 실행시키는 컴포넌트
  • Job은 배치 작업. JobRepository는 Job 실행과 Job, Step을 저장
  • Step은 배치 작업 단계. ItemReader, ItemProcessor, ItemWriter는 데이터를 읽고 처리하고 쓰는 구성
    • ItemReader - 데이터를 읽는 컴포넌트
    • ItemProcessor - 데이터를 가공/처리해주는 컴포넌트
    • ItemWriter - 데이터를 쓰는 컴포넌트

 

2. Spring Batch 아키텍처

스프링 배치는 Spring Batch가 제공하는 Core와 Infrastructure를 활용해 Application을 구현한다.

Application Layer

  • 사용자 코드와 구성
  • 비즈니스, 서비스 로직
  • Core, Infrastructure를 이용해 배치의 기능을 만든다.

Core Layer

  • 배치 작업을 시작하고 제어하는데 필수적인 클래스
  • Job, Step, JobLauncher

Infrastructure Layer

  • 외부와 상호작용
  • ItemReader, ItemWriter, RetryTemplate

 

 

3. Job

  • 전체 배치 프로세스를 캡슐화한 도메인
  • Step의 순서를 정의한다
  • JobParameters 받는다

 

 

4. Step

  • 작업 처리의 단위
  • Chunk 기반 스텝, Tasklet 스텝 2가지로 나뉜다.

https://www.springcloud.io/post/2022-07/spring-batch-basics/#gsc.tab=0

 

chunk 기반으로 하나의 트랜잭션에서 데이터를 처리한다.

commitInterval 만큼 데이터를 읽고 트랜잭션 경계 내에서 chunkSize 만큼 write를 한다.

 

  • chunkSize : 한 트랜잭션에서 쓸 아이템의 갯수
  • commitInterval : reader가 한번에 읽을 아이템의 갯수
  • chunkSize >= commitInterval 하지만 보통 같게 맞춰서 사용하는 것이 좋다.

  • ItemReader, ItemProcessor, ItemWriter 구현체를 설정한다.
  • ItemProcessor는 생략할 수 있다.

 

 

 

 

댓글