개발자가 되고 싶은 개발자

[Spring] Spring Batch 본문

Dev/Java & Spring

[Spring] Spring Batch

Fullth 2021. 11. 6. 17:04

 

최근 몇 개월간 배치 프로그램 개발을 맡아서 진행하였는데, 반복적인 업무를 자동화 할 수 있다는 점에서 굉장히 흥미로웠습니다.

 

아직은 경험해 본 범위 내에서만 활용할 줄 알기때문에,

다른 사람들과 기업에서는 어떻게 활용하고 있는지, 추가적인 기능은 없는지 찾아보며 Spring Batch에 관하여 정리해보려 합니다.

Spring Batch란

A lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems.

엔터프라이즈 시스템의 운영에 필수적인 강력한 배치 애플리케이션을 개발할 수 있도록 설계된 가볍고 포괄적인 배치 프레임워크 입니다.
Spring Batch provides reusable functions that are essential in processing large volumes of records, including logging/tracing, transaction management, job processing statistics, job restart, skip, and resource management.

Spring Batch는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공합니다.

우리가 웹 어플리케이션을 개발할 때, Spring MVC를 사용하여 비즈니스 로직에 집중할 수 있습니다.

배치 개발에 집중할 수 있도록 Spring에서 지원해주는 모듈이 바로 Spring Batch입니다.

배치 어플리케이션의 조건

배치 어플리케이션은 다음과 같은 조건을 만족해야 한다고 합니다.

- 대용량데이터, 자동화, 견고성, 신뢰성, (로깅,알림) 성능

대용량 데이터 - 배치 어플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 ​​있어야 합니다.

자동화 - 배치 어플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.

견고성 - 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.

신뢰성 - 배치 어플리케이션은 무엇이 잘못되었는지를 추적할 수 있어야 합니다.

(로깅, 알림)성능 - 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다.

Batch VS Quartz

Quartz는 작업 스케줄링 라이브러리입니다.

왜인지 모르겠지만 둘을 많이 비교하는 글들이 많다고 하는데 둘의 역할은 완전히 다릅니다.

- 정해진 스케줄마다 Quartz가 Spring Batch를 실행하는 구조

Batch 사례

최근 작업한 사례

- API통신을 통해 받아온 데이터처리

- 타 서버에 전송시킬 데이터 전송

- csv로 생성되는 대용량 데이터 DB에 자동 업로드

그 외 타 사례

- 매출에 대한 집계

- ERP 연동 등

스프링 배치 Job 구성

배치를 위한 구성은 xml 혹은 Java로 작성할 수 있습니다.

<job id="footballJob">
    <step id="playerload"          parent="s1" next="gameLoad"/>
    <step id="gameLoad"            parent="s2" next="playerSummarization"/>
    <step id="playerSummarization" parent="s3"/>
</job>

스프링 공식문서에서 제공하는 예시입니다.

footballJobs1을 부모로 삼는 스텝 playerload을 실행합니다. 실행 후에는 다음으로 gameLoad를 실행합니다.

해당 스텝들 안에 수행될 커스텀한 기능을 선언하기 위해서 tasklet이라는 개념을 사용합니다.

스프링 배치 Step구성 

<job id="sampleJob" job-repository="jobRepository">
    <step id="step1">
        <tasklet transaction-manager="transactionManager">
            <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
        </tasklet>
    </step>
</job>

chunk에 대한 개념은 우선 넘어가도록 하고, step1에서 수행할 기능을 커스텀하게 지정할 수 있다는 것만 알아두겠습니다.

예를 들어 특정 클래스의 기능을 수행하도록 지정할 수도 있습니다.

Spring Batch 메타 테이블

Sprig Batch에선 메타 데이터 테이블들이 필요하다고 합니다. 옵션을 꺼서 비활성화 시킬 순 있지만,

기본 옵션으로는 필요로 하는 테이블들이 데이터베이스 상에 존재하여야 정상적으로 동작합니다.

 

해당 테이블들에는 배치 동작에 대한 상태여부, 실패한 배치의 파라미터 정보 등이 담겨있습니다.

 

필요로 하는 테이블들의 스키마는 다음과 같습니다.

스프링 배치 메타 테이블

출처: https://docs.spring.io/spring-batch/docs/3.0.x/reference/html/metaDataSchema.html

Chunk 지향처리

제가 사용할 땐 알지 못했던, Chunk는 Spring Batch의 큰 장점 중 하나라고 합니다.

스프링 배치 스탭 구성에서 넘어갔던 chunk에 대해서 알아보도록 하겠습니다.

"Chunk란 데이터 덩어리로 작업 할 때 각 커밋 사이에 처리되는 row 수를 얘기합니다."

즉, Chunk 지향 처리란 한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리를 만든 뒤,
Chunk 단위로 트랜잭션을 다루는 것을 의미합니다.

Chunk단위로 트랜잭션을 수행하기에, 실패한 경우 해당 Chunk만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 됩니다.

급 마무리

이동욱 개발자님의 글에서와 같이, 5만번째에서 실패했다면, 5만 1번째부터 다시 실행 한다거나, 같은 파라미터로 같은 함수를 실행할 경우 이미 실행한 적이 있어 실패하는 기능을 지원하려면 Chunk에 대한 이해가 필요할 것 같습니다.

 

새로운 것은 소스로 작성하는 것이 이해가 빠르기 때문에,

Chunk에 대해(Chunk, ItemReader, ItemWriter) 공부하고 예제 소스와 같이 포스팅하도록 하겠습니다.

참고

스프링 공식 문서와 개발자 이동욱 님의 블로그를 참고하였습니다.

 

Spring Batch

Spring Batch provides reusable functions that are essential in processing large volumes of records, including logging/tracing, transaction management, job processing statistics, job restart, skip, and resource management. It also provides more advanced tec

spring.io

 

기억보단 기록을

Java, TypeScript, ORM, RDBMS, AWS 를 주로 다루고 공유합니다.

jojoldu.tistory.com

 

'Dev > Java & Spring' 카테고리의 다른 글

[Java] Comparator  (0) 2021.12.24
[Spring] @RequestBody로 받아온 데이터가 null일 때  (0) 2021.11.18
[Java] Stream  (0) 2021.10.05
[Log4j2] Log4j2- PatternLayout  (0) 2021.10.05
[Tomcat] 톰캣 서버 실행 시 리스너 오류  (0) 2021.02.04