Spring Batch와 Scheduler
1. 스프링 배치
특정한 시간에 내가 원하는 일을 자동으로 시키는게 스케줄러의 역할이고 처음에 이것에 대해 먼저 학습을 하여 스프링 배치에 대한 개념에 혼동이 왔다. 둘이 비슷하다고 생각했지만 아예 다른 개념이였다. 배치는 '일괄처리' 라는 의미이다. 그리고 스프링에서 배치 작업 단위를 Job이라고 부른다. 스프링에서는 배치 작업이 원활하게 진행되도록 관련 기능을 제공해준다. 대용량 배치와 트랜잭션 기능을 간단하게 구현할 수 있다.
매일 전 날의 데이터를 집계해야한다고 가정해보자.
이 집계 과정을 어디서 수행하면 될까?
만약 이 작업을 Tomcat + Spring을 통해 집계를 수행한다면 컴퓨터의 CPU, I/O 등의 자원을 모두 사용 해버려 다른 요청을 처리할 수 없게 될 것이다.
보통 데이터를 집계하는 경우 집계 작업은 하루에 한번만 수행하게 된다. 이를 위해 API를 구성하는 것은 낭비일 수 있다.
단발성 대용량 데이터를 처리하는 애플리케이션을 배치 어플리케이션이라고 한다.
배치는 다음 조건을 만족해야한다.
- 대용량 데이터 - 대량의 데이터를 가져오거나, 전달하거나, 계싼하는 등의 처리를 할 수 있어야한다.
- 자동화 - 심각한 문제 해결을 제외하고 사용자 개입없이 실행되어야 한다.
- 견고성 - 잘못된 데이터를 충돌 / 중단 없이 처리할 수 있어야 한다.
- 신뢰성 - 무엇이 잘못되었는지를 추적할 수 있어야한다. (로깅, 알림)
- 성능 - 지정한 시간안에 처리를 완료하거나 동시에 실행되는 다른 어플을 방해하지 않도록 수행되어야 한다.
Batch 사용 사례
일매출 집계
많은 거래가 이루어지는 커머스 사이트의 경우 하루 거래건이 50만 ~ 100만건까지 발생한다.
이를 실시간 집계 쿼리로 해결하기엔 조회 시간이나 서버에 부하가 심해진다.
그래서 매일 새벽 전날 매출 집계 데이터를 만들어 외부 요청이 올 경우 미리 만들어둔 집계 데이터를 바로 전달하여 성능저하와 부하를 해결한다.
이러한 배치를 주기적으로 동작하게 해주는 Scheduler는 대표적으로 2가지가 존재한다.
- Quartz 스케줄러
- 스프링 스케줄러
2. Quartz 스케줄러
스케줄러란 단순히 잡을 특정 시간마다 실행되도록 도와주는 프로그램을 의미한다. Quartz에는 크게 3가지로 이뤄짐
- 실행하고자 하는 Job
- job의 실행 주기를 나타내는 trigger
- 트리거들을 스케줄러로 만드는 scheduler
사용 방법
- pom.xml에 관련 dependency 추가
- job으로 batch 작업을 진행할 서비스 구현
- context.xml에 2번에서 만든 job을 정의할 jobDetailFactoryBean, jobDetail와 연결해 실행주기를 정의할 cronTriggerFactoryBean, 트리거를 스케줄러로 생성해줄 SchedulerFactoryBean 3가지를 설정한다.
3. 스프링 스케줄러
스프링 3.1 버전부터 스프링에서 제공해주는 스케줄러다. Quartz보다 스케줄러를 디테일하게 사용하도록 하진 않지만 구현이 매우 간단하다.
어노테이션으로 설정
- xml 파일 상위에 xmlns 설정
- <context-component-scan /> 설정
- xml 파일에 <task:annotation-driven /> 설정 추가
- job으로 사용될 서비스 메소드명에 @Scheduler(cron 설정) 추가
자세한 설정 방법 링크
https://smujihoon.tistory.com/136
출처
https://jaegoon.netlify.com/posts/batch/
https://jojoldu.tistory.com/324?category=635883