[Spring Batch] 배치 애플리케이션 경험하기 본문

백앤드 개발일지/스프링부트

[Spring Batch] 배치 애플리케이션 경험하기

giron 2021. 8. 31. 14:35
728x90

요즘 공부하다 배치 애플리케이션을 자주 보게 되어서 공부를 해보았다. 공부하다 보니 자료도 적어 찾기 어려웠고 대용량 데이터를 다루는 데에 사용한다고 하니 나 같은 대학생 나부랭이에겐 어렵게 다가왔다.

하지만 언젠가는 사용할게 분명하기 때문에 미리 맛보는 겸 공부하고 기록해 보려고 한다!

 

우선 배치 어플리케이션이 왜 필요하는지 그 이유부터 알아보겠다. 왜 사용하는 가?why why.. wh..

 

[배치 애플리케이션]

  • 배치(Batch)는 일괄처리라는 뜻을 가지고 있다.
  • 만약 매일 전 날의 데이터를 집계해야 한다고 가정해보겠습니다.
    1. 집계 기능은 하루에 1번 수행됩니다. 이를 위해 API를 구성하는 것은 너무 낭비일 것이다.
    2. 데이터가 많아서 처리 중 5만 번째에서 실패했다면, 5만 1번째부터 다시 실행할 수 있다면 얼마나 좋을까
    3. 같은 파라미터로 같은 함수를 실행할 경우 이미 실행한 적이 있어 실패하는 기능을 지원한다면 얼마나 좋을까
  • 이러한 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 배치 애플리케이션이라고 한다,
  • 이러한 비즈니스 로직 외적으로 부가적으로 신경 써야 할 프로그램을 스프링에서 Spring Batch로 지원해준다.

[배치 애플리케이션의 조건]

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

[Spring Batch]

  • Spring Batch는 DI, AOP, 서비스 추상화 등 Spring 프레임워크의 3대 요소를 모두 사용할 수 있다.
  • Spring Batch 4.0 (Spring Boot 2.0)에서 지원하는 Reader & Writer는 아래와 같습니다.
  • Reader: 데이터를 읽어오는 모듈, Writer: 데이터를 쓰는 모듈

스프링 배치에서는 작업을 수행하면서 일련의 상태에 관한 메타 데이터들을 메타 테이블에 저장해서 실패한 작업에 대한 기록을 남겨 실패에 대한 대비를 준비할 수 있게 도와주는 역할을 하게 됩니다.

 

[Job, Step, Tasklet]

  • Job: 배치 처리 과정을 하나의 단위로 만들어 표현한 객체이고 여러 Step 인스턴스를 포함하는 컨테이너
  • Step: Step은 실직적인 배치 처리를 정의하고 제어 하는데 필요한 모든 정보가 있는 도메인 객체
  • Tasklet: Step안에서 수행될 비즈니스 로직 전략의 인터페이스
    • 일반적으로 스프링 배치는 대용량 데이터를 다루는 경우가 많기 때문에 Tasklet보다 상대적으로 트랜잭션의 단위를 짧게 하여 처리할 수 있는 Reader, Proccessor, Writer를 이용한 Chunk 지향 프로세싱을 이용합니다.

 

[배치 사용 사례]

많은 거래가 이루어지는 커머스 사이트의 경우 하루 거래건이 50만 ~ 100만까지 나온다고 합니다...(🤑)

이렇게 많으니 실시간 집계 쿼리를 날린다면 생각만 해도... 머리 아프네요,,

그래서 매일 새벽에 매출 집계 데이터를 만들어서 외부 요청이 올 경우 미리 만들어준 집계 데이터를 바로 전달하여

성능과 부하를 모두 잡는다고 합니다.

 

[ERP]

  • ERP는 자원 관리 시스템이라고 생각하시면 됩니다.
  • 사내 구성원을 비롯해서 매출, 지출 등을 모두 관리하는 소프트웨어 시스템을 얘기합니다.
  • ERP 솔루션으로 유명한 것은 SAP가 있습니다.

이렇게 재무팀의 요구사항으로 매일 매출 현황을 ERP로 전달해야 할 때, SPring Batch가 많이 사용된다고 합니다.

예를 들어, 매일 오전 8시에 ERP에 전달해야 할 매출 데이터를 전송해야 한다면, 아래와 같은 구조로 쉽게 구현할 수 있다고 합니다.

 

이 글에서 Batch 연습 코드들을 작성할까 하다가 길어질 것 같아서 개념만 여기서 설명하고 이어서 예제를 작성해보겠습니다!🤓🤓

****************************************************************

*추가

[Batch vs Quartz?]

  • Quartz는 스케줄러의 역할, Batch와 같이 대용량 데이터 배치 처리에 대한 기능을 지원하지 않습니다.
  • 반대로 Batch 역시 Quartz의 다양한 스케줄 기능을 지원하지 않아서 보통은 Quartz + Batch를 조합해서 사용한다고 합니다.
  • 정해진 스케줄마다 Quartz가 Spring Batch를 실행하는 구조라고 보면 이해하기 쉬운 것 같습니다!

 

Reference

 

Spring Batch에서 영속성 컨텍스트 문제 (processor에서 lazyException 발생할때)

안녕하세요? 이번 시간엔 springboot-batch에서 reader로 읽은 데이터를 processor로 넘길때 영속성 컨텍스트가 문제가 되는 상황을 해결해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면

jojoldu.tistory.com

728x90
Comments