Spring Batch | 스프링 배치 소개 및 시작

DoItDev·2022년 3월 12일
0
post-thumbnail

Overview

배치 어플리케이션의 경우 Spring에서 지원하는 배치 프레임 워크이다. 또한 배치 어플리케이션의 경우 스케줄링 프레임 워크가 아니다. 스케줄러의 경우 좋은 엔터 프라이즈가 있따. 배치 어플리케이션의 경우 스캐줄러를 대체하는 것이 아닌 함께 사용하기 위함이다.

다음과 같은 경우 배치 어플리케이션의 동작 시나리오 입니다.

  • 데이터베이스 또는 파일 혹은 대기열에서 많은 수의 레코드를 읽을 때
  • 어떤 방식으로든 데이터를 처리를 할 때
  • 수정된 형식으로 데이터를 다시 쓴다

사용자의 상호작용 없이 사용을 하고 오프라인 환경에서 유사한 트랜잭션 세트로 처리를 하는 기능을 제공을 한다.

Batch아키텍처

배치의 경우 계층화된아키텍처 를 구성을 한다. 크게 3가지 요소로 나뉜다. 어플리케이션, 코어 그리고 인프라이다.

  • 어플리케이션
    • Spring Batch를 사용하여 개발자가 작성한 모든 배치작업과 사용자 정의코드가 포함
  • 코어
    • 배치 작업을 시작하고 제어하는데 필요한 핵심 런타임 클래스가 포함
    • JobLancerJob 그리고 Step 에 대한 구현이 Batch Core 에 포함되어 있습니다.
    • 어플리케이션과 코어는 모두 공통 인프라 위에 구축 된다.
  • 인프라
    • ItemReaderItemWriter 그리고 Retry가 모두 사용하는 RetryTemplate에 포함된다.

배치 처리의 원칙

일반 배치 원칙의 경우 다음과 같은 사항을 고려 해야된다.

  • 가능하면 블록을 사용하여 아키텍처와 환경 모두 고려해야 한다.
  • 가능한 단순화하고 단일 배치 어플리케이션에서 복잡한 논리적 구조를 구축하면 안된다.
  • 데이터의 처리 및 저장을 물리적으로 가깝게 유지해야한다.
  • 시스템의 리소스 사용, I/O를 최소화하고 내부 메모리에서 가능한 많은 작업을 수행해야 한다.
  • 어플리케이션 I/O를 검토하여 물리적인 I/O를 방지해야 한다.
  • 배치 실행에 작업을 두번 실행 할 경우
  • 프로세스 중에 시간이 많이 걸리는 재할당을 방지하기 위해 충분한 메모리를 할당
  • 데이터 무결성과 관련해서 최악의 상황을 고려하고 기록 할 것
  • 실제 데이터 볼룸이 있는 프로덕션과 유사한 환경에서 테스트를 계획하여 실행 할것

결함을 찾는 경우

  • 데이터를 한번 읽고 작업 저장소에 캐시에 보관할 수 있는 경우 모든 데이터를 읽는 경우
  • 동일한 트랜잭션에서 이전 데이터를 읽은 트랜잭션에 대한 데이터를 다시 읽는 경우
  • 불필요한 테이블 혹은 인덱스 스캔을 유발할 경우
  • SQL문의 WHERE 절에 키 값을 지정하지 않는 경우

spring-batch dosc

프로젝트 시작

프로젝트 스팩의 경우 다음과 같다

  • spring batch
  • kotlin
  • gradle
  • h2
  • jpa

처음 프로젝트가 시작되면 일단 h2를 세팅을 시켜준다.

h2 데이터 베이스의 경우 로컬로만 사용을 하기위해 적용을 하려고 한다. 로컬 환경에서 사용을 안할경우 다른 RDBMS 를 사용을 하면된다.

h2의 경우 메모리/파일 모드TCP모드 모드가 있다. 일반적으로 default로 설정을 할경우 파일로 되어있기 때문에 이번 프로젝트의 경우 TCP 로 세팅을 해주려고한다.

kotlin에서의 설정 파일이다. 일단 당연하게도 빈을 설정을 해주기 위해서 configuration 어노테이션을 사용을 해준다. 빈으로 등록을 해주어야 하기 때문에 빈 어노테이션을 사용을 한다. 위의 코드의 경우 port 지정을 9095로 지정을 하였다.

다음으로 yml 파일 즉 설정파일을 작성을 해준다.

위와 같이 yml 파일을 설정을 해주면 h2의 기본 설정이 끝이 난다.

기존에 우리가 mvc 에서 사용을 했을때의 세팅과 같은데 Batch 어플리케이션을 만들기 위해서는 @EnableBatchProcessing을 설정해줘야 된다.

@Import(BatchConfigurationSelector.class)

@Import 를 타고 들어가면 BatchConfigurationSelector 클래스가 나오는데

@EnableBatchProcessing 에서 modular 속성을 true 라면 ModularBatchConfiguration 를 아니라면 SimpleBatchConfiguration 빈을 등록 되는지 정할 수 있다.

@EnableBatchProcessing 을 선언을 해주면 ModularBatchConfiguration/SimpleBatchConfiguration 을 빈으로 등록을 해준다.

ModularBatchConfiguration/SimpleBatchConfiguration은 설정 파일이기 때문에 추후에 자세하게 다루려고 한다.

스택오버풀을 참고를 하자면 이러한 질문이 있었다.


stackoverflow Q&A

@EnableBatchProcessing것이 어디 위치에 있어야 하는가?이다. 아무래도 배치 파일에 대한 설정 빈이 들어가기 떄문에 최상단에 있는게 맞다라고 생각이든다.

정리

정리를 하자면

  • 배치 어플리케이션을 단순하게 스캐줄러가 아닌 스캐줄러와 함께 사용하는 프레임워크이다.
  • 배치 어플리케이션의 아키텍처는 3가지로 나눈다. (어플리케이션, 코어, 인프라)
  • @EnableBatchProcessing 는 Batch 설정의 대한 빈 주입 어노테이션이다.
profile
Back-End Engineer

0개의 댓글