코이팅

스프링 배치(Spring Batch)와 스케쥴러(Scheduler) 본문

CS

스프링 배치(Spring Batch)와 스케쥴러(Scheduler)

코이팅 2023. 1. 17. 13:37
728x90
반응형

1. 스프링 배치(Spring Batch)란?

1) 스프링 배치(Spring Batch)

배치(Batch) : 일괄처리
사용자와 상호작용 없이 여러 개의 작업을 미리 정해진 순서에 따라 중단 없이 처리하는 것입니다.

 

스프링 배치(Spring Batch)
엔터프라이즈 시스템의 운영에 있어 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크입니다. Spring의 특성을 그대로 가져왔기 때문에 DI, AOP, 서비스 추상화 등 Spring 프레임워크의 3대 요소를 모두 사용할 수 있습니다.

Spring Batch는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공합니다. 또, 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 일괄 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공합니다.

 

2) 스프링 배치(Spring Batch)를 사용하는 경우

  • 대용량의 비즈니스 데이터를 복잡한 작업으로 처리해야하는 경우
  • 특정한 시점에서 스케쥴러를 통해 자동화된 작업이 필요한 경우
  • 대용량 데이터의 포맷을 변경, 유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야하는 경우

 

3) 스프링 배치(Spring Batch)의 만족 조건

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

 

3) 스프링 배치(Spring Batch) 아키텍처

출처 : https://gainjavaknowledge.medium.com/spring-batch-with-spring-boot-6d0d63f539da

1) JobRepository
다양한 배치 수행과 관련된 수치 데이터와 Job의 상태를유지 및 관리합니다. 일반적으로 관계형 데이터베이스를 사용하며 스프링 배치 내의 대부분의 주요 컴포넌트가 공유합니다. 실행된 Step, 현재 상태, 읽은 아이템 및 처리된 아이템 수 등이 모두 JopRepository에 저장됩니다.

 

2) Job 
Job은 배치 처리 과정을 하나의 단위로 만들어 표현한 객체이고 여러 Step 인스턴스를 포함하는 컨테이너입니다.
Job이 실행될 때 스프링 배치의 많은 컴포넌트는 탄력성(resiliency)을 제공하기 위해 서로 상호작용을 합니다.

 

3) JobLauncher
Job을 실행하는 역할을 담당한다. Job.execute을 호출하는 역할입니다. Job의 재실행 가능 여부 검증, 잡의 실행 방법, 파라미터 유효성 검증 등을 수행합니다. 스프링 부트의 환경에서는 부트가 Job을 시작하는 기능을 제공하므로, 일반적으로 직접 다룰 필요가 없는 컴포넌트입니다. Job을 실행하면 해당 잡은 각 Step을 실행합니다. 각 스텝이 실행되면 JobRepository는 현재 상태로 갱신됩니다.

 

4) Step
스프링 배치에서 가장 일반적으로 상태를 보여주는 단위입니다. 각 Step은 잡을 구성하는 독립된 작업의 단위입니다.
Step에는 Tasklet, Chunk 기반으로 2가지가 있습니다.

[Tasklet 방식]
단계 내에서 단일 태스크를 수행하기 위한 것으로 임의의 Step을 실행할 때 읽기/처리/쓰기를 하나의 작업으로 처리하는 방식입니다. 즉, 각 단계는 하나의 정의된 작업만 수행해야합니다. Step이 중지될 때까지 execute 메서드가 계속 반복해서 수행하고 수행할 때마다 독립적인 트랜잭션이 얻어집니다. 초기화, 저장 프로시저 실행, 알림 전송과 같은 Job에서 일반적으로 사용됩니다. tasklet 클래스가 재사용이 될 수 있는 상황에 적합합니다. (Job 구성 클래스 내부에 tasklet 구현부를 넣어서 하나의 클래스로 하나의 업무를 정의하는 방식)

  •  Tasklet을 사용한 Task 기반 처리
    • 배치 처리 과정이 비교적 쉬운 경우 쉽게 사용
    • 대량 처리를 하는 경우 더 복잡
    • 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합

[Chunk 지향 프로세싱]
한 번에 하나씩 데이터(row)를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것입니다. 즉, 한 번에 모든 행을 읽고 처리하고 쓰는 대신 한 번에 고정 된 양의 레코드(청크)를 읽고 처리하는 방식입니다. Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 됩니다. 일괄 데이터 변경이나 어떤 데이터 변화를 주는 작업에 사용하면 좋습니다.

  • Chunk를 사용한 chunk(덩어리) 기반 처리
    • ItemReader, ItemProcessor, ItemWriter의 관계 이해 필요
    • 대량 처리를 하는 경우 Tasklet 보다 비교적 쉽게 구현
    • 예를 들면 10,000개의 데이터 중 1,000개씩 10개의 덩어리로 수행

 

2. 스프링 스케쥴러(Spring Scheduler)란?

1) 스프링 스케쥴러(Spring Scheduler)

스케쥴러(Scheduler) : ex) Spring Scehduler, Quartz 등
특정한 시간에 등록된 작업을 자동으로 실행시키는 것입니다.

 

스프링 스케쥴러(Spring Scheduler)
Spring Framework에서 기본적으로 제공하는 Scheduler입니다.

 

