본문 바로가기

Dot Programming/Spring

[Spring Batch] 스프링 배치에 대해 알아보자

    배치

    Batch
    1. [명사] (일괄적으로 처리되는) 집단[무리].
    2. [명사] 한 회분(한 번에 만들어 내는 음식기계 등의 양)
    3. [동사] (일괄 처리를 위해) 함께 묶다.

    Batch Processing
    Batch Processing(일괄 처리)은 사용자의 개입 없이 실행을 스케줄링할 수 있는 작업(job)을 의미하며. 컴퓨터 프로그램 흐름에 따라 순차적으로 자료를 처리하는 방식이다. 배치는 예약된 시간에 자동으로 실행될 수 있으며 컴퓨터 리소스의 가용성에 따라 실행될 수도 있다. - wiki

     

    배치 프로세싱(Batch Processing; 일괄 처리) 

    Batch Processing(일괄 처리; 대규모 데이터 지향, 비대화형 및 자주 오래 실행되는 백그라운드 실행으로 대표됨)은 거의 모든 산업에서 널리 사용되며 다양한 작업에 적용된다. 이는 데이터 또는 연산(computationally) 집약적일 수 있으며 순차적 또는 병렬적으로 실행되며 임시(ad-hoc), 예약(scheduled) 및 주문형(on-demand)을 비롯한 다양한 호출 모델을 통해 시작될 수 있다.

     

    배치 프로세싱의 장점

    Batch Processing은 엔터프라이즈 단위의 대규모 데이터 관리를 하는 데 있어서 수많은 장점을 가지고 있어 대중화되었다.

    1. 효율성: 일괄 처리 작업은 백그라운드에서 실행이 가능하기 때문에 작업 우선순위를 지정 및 예약과 같은 기능으로 효율적으로 작업을 처리할 수 있다.
    2. 단순성:  스트림 처리 과정이랑 비교할 때 일괄 처리는 특별한 HW나 시스템 지원이 필요하지 않다. 데이터 입력에 대한 유지 관리가 덜 필요하다.
    3. 더 빠른 비즈니스 인텔리전스: 대용량 데이터를 신속하게 처리하여 더 빠르게 효율적인 비즈니스 인텔리전스를 얻을 수 있다. 또한 많은 작업을 병렬로 동시에 처리할 수 있다.
    4. 데이터 품질 향상:  대부분의 기능을 자동화하고 사용자 상호 작용을 최소화함으로써 오류 발생 가능성을 줄여준다. 정밀도와 정확도가 향상되어 더 높은 수준의 데이터 품질을 얻을 수 있다.

     

    배치 최적화 기법의 적용순서

    배치에서 배치 시스템은 비교적 단순하고 덜 중요하다. 배치의 성능 최적화는 프로그래밍 언어나 프로그래밍 기법이 아닌 아키텍처 수준의 최적화를 통해 해결되어야 한다.

    1. 배치업무 최적화 : 유사 업무 통합, 불필요한 반복 작업 제거
    2. 관리 고도화 : 수작업 데이터 검증 최소화, 잘못된 결과로 재작업 최소화
    3. I/O 비용 최소화 : 배치 수행 시간의 80% 이상은 I/O 비용이며, I/O를 최소화 해야 최적화 된 성능

     

    Web vs Batch

    Web: 실시간 처리/ 상대적인 속도/ QA 용이성

    Batch: 후속 처리/ 절대적인 속도/ QA 복잡성

    • 웹의 상대적인 속도? 포털이나 웹 페이지를 보면 데이터 응답을 할 때까지 로딩 페이지나 어떤 다른 콘텐츠로 신경을 분산시키는 방법을 쓰면 사실 속도 체감이 잘 안된다. 엘레베이터 거울과 같다. 그런데 Batch는 그러한 방법을 쓸 수 없다. 
    • Web, Batch 둘 다 당연히 테스트코드가 중요하다. 하지만 상대적으로 볼 때 Batch에서 테스트코드 작성이 더 중요시된다. 왜냐하면 테스터분들이나 QA분들이 Batch 쪽에 대해서는 상세한 부분까지 QA를 못해주고 기존에 잘 돌던 기능들이 잘 안됐다라는 부분들에 대한 통합 QA를 진행하기 어렵다. 

     

    Web vs Batch

     

    스프링 배치

    Spring Batch는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공한다. 또한 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 배치 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공한다. 단순하고 복잡한 대용량 일괄 작업은 확장성이 뛰어난 방식으로 프레임워크를 활용하여 상당한 양의 정보를 처리할 수 있다.

     

    스프링 배치 구조

    다음 그림은 스프링 배치 프레임워크 내의 요소 간의 상호작용과 주요 서비스들을 나타낸다. Spring Batch에서 개발자가 어떠한 책임을 갖고 임해야 하는지 도움이 될 수 있도록 각 요소에 특성에 맞는 색으로 표시하였다. 그림으로 봐도 알겠지만 Spring Batch 프레임워크가 대부분의 기능을 제공해주고 있다.

    • 노란색: 스케줄러 또는 데이터베이스와 같은 외부 애플리케이션. 스케줄링이라는 점은 스프링 배치와 별도로 고려되어야한다는 점에 유의하는 것이 중요하다. 
    • 빨간색: Spring Batch에서 제공하는 기능. 대부분의 서비스들은 스프링 배치에서 제공하고 있지만, 원하는 구조가 있다면 입맛에 맞게 디자인 할 수 있습니다.
    • 초록색: 개발자가 구성해야 하는 기능. 예를 들어, 일정한 주기대로 작업이 시작되도록 설정(Job Configuration)하거나, 작업을 실행하는 방법(Business Logic) 등을 구현해야 한다.

     

    스프링 배치 구조 (https://deeplify.dev/back-end/spring/batch-architecture-and-components)

     

    스프링 배치 특징

    • Transaction management
    • Chunk based processing
    • Declarative I/O
    • Start/Stop/Restart
    • Retry/Skip
    • Web based administration interface (Spring Cloud Data Flow)

     

    Spring Batch와 Scheduler Framework(Quartz, Tivoli ...)

    Spring Batch는 스케줄러 기능을 따로 내장하고 있지 않고 단지 Batch Job만 관리한다. 이미 외부 오픈 소스로 좋은 툴들이 많아 이에 대한 기능은 넣지 않을 것 같다. Job을 스케줄러를 통해 구동시키기 위해서는 Quartz, Tivoli, Control-M Scheduler, Jenkins등 전용 Scheduler를 사용해야 한다.

     

    Spring Batch는 온전히 엔터프라이즈 단위의 대용량 데이터를 처리해주는 데에 집중하고 있다. 스케줄링 프레임워크는 Batch Processing을 도와주는 보완제 역할을 해주는 것이다.

    • Spring Batch에서는 모든 데이터를 메모리에 쌓는 방식은 권장하지 않는다. 모든 데이터를 메모리에 쌓지 않는 조회 방식을 기본 방식으로 사용한다.
    • 그래서 Spring Batch에서는 이러한 대용량 데이터를 핸들링하기 위해 규격을 정해놓았다.(DB 기준) Paging 혹은 Cursor로 pageSize만큼만 읽어오고 chunckSize만큼만 commit한다. 읽어올 때도 10,000건씩 끊어서 가져오거나 스트림으로 처리하는 방식을 클래스로 지원하고 있다.
    • jpaRepository.findAll()와 같은 쿼리를 사용하면 사용하게되면 대량의 데이터를 모두 조회하니 부하가 발생할 수 있어 큰일난다.

    스케줄러 프레임워크는 보완제 역할이지 대체제가 아니다.

     

    스프링 배치 아키텍처

     

    1. Job

    Job은 배치처리 과정을 하나의 단위로 만들어 놓은 객체로 다음과 같은 기능을 한다.

    • Job 이름을 정의
    • Step을 정의하고 순서를 정의
    • Job의 재사용 가능성을 정의

     

    2. JobInstance

    JobInstance는 Job의 실행의 단위를 나타낸다. Job을 실행시키게 되면 하나의 JobInstance가 생성된다. 예를 들어, 저번주 내역 데이터를 가져오기 위해 실행하게 되면 각각의 JobInstance 7개가 생성되며 어느 하나가 실패하여 재실행하더라도 해당 일만 독립적으로 동작한다.

    • 논리적으로 Job을 실행
    • JobParameters를 이용하여 구분
    • JobInstance = Job * identifying JobParameters

     

    3. JobExcuetion

    • Job을 실행하는 단일 시도
    • 실패했던 JobInstance에 대해 새로운 실행을 하면 새로운 JobExecution 생성

    JobExcuetion Properties

    • BatchStatus: 실행 상태를 나타낸다. 실행중이면 started, 실패하면 failed
    • ExitStatus: 실행 결과를 나타낸다. ExitCode를 포함하고 있다.

     

    4. Step

    • 배치 작업의 독립적이고 순차적인 단계를 캡슐화하는 도메인 객체
    • 모든 Job은 하나 또는 그 이상의 Step으로 구성된다.
    • Step의 내용은 개발자의 재량이므로 복잡하거나 단순하게 구현이 가능하다.

    StepExecution

    • Status: 실행 상태를 나타낸다.
    • ExitStatus: 실행의 결과를 나타낸다.
    • ReadCount, WriteCount, CommitCount, RollbackCount, FilterCount 등 실행에 대한 다양한 정보를 담고 있다.

     

    5. JobRepository

    Job, Step 구현을 위한 CRUD 작업을 제공한다.

     

    6. JobLauncher

    Job을 시작하기 위한 간단한 인터페이스. 구현 시 JobRepository에서 유효한 JobExecution을 획득하고 Job을 획득한다.

    • 이는 Spring Batch 사용시 제공받는다.

     

    7. Item

    작업에 사용하는 데이터이다. Item의 전체적인 Flow는 다음과 같이 읽고 처리하기 쓰기로 단순하다. 그리고 이에 대해 ItemReader, ItemProcessor, ItemWriter가 각 역할을 맞아 수행한다.

     

     

    8. ItemReader

    ItemReader는 말 그대로 데이터를 읽어들인다. DB 데이터뿐만 아니라 File, XML, JSON, CSV 등 다른 데이터 소스를 배치 처리의 입력으로 사용할 수 있다. 또한 JMS와 같은 다른 유형의 데이터 소스도 지원한다. 정리하면 다음과 같다.

    • 입력 데이터에서 읽어오기
    • 파일에서 읽어오기
    • Database에서 읽어오기
    • Java Message Service등 다른 소스에서 읽어오기
    • 본인만의 커스텀한 Reader로 읽어오기

     

    9. ItemWriter

    ItemWriter는 Spring Batch에서 사용하는 출력 기능이다. Spring Batch가 처음 나왔을 때, ItemWriter는 ItemReader와 마찬가지로 item을 하나씩 다루었다. 그러나 Spring Batch2와 청크 (Chunk) 기반 처리의 도입으로 인해 ItemWriter에도 큰 변화가 있었다. 이 업데이트 이후 부터 ItemWriter는 item 하나를 작성하지 않고 Chunk 단위로 묶인 item List를 다룬다.

     

    10. ItemProcessor

    ItemProcessor는 데이터를 가공 (혹은 처리)한다. 해당 기능은 필수가 아니다.

    • ItemProcessor는 데이터를 가공하거나 필터링하는 역할을 한다. 이는 Writer 부분에서도 충분히 구현 가능하다.
    • 그럼에도 ItemProcessor를 쓰는 것은 Reader, Writer와는 별도의 단계로 기능이 분리되기 때문이다.

     

    스프링 배치 사용 사례

    배치 애플리케이션은 일정 주기로 실행되어야 할 때나 실시간 처리가 어려운 대량의 데이터를 처리할 때 주로 사용된다.

    • ETL(Extract 추출, Transform 변환, Load 적재)
    • 데이터 마이그레이션(Spring Batch는 커밋 횟수 측정, 롤백 기능 제공)
    • 대규모 데이터 병렬 처리

     

    1. 일 매출 집계하기

    엔터프라이즈 단위의 데이터 집계는 하루에 100만건까지 나올 수 있다. 이를 count 쿼리로 실행하기에는 서버 부하가 심해질 것이다. 그래서 매일 새벽 매출 집계 데이터를 만들어 외부 요청이 올 경우 미리 만들어 준 집계 데이터를 바로 전달하면 성능과 부하를 모두 잡을 수 있다.

     

    2. ERP 연동하기

    재무팀의 요구사항으로 매일 매출 현황을 ERP로 전달해야하는 상황에서 Spring Batch가 많이 사용된다. 매일 아침 8시에 ERP에 전달해야할 매출 데이터를 전송해야한다면 아래와 같은 구조로 쉽게 구현할 수 있다.

     

    3. 구독 서비스 

    전송할 데이터 내역과 구독자 정보를 받아 정해진 시간에 구독을 신청한 회원에게 규칙적으로 메일을 일괄 전송할 때 Batch를 사용하면 쉽게 구현할 수 있다. 그러면 서버나 클라이언트나 다른 정보를 열람하는 등 다른 서비스에 영향을 주지 않는다.

     

    이 외에도 큰 데이터를 활용하여 보험급여를 결정한다거나 트랜잭션 방식으로 포맷, 유효성 확인 및 처리가 필요한 내부 및 외부 시스템에서 수신한 정보를 기록 시스템으로 통합하는 등 여러 방식으로 사용할 수 있다.

     


    참고

    https://spring.io/projects/spring-batch

    https://hevodata.com/learn/spring-batch-jobs/

    https://youtu.be/_nkJkWVH-mo