개발놀이터

스프링 배치의 특징 ( + 다른 언어의 배치) 본문

Spring/Spring Batch

스프링 배치의 특징 ( + 다른 언어의 배치)

마늘냄새폴폴 2022. 9. 15. 00:51

생각해보니 스프링 배치를 깊게 공부한다는 사람이 스프링 배치이 뭔지에 대한 포스팅이 없다는게 이상해서 스프링 배치의 특징 (장점) 에 대해서 포스팅 해보겠습니다. 

 

추가적으로 다른 언어에서 배치 프로세스를 어떻게 처리하는지에 대해서도 살짝 알아보도록 하겠습니다. 

 

 

배치 (Batch) 란?

우선 배치가 뭔지부터 알아야겠죠. 배치란 일괄 처리를 의미합니다. 저도 처음엔 한글인줄 알았는데요. 어디에 뭐를 배치하다. 뭐 대충 이런 의미로 생각하고 있었죠. 하지만 배치는 영어입니다. Batch란 '일괄' 이라는 뜻입니다. 즉 데이터를 일괄처리 할 때 사용하는 것이라고 생각하면 좋습니다.

 

일반적인 서비스 로직은 사용자의 request에 따라서 동작을 수행하는 것이 일반적인데, 배치는 사용자의 request를 받지 않고, 특정 주기를 바탕으로 실행되는 것이 일반적입니다. 

 

예를 들면 매일 새벽 2시에 호출된 API의 횟수를 카운트해야 한다거나, 매출량을 정산해야 한다거나 하는 작업들이 있습니다. 

 

이러한 개별 작업 단위를 배치 Job 이라고 합니다. 

 

 

Spring Batch

제가 공부하는 것은 그중에서도 스프링 배치입니다. 스프링 배치는 배치 잡을 손쉽게 코딩하고 처리할 수 있도록 도와주는 프레임워크입니다. 엥? 스프링도 프레임워크 아닌가요? 맞습니다. 스프링 배치는 스프링안에 포함되어있는 서브 프레임워크입니다. 

 

스프링의 서브 프레임워크라는 의미는 스프링에서 대표적인 기술인 DI나 AOP등이 사용가능하다는 의미이죠. 

 

스프링 배치에 대해서 자세히 알고싶으시다면 아래의 링크를 참고해주시면 감사하겠습니다. 

 

https://coding-review.tistory.com/category/Spring/Spring%20Batch

 

'Spring/Spring Batch' 카테고리의 글 목록

 

coding-review.tistory.com

 

그럼 이제 스프링 배치의 특징 (장점) 에 대해서 한번 알아보도록 하죠

 

 

스프링 배치의 특징 (장점)

 

1. 스프링의 기술 및 철학을 활용한다.

말 그대로 스프링의 기술과 철학을 사용하기 대문에 스프링을 학습했다면 러닝커브가 상당히 낮아지고 활용하기가 쉽다는 장점이 있습니다. 

 

물론 스프링 배치도 프레임워크이기 때문에 사용방법을 알아야하고 복잡한 Job을 만들어야 하는 상황이라면 깊이있는 공부가 필요한 것 또한 사실입니다. 

 

하지만 스프링을 이전에 공부했던 사람이라면 스프링 배치를 처음 보는 사람에 비해서 공부하기가 조금 수월하다는 얘기입니다. 

 

2. 다양한 Interface 및 구현체를 제공한다.

스프링이 추구하는 철학 중 하나인 확장성 덕분에 설령 스프링 배치에서 제공하지 않는 구현체가 있더라도 직접 만들어서 사용할 수 있습니다.

 

저도 얼마전 우아한 형제들 기술블로그에서 향로(jojoldu)님이 작성하신 'Querydsl과 Spring batch' 라는 글을 감명깊게 보고 실제 프로젝트에 적용하기 위해 QuerydslPagingItemReader를 직접 만들어서 사용해봤습니다. 

 

이렇게 직접 구현체를 만드는 경우는 그리 흔한 경우는 아닙니다. 스프링은 호환성을 굉장히 중요하게 생각하기 때문에 다양한 구현체를 이미 만들어두고 있습니다. ItemReader를 예로 들자면 MyBatis를 사용할 때 사용하라고 만들어 둔 구현체인 MyBatisItemReader가 있구요, JDBC를 사용할 때 사용하라고 만들어 둔 구현체인 JdbcCursorItemReader, JdbcPagingItemReader도 있습니다. 물론 JPA에 관련된 ItemReader들도 있습니다. 

 