2) 스프링 스케쥴러(Spring Scheduler)의 특징

  • 추가적인 의존성 불필요 : Sprign Framework의 기본 기능
  • 사용이 쉬움 : @Component와 @Scheduled
  • 1개의 Tread pool 사용 : Schedule이 끝나야 다음 Schedule 실행 가능

 

2) 스프링 스케쥴러(Spring Scheduler) 사용 방법

출처 :  https://yermi.tistory.com/entry/Spring-Batch%EC%99%80-Scheduler%EC%9D%98-%EC%B0%A8%EC%9D%B4-Spring-Scheduler-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95#-%--Spring%--Scheduler%--%EC%--%AC%EC%-A%A-%EB%B-%A-%EB%B-%--

 

3) 스프링 스케쥴러(Spring Scheduler) 설정 옵션

1) fixedDelay
'fixedDelay'는 작업이 끝난 시점부터 시간을 카운트합니다.

출처 : https://yermi.tistory.com/entry/Spring-Batch%EC%99%80-Scheduler%EC%9D%98-%EC%B0%A8%EC%9D%B4-Spring-Scheduler-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95#-%--Spring%--Scheduler%--%EC%--%A-%EC%A-%--%--%EC%--%B-%EC%--%--

@Schedueld(fixedDelay=1000) // 단위: ms 
public void fixedDelayScheduler() {
  System.out.println("저는 이 작업이 끝나고 나서 다시 1000ms 후에 실행됩니다");
}

 

2) fixedRate
'fixedRate'는 작업의 시작부터 시간을 카운트합니다.

출처 : https://yermi.tistory.com/entry/Spring-Batch%EC%99%80-Scheduler%EC%9D%98-%EC%B0%A8%EC%9D%B4-Spring-Scheduler-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95#-%--Spring%--Scheduler%--%EC%--%A-%EC%A-%--%--%EC%--%B-%EC%--%--

@Scheduled(fixedRate=1000) // 단위: ms
public void fixedRateScheduler() {
  System.out.println("저는 작업이 끝날 때까지 기다리지 않고 1000ms 마다 실행됩니다.");
}

 

3) cron 표현식
cron = 0 * * * * ? : 앞에서부터 초, 분, 시, 일, 월, 요일 (연도) 순으로 진행됩니다.

출처 : https://madplay.github.io/post/a-guide-to-cron-expression

 

  • cron표현식 : 특수문자
    • * : 모든 값(매시, 매일, 매주처럼 사용한다.)
    • ? : 특정 값이 아닌 어떤 값이든 상관 없음
    • - : 범위를 지정할 때
    • , : 여러 값을 지정할 때
    • / : 증분값, 즉 초기값과 증가치를 설정할 때
    • L : 지정할 수 있는 범위의 마지막 값 표시
    • W : 가장 가까운 평일(weekday)을 설정할 때
    • # : N번 째 특정 요일을 설정할 때
  • cron표현식 : 예시

  아래는 corn 표현식의 예시표입니다.

 

출처 : IBM Knowledge Center

 

3. Quartz Job Scheduler

1) Quartz Job Scheduler

Quartz Job 스케쥴러
Quartz는 Terracotta 라는 회사에서 의해 개발된 Job Scheduling 라이브러리입니다. 완전히 자바로 개발되어 어느 자바 프로그램에서도 쉽게 통합해서 개발할 수 있습니다.

Quartz에는 크게 3가지로 이뤄집니다.

  • 실행하고자 하는 Job
  • job의 실행 주기를 나타내는 trigger
  • 트리거들을 스케줄러로 만드는 scheduler

 

2) Quartz Job Scheduler 사용 방법

  1. pom.xml에 관련 dependency 추가
  2. job으로 batch 작업을 진행할 서비스 구현
  3. context.xml에 2번에서 만든 job을 정의할 jobDetailFactoryBean, jobDetail와 연결해 실행주기를 정의할 cronTriggerFactoryBean, 트리거를 스케줄러로 생성해줄 SchedulerFactoryBean 3가지를 설정합니다.

 

3) Quartz Job Scheduler 실행 모드

cron
 : cron표현식을 지원합니다. "초 분 시 일 월 주 (년)"으로 표현합니다. 

 

fixedDelay
 : milliseconds 단위로, 이전 작업이 끝난 시점으로 부터 고정된 시간을 설정합니다. ex) fixedDelay = 5000

 

fixedDelayString
 : fixedDelay와 같은데 property의 value만 문자열로 넣는 것입니다. ex) fixedDelay = "5000"

 

fixedRate
 : milliseconds 단위로, 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간을 설정합니다. ex) fixedRate = 3000

 

fixedRateString
 : fixedDelay와 같은데 property의 value만 문자열로 넣는 것입니다. ex) fixedRate = "3000"

 

initialDelay
 : 스케줄러에서 메서드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것입니다.

 

initialDelayString
 : 위와 마찬가지로 문자열로 값을 표현하겠다는 의미입니다.

 

zone 
: cron표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 서버의 time zone입니다.
728x90
반응형

'CS' 카테고리의 다른 글

REST, REST API, RESTful  (0) 2023.01.18
비동기 통신 Ajax와 Fetch API  (0) 2023.01.17
시간복잡도(Time Complexity)  (0) 2023.01.15
JWT(Json Web Token)란?  (0) 2023.01.14
Spring Security란  (0) 2023.01.14
Comments