[Spring] Spring Batch와 스케줄러 적용

윤성철·2024년 7월 19일

Back-End

목록 보기
10/22
post-thumbnail

서론

💡 일일 미션을 관리하는 사이드 프로젝트를 수행하면서, 현재 수행중이지 않은 미션을 비활성화하는 로직을 개발했다. 비활성화는 03시에 스케줄러를 통해 처리하기 위해 batch를 공부하다가, Spring batch와 quertz 라이브러리를 통한 스케줄러를 알게되어 적용하게 되었다.

본론

Spring batch는 무엇이고, 왜 사용하고, 어떻게 동작할까

  • Spring batch
    -대량의 데이터를 처리하는 작업을 의미하며 이를 자동화하여 시스템의 부하를 줄이고 효율적인 데이터 처리를 가능하게 하는 프레임워크이다.

  • 스케줄러
    -일정한 시간 간격으로 반복적으로 수행되거나 특정 시간에 수행되도록 예약해 놓은 작업을 자동으로 실행해 주는 시스템이다.

💡 배치 사용 목적

  • 대량 데이터 처리
  • 자동화된 작업 처리
  • 분산 처리
  • 재시도 및 로깅
  • 데이터 분석

⚡ 스프링 배치 아키텍처

Spring Bacth 용어

  • JobRepository

    -다양한 배치수행관련된 수치 데이터와 Job의 상태를 유지 및 관리
    -일반적으로 RDB 사용, 스프링 배치 내의 주요 컴포넌트 공유
    -실행된 Step, 현재 상태, Read&Write 아이템 모두 이곳에 저장된다.

  • Job

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

  • JobLauncher

    -Job을 실행하는 역할
    -Job의 재실행 가능 여부 검증, 실행 방법, 파라미터 유효성, 검증 수행
    -Job을 실행하면 해당 Job은 각 Step 실행

  • Step

    -Step은 Job의 하위 단계로서 실제 배치 작업이 이루어지는 단위
    -한 개 이상의 Step으로 Job이 구성되며, 각 Step은 순차적으로 처리
    -각 Step 내부에서는 ItemReader, ItemProcessor, ItemWriter를 사용하는 chunk 방식 또는 Tasklet 하나를 가진다.

  • Tasklet

    -Step이 중지될 때까지 execute 메서드가 계속 반복해서 수행하고 수행할 때마다 독립적인 트랜잭션이 얻어진다.
    초기화, 저장 프로시저 실행, 알림 전송와 같은 Job에서 일반적으로 사용된다.

  • Chunk

    -한번에 하나의 데이터(row)를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것
    -Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 된다.
    Chunk 기반 Step은 ItemReader, ItemWriter, ItemProcessor라는 3개의 주요 부분으로 구성될 수 있다.


스프링 배치 적용

Spring Batch Dependency 추가

Job을 구성하는 Step을 먼저 작성하겠습니다. 먼저 readStep()을 통해 비활성화할 미션 목록을 list형태로 가져오는 로직입니다.

ReadJobStep

단일테스크인 tasklet으로 전체 미션을 조회하도록 구현했습니다.

이후 writeJob으로 서비스계층에서 구현한 end로직으로 사용자가 참여하지 않거나, 종료일자가 지난 미션을 비활성화하도록 step을 구성하겠습니다..

WriteJobStep()

마찬가지로 tasklet방식으로 파라미터로 전달받은 미션 목록들을 비활성화하도록 구현했습니다.

endJob()

위에서 작성한 Read & Write step을 Job에 등록

이제 등록한 Job을 실행하는 스케줄러를 구현하겠습니다.

Scheduler 등록

JobRegistry와 JobLauncher 객체 의존성을 주입받고,
@Scheduled 어노테이션을 통해 배치가 수행되는 시간을 설정합니다.
cron = "* * * 3 * * *"코드로 매일 새벽 03시에 배치가 수행되도록 설정했습니다.

jobParam의 현재시간 필드를 매겨변수로 jobLauncher를 통해 수행합니다.


배치 수행 결과

로컬에서 테스트하고있기 때문에 10초마다 수행하도록 cron을 설정해 확인해보겠습니다.

step1. read


step2. write(update)

업데이트 쿼리가 정상적으로 나간 것을 로그를 통해 확인할 수 있습니다.

profile
내 기억보단 내가 작성한 기록을 보자..

1개의 댓글

comment-user-thumbnail
2024년 8월 5일

일목요연하게 설명해서 이해가 쉽네요 감사합니다

답글 달기