[Spring] Spring Batch

·2023년 1월 11일
0

킁킁메이트

목록 보기
10/10
post-thumbnail

🚨 팀 프로젝트를 진행하면서 게시 글 도메인을 맡았다. 간단한 CRUD만 구현하면 될거라 생각했었는데, 사용자가 게시 글에 작성한 약속 시간이 지나면 게시 글의 상태모집 중 -> 모집 완료변경해야 할 필요성을 느껴 Spring Batch에 대해 학습하려고 한다.

Spring Batch

일괄 처리

Batch의 사전적 의미를 살펴보면 어떤 기능을 하는 프레임워크인지 대략적으로 알 수 있다.

말 그대로 일괄 처리를 위한 프레임워크!

공식문서에 따르면 Spring Batch는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공한다.

Spring Batch는 배치가 실패하여 작업 재시작을 하게 된다면 처음부터가 아닌 실패한 지점부터 실행하게 된다.

동작 방식

기본적으로 배치 프로그램은 아래와 같이 Read-Processing-Write로 동작한다.

  1. 데이터베이스, 파일, 큐에서 다량의 데이터를 조회한다.
  2. 특정 방법으로 데이터를 가공한다.
  3. 가공한 데이터를 다시 저장한다.

유사한 트랜잭션을 하나로 묶어 처리해줌으로써 반복적인 작업을 자동화한다.

Spring Batch 용어 정리

Job

: 전체 배치 프로세스를 캡슐화한 엔티티, 배치 처리 과정을 하나의 단위로 만들어 놓은 객체.

  • 전체 계층 구조에서 가장 위에 존재하지만, JobStep 인스턴스의 컨테이너 개념으로 사용한다. 여러 Step을 결합하고, 재시작 같은 속성을 구성할 수 있다.

JobInstance

: Job 실행의 단위.

  • job이 각각 실행할 때마다 따로 추적할 수 있도록 매 실행마다 생성된다. 특정 job과 식별 가능한 JobParameters에 상응하는 JobInstance는 단 한 개뿐이다.

💡 새 JobInstance를 사용한다는 것은 처음부터 시작을 의미하고, 이미 있는 Instance를 쓴다는 것은 멈췄던 곳에서부터 시작을 의미한다.

JobParameters

: JobInstance에 전달되는 매개변수 역할, JobInstance를 구분하는 식별자 역할

JobExecution

: Job에 대한 실행 시도 정보를 담은 객체.

  • JobExecution은 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 담고 있다.
  • JobInstance는 실행이 성공적으로 끝나지 않는다면 완료되지 않은 것으로 간주하는 것과 달리 JobExecution는 실패와 성공에 상관없이 하나의 실행 정보로 저장한다.

    3번에 실행이 일어났고 1번 인덱스를 가진 JobExecution는 실패하였다. job이 실행되었으므로 JobInstance이 생성되었지만 작업이 실패하였기 때문에 2번째 실행에서는 여전히 1번 인덱스를 가진 JobInstance이 사용되었다. 작업에 성공하면 다음 실행은 새로운 JobInstance을 생성한다.

Step

: 배치 Job의 배치처리를 정의하고 순차적인 단계를 캡슐화 한 도메인 객체. Job은 하나 이상의 Step을 가져야 한다.

  • 배치 작업의 실질적인 실행 로직이 담겨 있으며 일괄 처리를 제러하는 모든 정보가 들어있다.

StepExecution

: Step에 대한 실행 시도 정보를 담은 객체.

  • 실제로 Step이 시작되었을 때만 StepExecution을 생성한다.
  • 이전 단계의Step이 실패하였다면, StepExecution을 생성하지 않는다.

ExecutionContext

: 프레임워크에서 유지/관리하는 key-value의 컬렉션. StepExecution객체 또는 JobExecution객체에 속하는 상태를 저장한다.

  • 재시작에 필요한 상태 정보나 배치 작업에서 유지 해야 하는 모든 데이터가 담겨있다.
  • ExecutionContext을 통해 Job, Step간 데이터 공유가 가능하며, Job 실패 시 이 것을 통해 마지막 실행 값을 재구성할 수 있다.

