공공 데이터 포털 Open API를 활용하여 개인 프로젝트를 진행한 적이 있습니다. 데이터의 최신성을 고려하여 일정 시간마다 open API를 호출하여 새로운 정보를 갱신하기 위해 Spring Scheduler를 공부하고 적용하였습니다.
Spring Scheduler를 공부할 때 Spring Batch와 비교하며 설명하는 경우를 심심찮게 보게 되어 Spring Batch도 이참에 공부해야겠다 생각이 들어 포스팅하게 되었습니다.
Spring Scheduler에 대해서 궁금하다면 아래 링크를 클릭
https://yeo-computerclass.tistory.com/417
일정 주기마다 작업 실행하는 Spring Scheduler
개인 프로젝트를 진행하면서 공공 데이터 포털 Open API를 활용하였습니다. 이때 공공 데이터의 최신성을 위해 Spring Scheduler를 공부하게 되었습니다. Scheduling 활성화 설정 Spring Scheduler는 @Scheduled
yeo-computerclass.tistory.com
Batch & Scheduler 정의
스케줄러(Scheduler)
- 일정한 시간(혹은 날짜)에 등록한 작업을 자동으로 실행하도록 하는 작업을 의미한다.
배치(Batch)
- 데이터를 실시간으로 처리하는 것이 아닌 모아서 일괄 처리하는 작업을 의미한다.
- 하루동안 쌓인 데이터(대용량)를 배치 작업을 통해 특정 시간에 일괄처리하는 경우이다. 사용자에게 빠른 응답이 필요하지 않은 서비스에 적용할 수 있고 일괄처리를 하기 때문에 특정 시간 이후에는 자원을 거의 소비하지 않는 것이 특징이다.
배치와 스케줄러는 다른 개념이지만 특정 시간에 프로그램(작업)을 실행한다는 점에서 같은 개념이라 혼동할 수 있다.
Spring Batch
스프링 프레임워크에서 사용되는 배치 프레임워크인 Spring Batch 역시 대용량 일괄처리의 편의를 위해 만들어졌다.
Spring Batch 사용 경우
- 대용량의 비즈니스 작업 처리
- 로깅 / 추적
- 작업 처리 통계
- 트랜잭션 관리
- 작업 재시작 건너뛰기
- etc
Spring Batch Architecture
Spring Batch는 아래와 같이 3가지 구조로 나뉜다. 모듈화함으로 인해서 개발자는 Application 계층의 비즈니스 로직에 집중할 수 있고, 배치의 동작과 관련된 것은 Batch Core에 있는 클래스들을 이용하여 제어할 수 있다.
- Application
- Spring Batch를 통해 개발자가 작성한 모든 배치 작업과 사용자 정의 코드
- Batch Core
- 배치 작업을 시작하고 제어하는 데 필요한 핵심 API 포함 (실행, 모니터링 등)
- JobLauncher, Job, Step, Flow 등
- Batch Infrastructure
- Application과 Core 모두 공통 Infrastructure 위에서 빌드한다.
- Job 실행의 흐름과 처리를 위한 틀을 제공한다.
- 개발자와 애플리케이션에서 사용하는 일반적인 Reader, Writer, RetryTemplate 같은 서비스를 포함
Spring Batch Architecture 용어 설명
- JobRepository
- 배치 처리 정보를 저장하는 저장소 역할
- 저장 정보 : 배치 수행과 관련된 수치 데이터, Job의 상태
- Job
- 배치처리 과정을 하나의 단위로 표현한 객체
- 하나 이상의 Step을 포함하는 컨테이너이다.
- step
- 스프링 배치에서 가장 일반적인 상태 단위
- Job을 구성하는 독립적인 하나의 단계로 Job의 세부 작업을 Task 기반으로 설정하고 명세해놓은 객체이다.
- tasklet, Chunck 두 가지 기반 존재
- tasklet
Step이 중지될 때까지 계속 반복해서 수행된다. 수행할 때마다 독립적인 트랜잭션이 얻어진다.
초기화, 알림 전송 등에 사용된다. - chunk
한 번에 하나씩 데이터(Chunk)를 읽어들여, Chunk 단위로 트랜잭션을 다룬다.
Chunk 단위로 트랜잭션을 수행하기 때문에 실행하여도 Chunk 만큼만 Rollback 되고 그전까지 결과는 적용된다. - 스프링 배치는 대용량 데이터를 다루는 경우가 대다수이기 때문에 Chunk 기반을 선호한다.
- tasklet
- JobLauncher
- 배치 Job을 실행시키는 역할로 실행된 Job은 갖고 있는 Step을 실행한다.
- JobInstance, JobParameters, JobExecution 등 여러 용어와 흐름에 대한 이해가 있어야 하지만 스프링 부트는 Job을 시작하는 기능을 제공하기 때문에 역할이 이렇구나 정도만 받아들이고 추후에 다시 공부해 보길 바란다.
- ItemReader / ItemProcessor / ItemWriter
- Chunk 모델을 구현하면서 데이터의 입력 / 처리 / 출력 3가지 프로세스로 분할하기 위한 인터페이스이다.
- ItemReader와 ItemWriter는 데이터 IO를 담당한다. 데이터 베이스와 파일을 Java객체 컨버팅을 제공하기에 Spring Batch를 사용하는 것으로 충분히 컨버팅이 가능하다.
- ItemProcessor는 입력 확인 및 비즈니스 로직을 구현한다.
- Chunk 모델을 구현하면서 데이터의 입력 / 처리 / 출력 3가지 프로세스로 분할하기 위한 인터페이스이다.