[TIL] Spring Batch

jp·2023년 2월 13일
0

TIL

목록 보기
3/4

🐱‍🏍Spring Batch

배치는 일괄처리를 의미한다.

단발성으로 대용량의 데이터를 처리할때 사용하며 spring MVC를 사용하여 비즈니스 로직에 최대한 집중 할 수 있게 만들어주는 프레임워크. Spring Batch는 Spring의 특성을 그대로 가져와 DI, AOP, 서비스 추상화 등 spring 프레임워크의 3대 요소를 모두 사용할 수 있다.

📛batch와 scheduler는 다른것

spring batch는 사용자와의 상호작용 없이 데이터를 일괄처리 하는 것을 의미하고 spring scheduler or Quartz는 정해진 시간에(또는 일정시간에) 등록한 작업을 자동으로 실행시키는 것을 말한다.
대부분 배치고 처리 할 일을 정의해 놓고, 이를 원하는 시간에 scheduler나 quartz를 이용해 자동으로 실행시키기 때문에 주로 함께 사용된다. 그치만 같은건 아님!!!

🐱‍🏍Features

  • 트랜잭션 관리
  • Chunk 지향 처리
  • 선언형 I/O(입출력)
  • Start/Stop/Restart
  • Retry/Skip 가능

🐱‍🏍Usage

spring batch 3.0을 기준으로 작성되었습니다.

spring-batch-구성도

job
배치처리 과정을 하나의 단위로 만들어 놓은 객체. 배치처리 과정의 전체 계층 최상단이다.

<batch:job id="jobId">
	<!-- step 등이 들어감 -->
</batch:job>

step
job의 실제 배치처리를 정의하고 순차적인 단계를 캡슐화한다. job은 최소한 1개 이상의 step을 가져야 하며 실제 일괄 처리를 제어하는 모든 정보가 들어있다.

tasklet
일반적인 component = 개발자가 이 step에서 하고싶은 내용을 자유롭게 만들 수 있음

  • tasklet을 implements 해서 사용, 실행 할 내용은 excute 함수에 넣으면 된다(override로 사용). 실행 전후에 하고싶은 일이 있으면 beforeStep, afterStep을 사용해서(override) step(excute) 전후에 원하는 일을 할 수 있다.
  • 만든 tasklet을 jobConfiguration에서 Bean으로 등록해준다.
  • component 이름은 @Component("className") 형식으로 명시한다.
<batch:step id="stepId" next="nextStepId">
	<batch:tasklet ref="실행할 component 이름"/>
</batch:step>

partion(step)
내부적으로 partionHandler/stepExecutinSplitter/stepExecutionAggregator를 가짐. stepExecutionSplitter를 이용해 쓰레드 갯수만큼 stepExecution을 만들어 partionHandler를 통해 멀티쓰레드를 실행시킨다. 이후 완료된 slave step 정보를 stepExecutionAggregator를 이용해 집계한다.

partion handler
partion step에 의해 호출되며 내부적으로 taskExecutor를 통해 work step(slave step)을 병렬로 실행시킨다. slave step들이 사용할 step execution은 stepSplitter, partioner를 통해서 발생시킨다. handler는 병렬로 실행 후 최종 결과를 담은 stepExecution을 partion step에 반환해준다.

grip-size
slave step에서 사용할 step excution을 gripSize 만큼 생성해준다. 파티션을 나누는 사이즈로, 쓰레드 개수로 이해하면 된다. partioner를 통해 execution context를 얻어 step execution에 매핑한다.

<batch:step id="stepId" next="nextStepId">
	<batch:partition step="stepName" partitioner="componentName">
		<batch:handler grid-size="10" task-executor="taskExecutor"/>
	</batch:partition>
</batch:step>

ExcutionContext
Batch Job 내의 step 사이에서 데이터 공유 및 조작이 필요할 때 사용하는 것

<property name="name" value="#{jobExecutionContext['PARAMETER_NAME']}"/>

살펴보는 코드에서는 setter를 이용해서 넣어줌

Partion step
파티셔닝 step은 멀티쓰레드 환경을 이용해 빠른 batch job처리를 위해 스프링 배치가 지원하는 step이며 step을 partion하여 이용 가능.
메인쓰레드는 job을 실행시키고 이 job은 step>masterStep>step으로 나뉘는데 masterStep은 slaveStep을 가진다. 이 slaveStep을 멀티쓰레드에서 분산처리 하도록 처리한다. 쓰레드 개수만큼 slave step을 생성해서 동시에 처리하는 것으로 이해할 수 있다.
= master step이 지정된 수의 작업자로 분할처리 하는것

References

profile
응애 개발자지망생이 알고리즘에 고통받는 중

0개의 댓글