모르지 않다는 것은 아는것과 다르다.

Spring Batch

Spring Batch

채마스 2022. 2. 27. 01:18

batch란?

  • 큰 단위의 작업을 일괄 처리
  • 대용량 처리량이 많고 비 실시간성 처리에 사용
    • 대용량 데이터 계산, 정산, 통계, 데이터베이스, 변환 등
  • 컴퓨터 자원을 최대로 활용
    • 컴퓨터 자원 사용이 낮은 시간대에 배치를 처리하거나
    • 배치만 처리하기 위해 사용자가 사용하지 않는 또다른 컴퓨터 자원을 사용
  • 사용자 상호작용으로 실행되기 보단, 스케줄러와 같은 시스템에 의해 실행되는 대상
    • crontab, jenkins 등을 이용해서 주기적으로 실행할 수 있다.
  • 배치 프로그램은 보이진 않지만 늘 존재한다.
  • 서비스를 운영하는 관점에서 주기적으로 작업을 처리하려면 배치 프로그램을 사용해야 한다.

 

batch 가 필요한 상황

  • 필요한 데이터를 모아서 처리해야 할 때
    • ex. 월별 거래 명세서 생성
  • 일부러 지연시켜 처리할 때
    • ex. 주문한 상품을 바로 배송 처리 하지 않고, 일정 시간 뒤 처리
  • 자원을 효율적으로 활용하기 위해
    • ex. 트래픽이 적은 시간 대에 서버 리소스를 활용

 

데이터 처리 관련 batch 가 사용되고 있는 예시

  • 각 서비스의 데이터를 데이터 웨어하우스에 저장할 때
    • ETL(Extract-Transform-Load)
  • 아마존에서 연관 상품을 추천하는 데이터 모델을 만들 때
  • 유저의 리텐션 등 마케팅에 참고할 데이터 지표를 집계할 때

 

서비스 batch 가 사용되고 있는 예시

  • 메시지, 이메일, 푸시 등을 발송할 때
  • 데이터를 마이그레이션 할 때
  • 실패한 트랜잭션을 재처리할 때
  • 쿠폰, 포인트 등이 만료 되었을때 소진시키는 처리를 할 때
  • 월말 또는 월초에 특정 데이터를 생성할 때-월별거래 명세서

 

Spring batch란?

  • 가볍고 다양한 기능을 가진 배치 프레임 워크 견고한 배치 어플리케이션 개발이 가능하도록 디자인 되어있다.
    • Spring에서 지원하는 기술 적용 가능
    • DI, AOP, 서비스 추상화
  • 기업 시스템의 매일 운영에 필수적인 수준이다.
  • 스프링 배치의 실행 단위인 Job과 Step
  • 비교적 간단한 작업(Tasklet) 단위 처리와, 대량 묶음(Chunk)단위 처리

 

Spring batch 의 장점

  • 스프링으로 작성된 코드를 재활용할 수 있다. 기존 Spring 프로젝트의 코드를 활용하거나 모듈을 이용할 수 있다.
  • 만약 배치용 코드를 새로 작성한다면 Python, Shell script, Go 등 다른 언어로 비슷한 처리를 새로 구현해야 한다.
  • 배치 처리를 위한 로직을 새로만드는 것보다 스프링 배치에서 제공하는 기능을 이용하는게 생산성 있는 방법이다.
  • 로깅/추적, 트랜잭션관리, 작업처리통계, 재시작, 건너뛰기 등 대용량 처리에 필수적인 기능들을 제공
  • 멀티코어 또는 멀티 서버에서 처리를 분산하는 기능을 제공한다.
  • 프레임워크가 제공하는 기능들을 이해하고 잘 사용하면 된다.
@EnableBatchProcessing
public class SpringBatchExampleApplication {

    public static void main(String[] args) {
    }
}
  • @EnableBatchProcessing 을 걸어둔다 -> 배치 작업을 한다는 것을 뜻함.

 

Spring batch 도메인 언어

  • JobLauncher는 Job을 실행시키는 컴포넌트다.
  • Job은 배치 작업이다.
  • JobRepository는 Job 실행하고 Job, Step을 저장한다.
  • Step은 배치 작업의 단계이고, Job 은 여러개의 Step 을 가질 수 있다.
    • ItemReader, ItemProcessor, ItemWriter는 데이터를 읽고 처리하고 쓰는 구성한다.
    • Step 은 ItemReader, ItemProcessor, ItemWriter 를 각각 하나씩만 가질 수 있다.

 

Spring batch 아키텍처

  • Spring Batch가 제공하는 CoreInfrastructure를 활용해 Application을 구현한다.
  • Application Layer
    • 사용자(=우리) 코드와 구성
    • 비즈니스, 서비스 로직
    • Core, Infrastructure를 이용해 배치의 기능을 만든다.
  • Core Layer
    • 배치 작업을 시작하고 제어하는데 필수적인 클래스다.
    • Job, Step, JobLaucher 로 이루어져 있다.
  • Infrastructure Layer
    • 외부와 상호작용하는 Layer 이다.
    • ItemReader, ItemWriter, RetryTemplate 와 같은 것들을 Infrastructure Layer 에 포함된다.

 

batch 동작 과정

  • Spring batch 는 Job 타입의 빈이 생성되면, JobLauncher에 의해서 Job이 실행되고 Job에 의해서 Step이 실행됩니다.
  • JobRepository 는 Job의 메타 데이터를 관리한다. -> Spring batch 의 전반적인 데이터를 관리한다.
  • Job은 Nrodml Step을 실행할 수 있으며, 흐름(Flow)을 관리할 수 있다.
  • Step의 실행 단위는 크게 2가지 이다.
    • Chunk 기반 : 하나의 큰 덩어리를 N개씩 나눠서 실행
    • Task 기반 : 하나의 작업 기반으로 실행
  • Chunk 기반 Step은 ItemReader, ItemProcessor, ItemWriter가 있다.
    • 여기서 Item은 배치 처리 대상 객체를 의미한다.
    • ItemReader: 배치 처리 대상 객체를 읽어서 ItemProcessor 또는 ItemWriter에게 전달한다. (ex> DB에서 데이터를 읽는다.)
    • ItemProcessor: ItemReader로 받은 데이터를 가공하거나 필터링 한다. -> 필수값은 아니다. -> ItemReader나 ItemWriter가 대신할 수 있다.
    • ItemWriter: 데이터를 최종 처리한다. -> DB에 값을 반영하거나 사용자에게 알림을 보낼 수도 있다.

 

yml 설정

    spring:
    batch:
        job:
        names: ${job.name:NONE}
  • 이렇게 yml 파일을 설정하면, 모든 배치가 실행되는 것을 막을 수 있다.
  • 원하는 배치 작업만 실행할 수 있게 된다.

  • 위와 같이 Run/Debug configurations를 설정해 주면 해당 이름의 배치만 실행 된다.




REFERENCES

  • 황지연님의 스프링 배치

'Spring Batch' 카테고리의 다른 글

JobExecutionListener  (0) 2022.02.27
ItemWriter  (0) 2022.02.27
ItemProcessor  (0) 2022.02.27
ItemReader  (0) 2022.02.27
Tasklet, Chunk 비교  (0) 2022.02.27