개발자 친구랑 서로 어떤 업무를 하는지 대화를 나누다 보면 심심치 않게 들려오는 Spring batch.
batch라는 단어를 생각해보면 병렬처리를 하거나 일괄처리를 할 것 같다는 느낌은 오는데 정확히 무엇인지 모르겠습니다. Spring batch를 언젠가는 쓸 날이 오겠지만, 당장은 쓸 일이 없다면 학습을 나중으로 미뤄두고 바로 적용이 가능하다면 조금 더 찾아보기로 결정했습니다.
그래서 오늘은 쓸 일의 여부를 장점으로 판단할 것이고 그것을 정리한 포스팅을 올립니다.
Spring Batch 장점
글자 그대로 Spring Batch 장점이라고 검색을 하면 정말 놀랍게도 모두가 같은 장점을 적어주셨습니다.
- 대용량 데이터 처리에 최적화되어 고성능
- 로깅, 통계처리, 트랜잭션 관리 등 재사용 가능한 필수 기능 지원
- 수동으로 처리하지 않도록 자동화되어 있음
- 예외 사항과 비정상적인 동작에 대한 방어 기능 존재
- 작업 프로세스 구조만 이해하면 비지니스 로직에만 집중 가능
해외에서는 Batch 프로그램을 Java 언어로 구현할 수 있다는 걸 장점으로 뽑는 사람도 있었습니다.
(Window의 .bat 파일의 배치와 이 배치가 동일한가 봐요)
대체 Spring Batch는 무엇이기에 이런 장점들이 나올까요??
Spring Batch란?
배치라는 단어 자체는 일괄처리란 뜻을 갖고 있습니다.
매월 1일에 이전 달의 데이터를 가지고 월별 보고서를 제공해준다고 가정해볼게요.
데이터를 가져오고 계산이 필요한 경우 그런걸 처리해야 될 텐데 이 일련의 과정을 어떻게 구현할 수 있을까요??
실제로 저는 Spring Batch를 모르고 있었기에 Spring Schedule + Tomcat으로 구현했습니다.
그런데 이렇게 하면 해당 서버는 위의 월별 보고서 작업에만 리소스를 다 사용하느라 사용자의 요청은 처리하지 못할 수 있다고 합니다.
또한 스케쥴링 일정의 변경이 생겼다면 (ex, 매월 1일 새벽 2시 -> 매월 1일 새벽 3시 실행) 이 스케쥴링이 적용되기 위해서는 서비스 재시작이 필수적이죠.
그러나 Spring Batch를 사용하면 이런 불편함들이 없어진다고 합니다.
그렇다면 Spring Batch는 Tomcat 밖에서 돌아간다는 의미인지 궁금해지는데 이는 나중에 더 알아보겠습니다.
Spring Batch에는 IoC, XML 구성, DI와 같은 다른 스프링 라이브러리와 동일한 기능이 많이 있습니다.
구현할 때도 Read/Write를 자주 사용하게 될 텐데 Spring Batch에서는 관련 모듈을 제공해준다고 합니다.
Spring Batch는 특정 시점에서 에러가 났다면 그 이후부터 이어서 작업을 진행할 수 있습니다.
(ex, 1030번 레코드를 읽어오는데 에러 발생 -> 1030번 레코드부터 배치 작업 재시작)
그 외의 특징으로 오류 처리, 청킹 및 분산 처리를 모두 구성할 수 있다고 합니다.
따라서 Spring Batch는 아래와 같은 상황에 적용할 수 있습니다.
1. 데이터베이스, 파일, 대기열 또는 기타 매체에서 많은 수의 레코드를 읽고 처리한 레코드를 매체(예: 데이터베이스)에 저장하는 경우
2. 동시 및 대규모 병렬 처리.
3. 단계별, 엔터프라이즈 메시지 중심 처리 서비스
4. 종속 단계의 순차 처리
5. 일괄 거래
6. 예약 및 반복 처리
도입 여부
이게 진짜 고민이 되지 말입니다... Spring Batch의 장점이 너무나도 많은데, 제가 다루는 데이터는 대용량도 아닌 데다가 사용자도 적어서 그 장점을 제대로 누리지 못할 삘이 느껴지죠. 그런데 어차피 Spring Batch도 스케쥴링 기능은 없어서 Batch + Schedule 조합을 써야 된다고 합니다. 그러면 딱 중요한 알맹이인 Batch만 도입하면 될 것도 같고.. 으으음.. 시간이 나면 조금씩 바꿔 봐야겠습니다.
출처 :
https://jojoldu.tistory.com/324
https://stackoverflow.com/questions/26929308/advantages-of-spring-batch
https://dlgkstjq623.tistory.com/506
'web > spring&spring boot' 카테고리의 다른 글
API 호출을 위한 RestTemplate, WebClient 및 Feign 비교 (0) | 2023.05.11 |
---|---|
[Spring Boot] @Component에 대한 이해 (0) | 2023.04.03 |
[Spring] REST API 구현 (0) | 2021.11.07 |
[spring boot] 스프링 부트 게시판 페이징 기능 구현하기 (0) | 2021.06.08 |
[spring boot] 스프링 부트 게시판 검색 기능 구현하기 (0) | 2021.06.06 |