Spring Batch
Batch란?
Batch란 영어단어가 일괄 이란 뜻 답게 일괄적으로 처리한다는 뜻입니다. 보통 업계에서는 데이터를 일괄되게 추출(Extract)하거나, 변환(Transformation)하거나, 적재(Load)하는 작업을 앞자를 따서 ETL이라 합니다. 이런 ETL 과정을 일정한 시간과 순서, 조건에 따라 수행하는 작업을 Batch라고 합니다.
스프링 배치는 Job과 Step을 기준으로 배치를 수행하기 쉽게하고, 대용량 데이터를 처리하는 데에도 편리하도록 뭉텅이로 잘라 ETL 작업을 할 수 있는 Chunk 지향처리를 제공하고 있습니다.
개념 길라잡이
핵심
앞서 언급했듯, 스프링 배치는 Job과 Step을 기준으로 배치 단위를 실행합니다. 그리고 Job과 Step안에서는 배치에 필요하고 중요한 개념을 아래에서 설명하겠습니다.
런타임 메타데이터 모델
스프링배치는 배치실행에 관련한 모든 정보를 DB에 저장하고, 참조하며 순차적으로 실행합니다. 이러한 형태를 런타임 메타데이터 모델이라 합니다.
JobRepository
스프링배치는 미리 정의된 스키마에 메타데이터와 배치 실행 계획을 저장한 다음, 차례대로 실행해가며 결과를 저장합니다. 이런 실행 내용은 JobRepository
가 중심이 되어 처리합니다. JobRepository
는 여러분이 설정한 Job
과 Step
등의 정보를 불러와 순차적으로 실행합니다.
- Spring batch 스키마 정보
Job
Job은 하나의 배치 실행 단위입니다.
JobInstance
Job을 식별하기 위해 만들어낸 Instance입니다. 이때, Job 실행에 필요한 매개변수인 JobParameter를 Job에 담아 Instance로 만듭니다.
JobExecution
JobInstance가 실행되는 것을 JobExecution이라 합니다. JobInstance는 JobExecution과 1:1관계입니다. 즉, JobInstance를 다시 실행해야한다면, JobExecution 또한 하나더 생성되겠죠.
Step
Step은 Job에서 실행하는 작은 실행단위입니다. Step은 조건에 따라, 다음 스텝으로 진행하거나 진행을 멈출 수도 있고, 진행을 다시 실행할 수도 있습니다.
그리고, 쓰레드를 통한 동시처리(병렬처리)와 같은 형태로 Step을 처리할 수도 있습니다.
ItemReader > ItemProcessor > ItemWriter
Step은 Step 자체로도 배치를 처리할 수도 있지만, 좀 더 세분화하여 순차적으로 실행할 수도 있습니다.
-
ItemReader는 데이터를 읽어들이거나, File과 같은 것을 읽어들일 때 사용합니다.
-
ItemProcessor는 읽어들인 데이터를 가공할 내용을 정의합니다. 생략할 수도 있습니다.
-
ItemWriter는 읽어들인 데이터 또는 가공이 끝난 데이터를 저장할 때 사용합니다.
Tasklet과 Chunk
Step은 처리과정에서 Tasklet을 직접 정의하거나, Chunk 지향처리로 처리할 수도 있습니다.
Chunk 지향처리
Chunk란 풀이하자면, 데이터 또는 파일 등 한번에 로드하기에 버거운 작업을 할 때 일정한 크기로 자른 뭉텅이라고 생각하시면됩니다. 데이터를 일정한 크기만큼 읽고, 가공한 다음, 저장하는 것을 의미합니다.
만약, 여러분이 일배치로 1억건의 데이터를 받았다고 생각해봅시다. 1억건의 데이터를 모두 메모리로 읽어들이고, 가공한 다음, DB에 저장합니다. 읽어들이고 가공하고 저장할 때 아무런 에러없이 끝났다면 다행이지만, 만약 한 건의 데이터라도 예상과 다른 유형의 데이터가 섞여있다면? Retry하는 과정에서 다시 1억건의 데이터를 읽고 가공하고 저장하고의 과정을 반복해야할 겁니다. 우선 메모리 용량도 용량이지만, 한번에 모든 데이터를 가공할 때의 과정도 만만치 않으며, DB Insert나 File Out 하는 과정에서 트랜젝션을 묶고 있어야한다는 부담도 있습니다.
https://derveljunit.tistory.com/314
'Java & Spring > Spring' 카테고리의 다른 글
[스프링부트] Gradle 에서 프로퍼티 / YAML / application 중복 오류 해결하기 (0) | 2021.12.07 |
---|---|
spring-dev-tools를 통한 개발 시, 자동 반영(Reloading) 적용하기 (0) | 2020.02.14 |
Springboot + Web 에서 /resources/static 정적 리소스 URL 접근 방법 (0) | 2020.01.12 |
[빠르게 보는 스프링] 스프링부트 Test를 위한 Embedded Redis 사용하기 (0) | 2020.01.06 |
[빠르게 보는] 스프링5 / 스프링부트 파일 업로드 (2) | 2019.07.02 |
WRITTEN BY