[Spring Batch] 스프링 배치(Spring Batch) 란?
Spring

[Spring Batch] 스프링 배치(Spring Batch) 란?

728x90

배치(Batch)란?

Batch 라는 단어는 일괄처리 라는 뜻을 가지고 있습니다. 따라서 배치 애플리케이션(Batch Application)이란 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 의미합니다. 배치 애플리케이션은 다음의 조건을 만족해야 합니다.

  • 대용량 데이터: 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 ​​있어야 합니다.
  • 자동화: 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
  • 견고성: 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
  • 신뢰성: 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅, 알림)
  • 성능: 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다.

스프링 배치란?

스프링 배치(Spring Batch)는 스프링 프레임워크에서 지원하는 배치 애플리케이션입니다. 2007년에 Accenture와 Spring Source의 공동작업으로 탄생했습니다. Spring Batch는 "로깅/추적", "트랜잭션 관리", "작업 처리 통계", "작업 재시작", "건너뛰기", "리소스 관리" 등 대용량 데이터 처리에 필요한 기능을 제공합니다.


왜 사용하나요?

여러분이 하루에 몇천만명이 방문하는 쇼핑몰을 운영하고 있다고 가정해봅시다. 이 쇼핑몰의 1년치 데이터를 집계해서 처리해야한다고 할때, 이걸 단순히 Spring MVC의 API로 만들게 된다면 해당 서버는 순식간에 CPU, I/O 등의 자원을 다 써버려서 다른 Request 처리를 못하게 될 것입니다. 만약 jvm 메모리를 엄청나게 많이 할당해서 자원이 충분하다고 가정해봅시다. API 호출로 집계처리를 하던중 마지막쯤에 exception이 발생한다면, 몇천만개의 데이터 처리를 처음부터 다시 실행을 해야겠죠?

 

이처럼 대용량테이터 처리를 비즈니스 로직과 함께 놓으면 부가적으로 신경써야하는 부분이 굉장히 많습니다. 따라서 Spring Batch라는 배치 애플리케이션을 이용해서 단발성으로 대용량 데이터를 처리하는 애플리케이션을 분리시키는 것입니다!

 

정리하면 사용하는 경우는 아래와 같습니다

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

스프링 배치 구성요소

스프링 배치는 크게 위 그림에 나온 순서로 동작합니다.

 

아마 기존 스프링 프레임워크에서는 볼 수 없던 용어들을 보실 수 있으실텐데요! 한번 하나씩 알아봅시다.

  • Job: 실행시킬 작업을 뜻합니다. 하나의 Job이 하나의 커다란 작업 목표를 가지고있기 때문에 마치 API 엔드포인트 같은 느낌이죠. 예를 들어 월매출을 집계하는 Job, 최근 2개월동안 이탈한 회원을 집계하는 Job이 있을 수 있습니다.
  • JobRepository: 수행되는 Job에 대한 모든 정보를 담고 있는 저장소입니다. 어떠한 Job이 언제 수행되었고, 언제 끝났으며, 몇 번이 실행되었고 실행에 대한 결과가 어떤지 등의 Batch 수행과 관련된 모든 meta data가 저장되어 있습니다.
  • JobParameter: Job을 시작하는데 사용하는 파라미터의 집합으로 Job이 실행되는 동안에 Job을 식별하거나 Job에서 참조하는 데이터로 사용됩니다.
  • JobExecution: 단 한 번 시도되는 Job 실행을 의미하는 기술적인 개념입니다. 시작 시간, 종료 시간, 상태(시작됨, 완료, 실패), 종료 상태의 속성을 가집니다.
  • JobLauncher: Job과 JobParameter를 받아서 Job을 실행하 역할을 담당합니다. 애플리케이션에 "야 저 Job 진행시켜" (feat. 이경영)라고 해주면서, Job의 재실행 가능 여부 검증, Job 의 실행 방법, 파라미터 유효성 검증 등을 수행합니다.
  • Step: Job을 구성하는 단계입니다. 한단계(Step)로 처리할 수도 있고, 여러 단계(Step)로 나누어서 처리할 수도 있습니다. 이는 전적으로 개발자의 선택에 달려있습니다. Step은 실질적으로 데이터를 읽어와서 처리하는 작업을 수행합니다.
  • StepExecution: 하나의 Step을 실행하는 한 번의 시도입니다. 시작 시간, 종료 시간, 상태, 종료상태, commitCount, itemCount의 속성을 가집니다.
  • Item: 처리할 데이터의 가장 작은 단위입니다. RDB로 따진다면 한개의 row 로 볼 수 있겠습니다.

스프링 배치를 실행시키기 위해 필요한 런타임 메타데이터 모델

스프링 배치는 배치 실행에 관련한 모든 정보(Job, JobParameter, JobExecution, Step, StepExecution)를 DB에 저장하고, 참조하며 순차적으로 실행합니다. 이러한 형태를 런타임 메타데이터 모델이라고 합니다.

자세하게는 다음의 내용을 포함하고 있습니다.

  • 이전에 실행한 Job이 어떤 것들이 있는지
  • 최근 실패한 Batch Parameter가 어떤 것들이 있고, 성공한 Job은 어떤 것들이 있는지
  • 다시 실행한다면 어디서부터 시작하면 될지
  • 어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step들은 어떤 것들이 있는지

DB 종류에 따라서 자동으로 생성되거나 자동으로 생성되지 않을 수도 있습니다. 그때는 spring-batch-core 라이브러리에 있는 sql파일을 참고해서 직접 생성하셔도 됩니다.


어? 뭔가 빼먹으신거 아닌가요? ItemReader, ItemProcessor, ItemWriter는 왜 설명을 안해주시죠? 라고 하실수도 있는데 이에 대해서는 스프링 배치의 Chunk와 Tasklet을 다루면서 설명하도록 하겠습니다!

 

 

출처:
- 1. Spring Batch 가이드 - 배치 어플리케이션이란?
- 스프링 배치(Spring Batch)란? 소개 및 예제
- Spring Batch란
728x90