Spring Batch란

최준호·2022년 1월 12일
0

Spring Batch

목록 보기
1/10

🧪 Spring Batch를 공부하게된 이유

회사 내에서 프로젝트 중 여러 쇼핑몰의 구매확정 처리를 일괄처리해야하는 작업이 기존에는 스케줄러로 작성되어 있었다. 하지만 이런 구조를 갖게 되었을 때 서버 하나에 너무 큰 부하가 될까 우려되어 일괄 처리하는 작업은 외부로 빼서 작업을 진행할 수 없을까 고민하던 중 Spring Batch와 스케줄러 프로그램을 같이 사용하는 경우가 많이 있다고 하여서 Spring Batch에 대해 먼저 알아보려고 한다.

👉 Spring Batch란

Spring Batch란 Accenture이라는 컨설팅 회사가 정부 프로젝트를 하며 얻은 비즈니스 로직과 노하우에 스프링을 만든 Pivotal의 기술의 협력으로 만들어낸 프레임워크이다. 배치(=일괄 작업) 작업을 위해 만들어진 가볍고, 빠르고, 실행 도중 문제가 생기면 그 지점부터 재시작(Restartabilliy)이 가능한 프레임워크이다.

배치 어플리케이션이 필요한 상황

  1. 일정 주기로 실행이 필요할 때
  2. 실시간 처리가 어려운 대량의 데이터를 처리해야할 때

배치 어플리케이션의 조건

  • 대용량 데이터 : 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야한다.
  • 자동화 : 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 한다.
  • 견고성 : 잘못된 데이터를 충돌/차단 없이 처리할 수 있어야 한다.
  • 신뢰성 : 무엇이 잘못되었는지를 추적할 수 있어야한다.(로깅, 알람)
  • 성능 : 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야 한다.

Spring Batch를 스케쥴러와 혼동하는 경우가 존재하는데

Spring Batch는 사람들이 기대하는 Spring Framework의 특성(생산성, POJO 기반 개발 접근 방식 및 일반적인 사용 용이성)을 기반으로 하는 동시에 개발자가 필요할 때 보다 고급 엔터프라이즈 서비스에 쉽게 액세스하고 활용할 수 있도록 합니다. Spring Batch는 스케줄링 프레임워크가 아닙니다. 상용 및 오픈 소스 공간 모두에서 사용할 수 있는 좋은 엔터프라이즈 스케줄러(예: Quartz, Tivoli, Control-M 등)가 많이 있습니다. 스케줄러를 대체하는 것이 아니라 스케줄러와 함께 작동하기 위한 것입니다.

공식문서에서 다음과 같이 소개하고 있다.

👉 Spring Batch를 선택한 이유

다른 배치 프레임워크도 있지만 Spring Batch를 선택한 이유는
1. Spring을 기존에 학습한 사람은 learning curve가 적다.
2. Restartablily
3. 스프링 계열로써 믿을 수 있는 안정성

👉 Spring Batch의 구조


이미지출처 : https://docs.spring.io/spring-batch/docs/current/reference/html/domain.html

Job 배치 작업이다. 혹은 Flow라고도 부른다. 최소 하나의 Step을 가져야하며 복잡하게 짜서는 안된다. 최대 10개의 Step까지 권장하는데 10개도 너무 많은 것이므로 Step이 10개가 넘어간다면 여러개의 Job으로 쪼개서 작성하자. 하나의 Job의 너무 많은 책임(Responsibilities)을 갖게하지 말자!

Step Step은 읽기->가공하기->쓰기의 묶음이다. 이 묶음을 Chunk processing이라고 부르는데 하나의 Transaction이라고 하면 이해하기 쉽다. 이 Chunk processing이 위에 언급한 재시작의 핵심이다.

ItemReader ItemReader는 말 그대로 데이터 읽기를 담당한다. 정확히는 인터페이스이며 Treead() method를 가지고 있다.

Tread() 메서드는 읽어드린 데이터를 반환한다. 만약 null을 리턴할 경우 읽어야하는 총 데이터의 마지막임을 나타낸다. DB로 치면 하나의 row를, 파일로 치면 line을 JsonArray면 element를 반환한다고 생각하면 된다.

ItemProcessor ItemProcessor는 ItemReader에게 Object를 넘겨 받아 원하는 방식으로 가공 후에 ItemWriter에게 넘겨주는 역할을 하며 한번에 하나의 Item을 처리한다.

ItemReader와 마찬가지로 인터페이스이며 Input과 Output을 지정해주어야 한다. Input은 ItemReader에게서 넘겨 받는 타입이고 Output은 ItemWriter에게 넘겨줄 타입이다.

ItemProcessor가 꼭 필요한건 아니다. 데이터를 가공할 필요가 없는 경우에는 ItemReader -> ItemWirter로 바로 념겨도 된다.

ItemWriter ItemReader 혹은 ItemProcessor가 ItemWriter로 데이터를 넘겨주면 리스트에 차곡차곡 쌓아놓는다. 이때 commit-interval 프로퍼티의 정의된 개수만큼 데이터가 모이면 write 메서드를 실해앟게 된다. commit-interval은 Step의 Chunk에서 설정할 수 있다

참고글
Spring Batch란
Spring Batch 공식문서
10분 테코톡 Spring batch
jojoldu batch 가이드

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글