JobExecutionContext

: Commit 시점에 저장

StepExecutionContext

: 실행 사이에 저장

JobRepository

: 위에 업근된 모든 저장(Persistence)매커니즘을 담당.

  • JobLauncher, Job, Step 구현체에 CRUD 기능을 제공
  • Job을 실행할 때 Repository에서 JobExecution을 조회하고, 실행 중에는 JobExecution, StepExecution 구현체를 Repository에 넘겨 저장한다.

💡 ServerApplication단에 @EnableBatchProcessing 을 추가하면 자동으로 JobRepository을 컴포넌트로 설정한다.

JobLauncher

: 주어진 JobParametersJob을 실행하는 간단한 인터페이스.

Item Reader

: Step에서 아이템을 한 번에 하나씩 읽어오는 작업을 추상화한 개념.

  • 더 이상 읽을 아이템이 없으면 ItemReader는 null을 반환한다.

Item Writer

: Step에서 배치나 청크 단위로 아이템을 출력하는 작업을 추상화한다.

  • ItemWriter는 다음에 받을 입력이 무엇인지 알지 못하며 현재 받은 아이템만 알고 있다.

Item Processor

: 아이템을 처리하는 비즈니스 로직을 나타내는 추상화 개념

  • ItemProcessor가 null을 반환하면, 해당 아이템이 유효하지 않고 Write되면 안된다는 것을 의미한다.

Tasklet와 Chunk

TaskletStep

TaskletStepTasklet을 가진 객체다. 기본적으로 무한히 반복하는 형태로 동작을 하며, TaskletStep은 하나의 Tasklet만 수행한다.

💡TaskletStep 반복 실행 여부

  • RepeatStatus.Finished, Null: 반복 수행하지 않고 종료.
  • RepeatStatus.Continuable : Teaklet 반복

장점

  • 단순하게 처리할 수 있다.

단점

  • 데이터를 쪼개서 처리하지 않기 때문에 대용량 데이터를 감당하기 어렵다.

Tasklet

: 단일 객체를 바탕으로 비즈니스 로직을 수행한다.

  • 하나의 메서드로 구성되어 있는 간단한 인터페이스
  • Tasklet의 메서드는 예외를 반환하거나, throw할 때까지 무한히 반복 호출된다.
  • 예외 처리에 대한 로직을 주의 깊게 구현해야 한다.

🚨 대용량 데이터를 사용하기에는 Tasklet 방식에는 무리가 있기 때문에 대용량 데이터를 처리해야 하는 일에는 Chunk 처리 방식을 지향한다.

Chunk 지향 처리 방식

Spring Batch는 대부분 Chunk 지향 처리 방식을 사용한다. 해당 방식은 한 번에 데이터를 하나씩 읽어와 트랜잭션 경계 내에서 쓰여질 Chunk를 만드는 것이다.

💡 트랜잭션을 커밋하기 위해 처리할 아이템 수가 정해져 있고, 아이템 수의 단위를 Chunk라고 한다.

  • Chunk단위로 트랜잭션을 수행하기 때문에 작업에 실패할 경우 Chunk만큼 rollback이 된다.
  • 트랜잭션이 커밋되려면 반드시 ItemWriter가 Chunk 전체를 write해야 한다.
  • ItemReader, ItemProcessor, ItemWriter 객체 간의 상호작용을 바탕으로 비즈니스 로직을 수행한다.

장점

  • 대용량 데이터 처리에 적합하다.

단점

  • ItemReader, ItemProcessor, ItemWriter의 관계 이해가 필요하다.

참고
Spring Batch 공식문서
토리맘 한글라이즈 프로젝트
Spring Batch : TaskLetStep 관련 정리

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글