3. 배치 사이즈를 지정할 수 있어서 대용량 처리에 용이하다.

배치 사이즈 즉, chunk를 지정할 수 있어서 대용량 데이터를 안전하게 커밋할 수 있게 도와줍니다. 스프링 배치에서는 chunk 지향처리를 바탕으로 chunk 단위로 트랜잭션의 원자성을 보장해주고 중간에 에러가 발생했을 때 chunk 단위만큼만 롤백하여 이미 커밋이 완료된 데이터를 안전하게 보호할 수 있습니다. 

 

하지만 chunk를 사용할만큼 대용량이 아니라면 굳이 스프링 배치를 사용할 필요가 없다는 의미이기도 합니다. 

 

4. 다양한 설정을 통해 유연한 처리가 가능하다.

여기서 말하는 다양한 설정이란 많이 있지만 몇개만 뽑아보자면 특정한 에러가 발생했을 때 재시도를 하라고 지정할 수도 있고, 또는 특정한 에러가 발생했을 때 건너뛰라고 지정할 수도 있습니다. 

 

이러한 처리는 원래라면 try-catch문을 이용해 재시도를 하거나 스킵을 해야하지만 스프링 배치에서는 어떻게 재시도 할지에 대해서만 정의해주면 손쉽게 재시도 혹은 스킵이 가능합니다. 

 

또한 배치 잡 중 특정 Step이 실행되지 않는다면 allowStartIfComplete 속성을 true로 주어 무조건 다시 실행되게 할 수도 있습니다. 

 

5. 손쉬운 이벤트 처리가 가능하다.

스프링은 객체지향을 극한으로 끌어올린 프레임워크이기 때문에 배치 잡을 운용함에 있어서 객체지향스럽게 잘 짜여져 있습니다. 

 

데이터를 읽어오는 ItemReader, 데이터를 가공하는 ItemProcessor, 데이터를 데이터베이스에 넣는 ItemWriter, 그리고 이 셋을 묶은 Step, 여러 Step을 묶은 Job 이런식으로 체계적으로 짜여져있기 때문에 어디서 어떤 일을 하고있는지 개발하는 개발자가 콕 찝어서 관리할 수 있습니다. 

 

또한, 이렇게 체계적으로 쪼개어져있기 때문에 어디서 에러가 났는지 쉽게 파악할 수 있다는 장점도 있습니다. 

 

6. 실행 이력에 대한 저장이 가능하다.

스프링 배치는 메타테이블을 이용해 하나의 배치 잡에 대한 실행 이력을 JobRepository를 이용해 저장할 수 있습니다. 

 

또한, JobInstance, JobExecution이라는 존재로 인하여 하나의 잡이 재시도 될 때 JobInstance를 다시 만드는게 아니고 재사용할 수 있습니다. 

 

물론 멱등성을 유지하고 싶은 경우 JobParameter를 조정해서 잡이 실행될 때마다 새로운 JobInstance를 만드는 경우도 많습니다. 하지만 특정 에러가 난다거나 해서 잡이 재시작하는 경우에 기존의 JobInstance를 사용하기 때문에 자원 낭비가 많지 않습니다. 

 

 

 

여기까지 스프링 배치의 특징 (장점) 에대해서 알아봤습니다. 하지만 문득 궁금하더라구요. 다른 언어에서는 이 배치를 어떤 방식으로 풀어내고 있을까 굉장히 궁금했습니다. 

 

그래서 구글링으로 다른 언어에서는 어떤 방식으로 배치를 처리하고있고 어떤 방식을 채택했는지에 대해서 간단하게 알아보도록 하겠습니다. 

 

제가 알아본 백엔드에 쓰이는 프레임워크는 파이썬의 Django, C#의 닷넷 프레임워크, 자바스크립트의 Node.js, Ruby의 Ruby on Rails입니다. 

 

하나씩 알아보죠

 

Django

우선 장고입니다. 파이썬의 장고는 스프링과 마찬가지로 백엔드 웹서비스를 만들 때 사용하는 프레임워크로 유명합니다. 

 

장고의 배치는 Crontab이라는 라이브러리를 사용합니다. Crontab은 2016년에 릴리즈된 따끈따끈한 라이브러리입니다. 

 

하지만 알아본 바로는 위의 스프링 배치에서 찾아볼 수 있는 특징을 찾을 수 없었고 마지막 커밋이 4년전이기 때문에 꽤나 낙후된 라이브러리입니다. 

 

