Spring Batch를 알기전에 배치 어플리케이션에 대해 먼저 알아야겠죠.
먼저 batch란 일괄처리
란 뜻을 갖고 있습니다.
만약 매일 전 날의 데이터를 집계 해야한다고 가정해봅시다.
이 집계 과정을 웹 애플리케이션(Spring + Tomcat)에서 수행하게 된다면,
큰 데이터를 읽고, 가공하고, 저장한다면 서버는 순식간에 CPU, I/O 등의 자원을 다 써버려 다른 요청들을 처리하지 못하게 되겠죠.
그리고 이 집계 기능은 하루에 1번 수행됩니다.
이를 위해 API를 구성하게 된다면 낭비겠죠.
또한 데이터가 많거나, 다른 이유로 처리중에 실패하면 어떻게 될까요 ?
5만번 째에서 실패했다면, 5만 1번째 부터 다시 실행할 수 있다면 얼마나 좋을까요 ?
오늘 아침에 누군가가 집계함수를 실행시켰는데 다른 누군가가 또 실행시켜 집계 데이터가 2배로 뻥튀기 될 수도 있겠죠.
같은 파라미터로 같은 함수를 실행할 경우 이미 실행한 적이 있어 실패하는 기능을 지원하면 얼마나 좋을까요 ?
바로 이런 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 배치 애플리케이션이라고 합니다.
위의 고민들을 다시 생각해보면 배치 어플리케이션을 구성하기 위해선 비즈니스 로직 외에 부가적으로 신경써야 할 부분이 많다는 것을 알 수 있죠.
저희는 Spring을 사용함으로써 웹 애플리케이션을 개발할 때
저희는 비즈니스 로직에 최대한 집중할 수 있었죠.
개발할 때 비즈니스 로직에 집중하기 위해 Spring 진영에서 지원하는 배치 애플리케이션을 지원하는 모듈이 있습니다.
바로 Spring Batch 입니다.
Spring Batch를 소개하기 전에 배치 어플리케이션이라나 어떤 것인지 그 조건을 잠깐 이야기해보겠습니다.
배치 어플리케이션은 다음의 조건을 만족해야만 합니다.
- 대용량 데이터 - 배치 애플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다.
- 자동화 - 배치 애플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
- 견고성 - 배치 애플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
- 신뢰성 - 배치 어플리케이션은 무엇이 잘못 되었는지를 추적할 수 있어야 합니다. (로깅, 알림)
- 성능 - 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 애플리케이션을 방해하지 않도록 수행되어야 합니다.
그럼 이제 이 조건들을 만족하는 Spring Batch를 소개해보겠습니다.
Spring Batch는 Accenture와 Spring Source의 공동 작업으로 2007년에 탄생했습니다.
Accenture는 수년간의 노력으로 그들만의 배치 프레임워크를 만들었고, 그를 통해 얻은 경험을 가지고 있었습니다.
즉, Accenture의 배치 노하우 & 기술력과 Spring 프레임워크가 합쳐져 만들어진 것이 Spring Batch 입니다.
Spring Batch는 Spring의 특성을 그대로 가져왔습니다.
DI, AOP, 서비스 추상화 등 Spring 프레임워크의 3대 요소를 모두 사용할 수 있으면서, Accenture의 Batch 노하우가 담긴 아키텍쳐를 사용할 수 있습니다.
간혹 Spring Batch와 Spring Quartz를 비교하는 글이 있는데요,
둘의 역할을 완전히 다릅니다.
Quartz는 스케쥴러의 역할이지, Batch와 같이 대용량 데이터 배치 처리에 대한 기능을 지원하지 않습니다.
반대로 Batch 역시 Quartz의 다양한 스케쥴 기능을 지원하지 않아서 보통은 Batch + Quartz를 조합해서 사용합니다.
정해진 스케줄마다 Quartz가 Spring Batch를 실행하는 구조라고 보시면 됩니다.
보통 많은 거래가 이루어지는 커머스 사이트의 경우 하루 거래건이 50만 ~ 100만 정도 나온다고 합니다.
이럴 경우에 이와 관련된 데이터는 최소 100만 ~ 200만 row 이상입니다.
한달이면 5000만 ~ 1억 까지 될 수 있겠죠.
이를 실시간 집계쿼리로 해결하기엔 조회 시간이나 서버 부하가 심합니다.
그래서 매일 새벽에 전날의 매출 집계 데이터를 만들어서 외부 요청이 올 경우 미리 만들어준 집계 데이터를 바로 전달하면 성능과 부하를 모두 잡을 수 있습니다.
또한 대부분의 서비스들은 ERP를 사용하고 있습니다.
ERP는 자원 관리 시스템이라고 생각하시면 됩니다.
사내 구성원을 비롯해서 매출, 지출 등을 모두 관리하는 소프트웨어 시스템을 얘기합니다.
ERP 솔루션으로 유명한 것은 SAP이 있습니다.
재무팀의 요구사항으로 매일 매출 현황을 ERP로 전달해야하는 상황에서 Spring Batch가 많이 사용됩니다.
매일 아침 8시에 ERP에 전달해야 할 매출 데이터를 전송해야 한다면 아래와 같은 구조로 쉽게 구현할 수 있습니다.
위 사례 외에도 정해진 시간마다 데이터 가공이 필요한 경우에 어디서든 Spring Batch가 사용될 수 있습니다.