[SpringBatch] SpringBatch 개념설명

BlackBean99·2022년 8월 17일
1

SpringBatch

목록 보기
1/1
post-thumbnail

Batch Application

배치(Batch)는 일괄 처리한다는 뜻입니다!
SpringBoot Project를 하게 되면 많은 데이터가 온다면 Tomcat + SpringMVC에서 서버는 바로 다운될 수 있어요!
또 하루에 한번만 수행되는 기능이나, 이미 실행한 적이 있어 그 실행을 차단하는 기능같은
단발성으로 대용량의 데이터를 처리할때 필요한 것이 Batch Application입니다.

Batch Application은 다음의 조건을 만족해야 해요
배치 애플리케이션은 다음의 조건을 만족해야만 한다.

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

Batch vs Quartz

Quartz 는 스케줄러의 역할입니다. Batch는 대용량 데이터 일괄처리를 지원하지만 Quartz는 지원하지 않죠. 하지만 Batch에서는 스케줄러 기능을 지원하지 않아요 그래서 둘다 혼용해서 사용하는 방법을 사용하는데요.
그래서 스케줄러인 Quartz가 Spring Batch를 실행하는 구조로 많이 사용합니다

Spring Batch 왜 쓰는건데?

역시 왜 쓰는지 알아야 이걸 배울지 말지 결정할 수 있겠죠!
수많은 처리가 들어올 수 있어요! 100만건 이상의 조회가 들어온다면 그것도 매일?
한달이면 3000~1억까지 조회할 수도 있겠죠.

서버 부하는 해결하기 어려운 문제입니다! 소잃고 외양간 고치기전에 외양간 먼저 고쳐야 겠죠?
미리 집계를 해놓고 마치 캐시에서 꺼내 쓰듯이 바로 전달한다면 성능과 부하 모두 개선될 수 있을 거에요!

Spring Batch란 무엇일까?

Spring Batch 는 

Spring Batch 용어

Job

Job은 배치처리 단위로 만들어논 객체입니다. 또한 배치처리 과정에 있어 전체 계층 최상단에 위치하고 있습니다.

JobInstance

JobInstance는 Job의 실행의 단위를 나타냅니다. Job을 실행시키게 되면 하나의 JobInstance가 생성되게 됩니다. 스케줄러가 실행할 때마다 각각의 JobInstance가 생성되는데 이것은 실행된 시간 단위에만 데이터를 처리합니다. 8월 18일에 생성한 Job Instance는 8월 19일의 데이터는 사용하지 않고 당일에만 처리한다는 뜻이겠죠?

JobParameters

JobParameters는 각 Instance의 구분자입니다! 구분 뿐 아니라 JobInstance의 매개변수역할도 합니다
또한 JobParameters는 String, Double, Long, Date 4가지 DataType을 지원합니다.

JobExecution

JobExecution은 JobInstance에 대한 실행 시도에 대한 객체입니다.같은 JobInstance를 여러번 실패해서 여러번 다시 재실행을 시켰다면 각 실행 2번째 3번째 ... JobExecution은 개별로 생기게 됩니다. JobExecution는 이러한 실행에 대한 상태,시작시간, 종료시간, 생성시간 등의 정보를 담고 있습니다.

Step

Step은 Job의 순차적인 단계라고 생각하면 됩니다. Job은 1개 이상의 Step을 가지며 Job 의 처리를 제어하는 모든 정보가 담겨있습니다.

StepExecution

StepExecution은 JobExecution과 똑같지만 Step 실행 시도에 대한 것입니다. 하지만 Job이 여러개의 Step으로 구성되어 있을 경우 이전 단계의 Step이 실패하게 되면 다음 단계가 실행되지 않음으로 실패 이후 StepExecution은 생성되지 않습니다. StepExecution 또한 JobExecution과 동일하게 실제 시작이 될 때만 생성됩니다. StepExecution에는 JobExecution에 저장되는 정보 외에 read 수, write 수, commit 수, skip 수 등의 정보들도 저장이 됩니다.

ExecutionContext

ExecutionContext란 Job에서 데이터를 공유하는 데이터 저장소입니다. Spring Batch에서 제공하는 ExecutionContext는 JobExecutionContext, StepExecutionContext 2가지가 있습니다. 하지만, 이 두가지는 지정되는 범위가 다릅니다.

  • JobExecutionContext의 경우
    Commit 시점에 저장된다
  • StepExecutionContext의 경우
    실행 사이에 저장이 되게 됩니다. ExecutionContext를 통해 Step간 Data 공유가 가능하며 Job 실패시 ExecutionContext를 통한 마지막 실행 값을 재구성 할 수 있습니다.

JobRepository

JobRepository는 위에서 말한 모든 배치 처리 정보를 담고있는 매커니즘입니다.

JobRepository 실행과정

Job이 실행 -> JobRepository에 JobExecution, StepExecution을 생성
-> JobRepository에 Execution 정보들을 저장하고 조회하며 사용하게 됩니다.

JobLauncher

JobLauncher는 Job과 JobParameters를 사용하여 Job을 실행하는 객체입니다.
JobExcution과는 다른 개념입니다. Excution은 실행한 시점, 상태 정보를 담는 객체라면 Jauncher는 Job을 실행을 하는 객체입니다.

Step의 처리방식

순차적인 Step을 수행하기 위해 2가지 방식을 지원합니다

1. Chunk 지향 처리 방식

Spring Batch에서의 Chunk란 처리 되는 커밋 row 수를 의미합니다. Batch 처리에서 커밋 되는 row 수라는건 chunk 단위로 Transaction을 수행하기 때문에 실패시 Chunk 단위 만큼 rollback이 되게 됩니다.

Chunk 지향 처리에서는 다음과 같은 3가지 시나리오로 실행 됩니다

  1. 읽기(Read) — Database에서 배치처리를 할 Data를 읽어온다
  2. 처리(Processing) — 읽어온 Data를 가공,처리를 한다 (필수사항X)
  3. 쓰기(Write) — 가공,처리한 데이터를 Database에 저장한다. (Processing안하고 바로 Write가능)

Chunk 가 동작하는 Flow Diagram을 보면 3가지 시나리오를 이해하기 쉽습니다.

위 3가지 구분적인 처리를 하기 위해 아래를 사용합니다.

ItemReader

ItemReader는 Step에서 Item을 읽어오는 인터페이스입니다. ItemReader에 대한 다양한 인터페이스가 존재하며 다양한 방법으로 Item을 읽어 올 수 있습니다.

ItemProcessor

Item Processor는 Reader에서 읽어온 Item을 데이터를 처리하는 역할을 하고 있다. Processor는 배치를 처리하는데 필수 요소는 아니며 Reader, Processor, Writer 처리를 분리하여 처리합니다.
이 내용은 아래 Step 처리방식인 Chunk처리방식의 시나리오입니다.

ItemWriter

ItemWriter는 처리 된 Data를 Writer 할 때 사용한다. Writer는 처리 결과물에 따라 Insert가 될 수도 Update가 될 수도 있다. Writer 또한 Read와 동일하게 다양한 인터페이스가 존재한다. Writer는 기본적으로 Item을 Chunk로 묶어 처리하고 있습니다.

2. Tasklet 처리 방식

Tasklet은 하나의 메서드로 구성 되어있는 간단한 인터페이스입니다. 이 메서드 는 실패를 알리기 위해 예외를 반환 하거나 throw할 때까지 execute를 반복적으로 호출하게 됩니다.

profile
like_learning

0개의 댓글