.NET framework

다음으로는 C#의 닷넷 프레임워크입니다. 신기하게 구글링에서 닷넷 프레임워크 배치를 검색하면 아무런 결과도 찾을 수 없습니다. 배치와 관련된 내용은 배치 파일을 만들어서 밀어넣는 방법에 대해서 포스팅된 것을 발견했습니다. 

 

Node.js

자바스크립트의 Node.js입니다. Node.js는 아시는 분들은 아시겠지만 따지고보면 프레임워크는 아닙니다. Express나 Next.js가 자바스크립트의 프레임워크이지 Node.js는 구글의 자바스크립트 엔진중 하나인 V8엔진을 떼다 만든 툴(?)입니다. 

 

하지만 Node.js로 백엔드를 만든다는 점 때문에 이번 구글링 대상에 넣었습니다. 

 

Node.js에서는 배치 프로세스를 처리하기 위해 세가지 라이브러리가 존재합니다. 

  1. Agenda
  2. node-cron
  3. node-schedule

이중에서 가장 많이 쓰이는 라이브러리는 node-schedule입니다. 함수형 프로그래밍의 대표주자인 자바스크립트답게 크론 표현식과 함수형프로그래밍이 합쳐진 형태이며 따로 설정이 있는 것 같지는 않은 라이브러리입니다. 

 

Ruby on Rails

마지막으로 Ruby의 Ruby on Rails입니다. Ruby on Rails에는 ActiveRecord::Batches라는 배치를 지원하기 위한 ORM 모듈이 있고 그 편리함 덕분에 지금도 널리 사용중입니다. 

 

스프링 배치와 마찬가지로 배치 사이즈를 지정해 대용량 데이터를 안전하게 처리할 수 있는 기능을 제공합니다. 

 

하지만 스프링 배치에서의 특정 에러가 났을 경우 재시작 혹은 스킵 같은 세부적인 설정은 할 수 없는 듯 했습니다. 

 

 

 

마치며

어떤가요 스프링 배치와 좀 더 친해진 느낌이 드시나요? 

 

다른 언어에서 배치에 대해서 어떻게 해결하는지에 대해서는 제가 해당 언어를 깊이있게 공부해보지 않았기 때문에 틀린 정보가 있을 수도 있습니다. 

 

제가 적은 정보는 구글링을 통해 접할 수 있는 표면적인 정보에 불과하며 깊이있게 공부할 경우 다른 결과가 충분히 나올 수 있음을 알립니다. 

 

 

이렇게 스프링 배치에 대해서 쫙 정리하면서 느낀점은 왜 서비스가 커지면 자바로 전환하는지에 대해서 피부로 와닿게 되었습니다. 

 

처음에 개발할 당시에는 빠르게 변화하는 개발환경과 피드백으로 빠르게빠르게 개발을 진행해야 하는 스타트업 특성상 안전하지만 개발 기간이 오래 걸리는 자바를 선택하기엔 조금 무리가 있을 수도 있습니다. 

 

하지만 서비스가 커지면서 다뤄야 하는 데이터가 많아지면 스프링 배치의 강력한 기능을 사용하기 위해 자바로 전환하는 상황이 올 것 같습니다. 

 

때문에 현재 한국에 존재하는 IT 기업들중 대부분이 자바 스프링을 사용하고 있는 이유이지 않을까 하는 개인적인 추측을 해봅니다. 

 

여기까지 긴 글 읽어주셔서 감사합니다. 다음엔 더 질 좋은 포스팅으로 찾아뵙도록 하겠습니다. 

 

Reference

https://blog.naver.com/PostView.naver?blogId=pjok1122&logNo=222172642938&parentCategoryNo=&categoryNo=52&viewDate=&isShowPopularPosts=false&from=postView 

 

[Spring Batch] Spring Batch의 특징

1. Batch란? Batch란, 일괄 처리를 의미합니다. 일반적인 서비스 로직은 사용자의 request에 따라서 동작...

blog.naver.com

 

'Spring > Spring Batch' 카테고리의 다른 글

스프링 배치 메타 데이터  (0) 2022.09.18
스프링 배치 개요  (0) 2022.09.18
스프링 배치와 Querydsl  (0) 2022.09.11
스프링 배치 CursorItemReader vs PagingItemReader  (0) 2022.09.05
스프링 배치 JobParameter  (0) 2022.09.02