티스토리 뷰

Spring Batch

  • Spring Batch
    • 대용량 데이터 일괄처리를 위한 배치 프레임워크
  • Spring Batch 실행 원리
    • Job : 처리하고자 하는 작업 단위 (객체이며 여러 Step Instance를 포함함)
    • Chunk : 처리되는 커밋 row 수, Chunk 단위로 Transaction을 수행하므로 실패시 Chunk단위 만큼 Rollback됨
      • 읽기 (read) - 처리 (processing) - 쓰기 (write)
      • = DB에서 처리 할 데이터 가져옴 - 데이터 처리 - 처리된 데이터 DB에 저장
      • Chunk 처리에서 배치가 수행되는 구조
        List items = new Arraylist();
        for(int i = 0; i < commitInterval; i++){
            Object item = itemReader.read()
            Object processedItem = itemProcessor.process(item);
            items.add(processedItem);
        }
        itemWriter.write(items);
        
    • PagingReader : 아이템 읽어올 시 Paging 처리
      • Paging Size와 Chunk Size는 동일하게 설정하는 것을 추천
      • 만약 Paging Size가 5, Chunk Size가 10, 총 데이터가 10이라면 데이터를 읽어올때 두번의 쿼리 실행 & 1번의 Transaction 수행됨
    • Step
      • 작업 처리 단위
      • Chunk 기반 스텝 / Tasklet 스텝
        • Chunk 기반
          • 하나의 트랜잭션에서 데이터 처리
          • ItemReader, ItemProcessor, ItemWriter 구현체를 설정함 (ItemProcessor는 생략 가능)
          • 즉 읽기, 처리, 쓰기를 나눈 방식
        • TaskletStep
          • 하나의 트랜잭션에서 데이터 처리
            • Tasklet 구현체를 설정 (내부에 단순한 읽기, 쓰기, 처리 로직을 모두 넣음)
            • 즉 읽기, 처리, 쓰기를 단일 작업으로 한 방식
  • Spring Batch Architecture
    • Application
      • 개발자가 만드는 모든 배치 Job과 커스텀 코드를 포함
    • Core
      • Job을 실행하고 제어하는 데 필요한 핵심 런타임 클래스 포함
      • Job, Step, JobLauncher, JobParameters 구현체 포함
    • Infrastructure
      • 파일, DB로부터 데이터를 읽고 쓰는 기능을 하기 위한 레이어 구조
      • Application 개발자나 코어 프레임워크 자체 두 레이어에서 사용할 수 있는 기능들을 제공
        • 개발자가 사용할 수 있는 ItemReader, ItemWriter와 같은 Reader나 Writer 포함
        • 코어에서 사용할 수 있는 기본 Reader나 Writer같은 Retry Template 포함
  • Quartz Scheduler
    • Spring Batch는 Job을 구동하거나 실행시키는 기능은 지원하지 않음 → Spring에서 Batch Job을 실행시키기 위해서는 Quartz, Scheduler, Jenkins 등 전용 Scheduler를 사용해야 함
    • Job Scheduling 라이브러리
    • Job은 Trigger가 발포되면 스켸줄됨
    • In-memory Job Scheduler
    • DB 기반 클러스터링 기능 제공
      • 여러 서비스 노드가 있을 때, 해당 노드들의 스켸줄러 간의 클러스터링 지원
      • @Scheduled를 통한 스켸줄링 기능은 클러스터링을 지원하지 않음 → 분산된 애플리케이션에서 독립적으로 실행됨
      • DB Lock을 이용하여 분산 애플리케이션에서 스켸줄이 중복하여 실행되지 않도록 구현
      클러스터링 : 똑같은 구성의 여러대의 서버를 병렬로 연결한 상태. 여러대의 서버 컴퓨터를 마치 하나의 가상 컴퓨터처럼 수행하도록 하는 것
    • 시스템의 Fail Over와 Round Robin 방식의 분산 처리 지원
  • Quartz 외
    • Spring Scheduler 사용
      • 별도 의존성 추가 필요X → Spring Boot starter에 기본적인 의존성으로 제공됨
      • Application 클래스에 @EnableScheduling 어노테이션 추가
      • Scheduler를 사용할 클래스에 @Component , Method에 @Scheduled 어노테이션 사용
      • Batch 기능의 클래스를 Bean으로 등록하고 Java에서 Cron 설정
      • 동기적으로 실행됨 → @Async 사용하여 비동기 처리 (이전 스켸줄러 작업 끝날때까지 안기다리고 자신의 작업 처리)
  • Spring Batch Roll Back
    • Chunk 지향 처리
      • 한 번에 하나씩 데이터를 읽어서 Chunk라는 덩어리를 만든 뒤, Chunk단위로 트랜잭션을 다룸
        1. Reader에서 데이터 하나를 읽어온다.
        2. 읽어온 데이터를 Processor에서 가공한다.
        3. 가공된 데이터들을 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장한다.
        → 즉, Reader와 Processor 에서는 1건씩 다뤄지고, Write에선 Chunk 단위로 처리됨
      • Chunk단위로 트랜잭션 수행하기 때문에, 실패하면 Chunk만큼만 롤백됨
      • ItemWriter 다음 트랜잭션이 커밋됨

참고
https://pooney.tistory.com/96 https://khj93.tistory.com/entry/Spring-Batch란-이해하고-사용하기 https://gngsn.tistory.com/177 https://velog.io/@hyun6ik/Spring-Batch-아키텍처 https://devmg.tistory.com/137 https://pooney.tistory.com/99 https://kdevkr.github.io/quartz/ https://jojoldu.tistory.com/331

 

'개발참고 > Spring' 카테고리의 다른 글

[Spring/JPA] TransientObjectException  (0) 2021.02.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크