Spring Batch란?
스프링 배치란 대용량의 데이터를 클라이언트와 소통하지 않고 애플리케이션 단독으로 처리하는 작업에 특화된 프레임워크를 이야기합니다. 스프링 프레임워크를 기반으로 개발되었기 때문에 기존의 DI, AOP, 서비스 추상화 등과 같은 Spring 프레임워크의 특징들을 그대로 사용할 수 있습니다. 또한 배치 애플리케이션은 일반 API 웹 애플리케이션과 달리 API를 통해 통신하지 않고 스스로 일하며, 중간에 실패를 하게 되더라도 실패한 부분부터 다시 실행할 수 있다는 장점이 있습니다.
스프링 배치의 특징은 아래와 같습니다.
- 대용량 데이터: 배치 애플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등에 최적화되어 고성능을 발휘합니다.
- 자동화: 심각한 문제 해결을 제외하고는 사용자의 개입없이 실행됩니다.
- 견고성: 잘못된 데이터 충돌/중단 없이 처리할 수 있어야 합니다.
- 신뢰성: 효과적인 로깅, 통계 처리, 트랜잭션 관리 등으로 재사용 가능한 필수 기능을 제공합니다.
- 성능: 지정시간 안에 처리를 완료하거나 다른 애플리케이션을 방해하지 않도록 수행되어야 합니다.
Spring Bath vs Quartz
때때로 Quartz와 같은 스케줄러와 배치를 헷갈려하는 사람들이 있는데, 사실 이 둘은 전혀 다른 특성을 가진 프레임워크입니다. spring.io 공식 레퍼런스는 이에 관해 아래와 같이 설명하고 있습니다.
Spring Batch is not a scheduling framework. There are many good enterprise schedulers (such as Quartz, Tivoli, Control-M, etc.) available in both the commercial and open source spaces. It is intended to work in conjunction with a scheduler, not replace a scheduler.
번역하자면, 스프링 배치는 스케줄링 프레임워크가 아니며, 스케줄링 프레임워크와 함께 사용하도록 설계되었다고 합니다. 즉, 스프링 배치는 비즈니스 로직 자체에 집중하고 스케줄러에 관해서는 Quartz와 같은 서드파티 프레임워크를 사용하게 됩니다.
Spring Batch vs DB Procedure
스프링 배치는 기본적으로 읽기 -> 처리 -> 쓰기의 단계를 거칩니다. 그런데 만약 데이터베이스에 대해 공부한 사람이 있다면 이러한 프로세스가 익숙하게 들릴지도 몰겠습니다.
바로 DB Procedure입니다. 프로시저란 특정한 로직을 처리하기만 하고 결괏값을 반환하지 않는 서브 프로그램을 이야기합니다. 테이블에서 데이터를 추출해 조작하고, 그 결과를 다른 테이블에 저장하거나 갱신하는 일련의 처리를 할 때 주로 사용합니다.
당연히 Java로 만든 배치가 DB 프로시저의 성능을 뛰어넘기는 힘듭니다. Java로 만든 배치는 DB 서버 밖에서 호출되는 네트워크 호출 비용이나 같은 서버 안에서도 JDBC 드라이버의 콜 스택을 거쳐야 하기 때문에 성능에 불리합니다.
하지만 스프링 배치가 가지는 장점도 많은데,
- 배포를 웹 애플리케이션과 같은 방식으로 할 수 있기 때문에 버전 관리에 유리합니다.
- 유닛 테스트가 가능합니다.
- DB 서버를 구성하는 자원은 대용량 시대에 아껴야 할 자원입니다. 그러므로 반드시 DB서버의 자원을 사용해야 하는 것이 아니라면 상대적으로 여러대로 구성을 늘리기 쉬운 웹 애플리케이션을 분산 처리하여 DB서버의 자원을 아낄 수 있습니다.
- 배치 모듈을 세분화하는 것이 가능하기 대문에 추후에 기능을 추가하거나 에러에 대응하기 쉬운 구조로 개발할 수 있습니다.
DB Procedure도 잘 개발한다면 유지보수성에 문제가 없을 수 있지만, 후에 담당자 외에 솔댈 수 없는 DB 프로시저 코드가 종종 발생하게 되어, 최근에는 웹 애플리케이션에서도 DB 프로시저는 잘 안 쓰는 추세입니다.
정말 스프링 배치로는 목표 성능을 낼 수 없는 구간은 DB 프로 시절 남겨두고 나머지 구간은 Java로 구성하는 전략도 채택할만합니다.
아래는 그룹스에 올라온 토론 내용입니다.
https://groups.google.com/forum/#!topic/ksug/9FMlJaE-zKU
'Server > Spring (Boot & Framework)' 카테고리의 다른 글
[Spring] Reactive programing: WebFlux, WebClient (1) | 2021.09.26 |
---|---|
[Spring] 비동기 처리시 blocking 되는 servlet thread 관리 (1) | 2021.09.25 |
[Spring] Reactive Spring WebFlux: Tomcat과 Netty (0) | 2020.06.22 |
[Spring] Bean Scope와 Bean Life Cycle (0) | 2020.05.26 |
[Spring] iBatis/MyBatis: 쿼리 return결과 (0) | 2020.04.08 |