- 일전의 공부한 내용을 실제로 구현해보면서 공부해보고자 시작한 프로젝트다.
- 이전 글
- 아직 공부 중인 개념입니다. 조금 틀려도 너른 이해 부탁드립니다!
- 이 글은 개인적인 의견을 다룹니다.
다루는 내용
- spring batch를 적용하면서
Spring batch를 적용하면서
목차
1. 실행을 어떻게 할까?
2. 어떻게 쓸까?
1. 실행을 어떻게 할까?
- 각 매장의 한 달 스케쥴을 생성하기 위해서 매 달 초 스케쥴을 기반으로 Batch 작업을 진행할 필요가 있었다.
- Batch 작업을 Fire 할 방법은 여러 가지가 있었지만 지금 프로젝트에서 가장 적합한, 어느 정도 유연성이 있는 방법을 선택할 필요가 있었다.
1. Spring의 @Scheduled 어노테이션
- 장점
- cron, fixed delay 등 여러 방법을 선택할 수 있다.
- Quartz보다 늦게 나왔으며 비교적 단순하게 구성되어 있다.
- 단점
- \JVM에서 진행되며 재시작 시 스케쥴 정보가 유실된다.
- 다중 인스턴스 환경에서 중복 위험이 있다.
2. Quartz Scheduler + Spring Batch
- 장점
- Spring Batch와 연동이 되는 환경이다.
- 클러스터링 지원으로 다중 인스턴스 환경에서 안전하다.
- 배치 작업 상태 관리를 영속화하여 진행할 수 있다.
- 단점
- Quartz를 위한 메타 테이블이 추가로 필요하다.
- 여러 복잡한 설정이 필요하다.
3. 외부 인프라 (Jenkins, Cron, Kubernetes CronJob)
- 장점
- 인프라 레벨에서 스케쥴링을 관리할 수 있다.
- 배치 전용 리소스 할당으로 성능 최적화를 할 수 있다.
- 어느 정도 검증된 안정적인 방식
- 단점
- 추가 인프라 설정 필요
- 배치 애플리케이션에 대한 별도 패키징이 필요하다.
결과적으로 Jenkins를 선택했다. k8s CronJob 역시 고려할 선택지지만 현재 k8s를 사용하지 않으므로 다음 번에 선택하기로 했다.
2. 어떻게 쓸까?
- Jenkins도 여러 가지 방법으로 쓴다.
- Jenkins로 Batch application을 실행시켜서 Job을 실행시키고 종료시킨다.
- 실행되고 있는 Batch application에 RestAPI를 만들고 call해서 실행시킨다.
결과적으로 2를 선택했다. 굳이 새로 켰다 끌 필요가 없다는 점, 누락되더라도 바로 확인하고 대응할 수 있다는 점, 더 나아가 이력 등을 조회할 수도 있다는 점이 긍정적인 점으로 보였다.