본문 바로가기

프로그래머로 살아가기/Java

Spring에서 배치잡 Background 프로세스 구동시키기






일명 배치잡(Batch Job) 이라고 하는 주기적으로 구동시켜야 하는 작업들을 Spring에서 구동 시키기 위하여서는 Spring Batch 라는 프로젝트가 따로 존재 합니다. 




Spring Batch가 배치작업의 끝판왕이라면 Spring이 주로 사용되기 이전부터 Quartz라는 라이브러리를 java쪽에서는 많이 사용을 했었는데요. 


Spring에서도 이 Quartz를 지원해서 간단하게 주기적인 배치작업을 구동시킬수 있습니다. 




이렇게 스케줄러를 이용해서 Spring project상에서 배치작업을 Invoke시키는 방식은 통합적인 코드로 스케줄 작업들을 관리할수 있기 때문에 관리 측면에서 유리한 점이 있습니다. Spring 프로젝트 배포 시스템에서 따로 설정을 해주거나 관리를 해줄 필요가 없구요. 


반면 WAS서버가 여러대가 동시에 구동되는 실제 대용량 환경을 고려해본다면 실제 배치잡이 한군데에서만 구동되어야 하는 경우가 있을 것입니다. 두개의 인스턴스가 동시에 구동이 된다면 로직상에 문제가 생길만한 작업의 경우에 말이죠. 


예를 들면 주기적으로 보상을 해주거나 리셋을 해야 한다거나 통계를 내야 한다거나 하는 작업들이 있겠네요. 


이렬경우는 배치작업이 셋팅된 프로젝트를 따로 분리하여 한대의 서버에만 설치를 한다거나,  한대의 서버에서만 배치작업이 구동되게 설정을 바꾼다거나 하는 작업이 필요 해집니다. 


이럴경우 좀 번거롭게 되는것이 사실입니다. 


그래서 그냥 간단하게 외부 라이브러리 없이 Async하게 작업을 구동시키는 컴포넌트를 만들고,  내부URL에서만 접속가능한 Controller를 만들어서 패키지를 모든 배포하고 cronjob을 한대의 서버에서만 셋팅해서 내부 URL을 원하는 타임에 호출하게 해주면 어떨까 생각해 봤습니다.


interface 

PvpRankingRewardWorker.java 



Implementation
PvpRankingRewardWokerImpl.java


Controller코드는 간단하므로 생략했고, 

cronjob에는 wget같은 유틸을 이용해서 wget URL 같이 등록을 해주면 될것 같습니다.


이런방식이 Spring batch나 Quartz를 사용하는 방식보다 간단해 보이는데 어떻게 생각하시나요?