어플리케이션을 운영하다보면 사용자와의 상호작용 없이, 대량의 데이터를 한번에 가공해야할 일이 생긴다. 예를 들어 월초에 사용자의 실적에 따라 등급을 업그레이드하거나, 연말 정산등을 할 때도 한번에 수많은 자료를 일괄적으로 처리해야 한다.
그리고 이런 작업은 대부분 반복적으로 수행되며, 레코드를 읽고 → 데이터를 처리하고 → 데이터를 다시 쓰는 비슷한 방식으로 수행된다. 따라서 spring에서는 이러한 기본 배치 반복을 자동화하고, 객체화 하여 사용자가 보다 쉽게 배치 작업을 수행할 수 있도록 했다.
Spring batch의 기본 구현 방식은 상단과 같다. Job launcher가 사용자가 명시한 여러가지 Job들을 수행한다. 그리고 JOB은 여러가지의 Step으로 이루어져 있다.
유저 등급을 갱신하는 상황을 예시로 들어보면, “매월 1일 유저 등급을 갱신하고, 등급에 따라 쿠폰을 배부한다”가 Job이고, Step1은 “유저 테이블에 등급을 매긴다”, Step2는 “등급에 따라 쿠폰을 배부한다” 가 될 것이다.
그리고 Step을 구현하는 두가지 방식에 대해 알아보자
spring batch의 경우 애초에 대용량의 데이터를 한꺼번에 처리하기 위해 만들어졌으므로, 수많은 레코드들을 한번에 갱신해야 한다. 그런데 문제는 ,, 스프링 배치가 기본적으로 single thread 방식으로 진행된다는 것이다 !
하단은 1011개의 데이터를 single-thread 기반으로 처리할 때 걸린 시간을 측정한 것이다. 총 49초가 소요되었음을 알 수 있다..
그러나 자주 배치 작업이 일어나고, 서비스 중단이 유저의 사용성에 큰 영향을 줄 경우 최대한 spring batch에 드는 시간을 줄여야하며, 이 경우 multi-thread 기반 spring batch 처리를 반드시 해야할 것이다 !