티스토리 뷰
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 구현체를 설정 (내부에 단순한 읽기, 쓰기, 처리 로직을 모두 넣음)
- 즉 읽기, 처리, 쓰기를 단일 작업으로 한 방식
- 하나의 트랜잭션에서 데이터 처리
- Chunk 기반
- Spring Batch Architecture
- Application
- 개발자가 만드는 모든 배치 Job과 커스텀 코드를 포함
- Core
- Job을 실행하고 제어하는 데 필요한 핵심 런타임 클래스 포함
- Job, Step, JobLauncher, JobParameters 구현체 포함
- Infrastructure
- 파일, DB로부터 데이터를 읽고 쓰는 기능을 하기 위한 레이어 구조
- Application 개발자나 코어 프레임워크 자체 두 레이어에서 사용할 수 있는 기능들을 제공
- 개발자가 사용할 수 있는 ItemReader, ItemWriter와 같은 Reader나 Writer 포함
- 코어에서 사용할 수 있는 기본 Reader나 Writer같은 Retry Template 포함
- Application
- 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 Scheduler 사용
- Spring Batch Roll Back
- Chunk 지향 처리
- 한 번에 하나씩 데이터를 읽어서 Chunk라는 덩어리를 만든 뒤, Chunk단위로 트랜잭션을 다룸
- Reader에서 데이터 하나를 읽어온다.
- 읽어온 데이터를 Processor에서 가공한다.
- 가공된 데이터들을 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장한다.
- Chunk단위로 트랜잭션 수행하기 때문에, 실패하면 Chunk만큼만 롤백됨
- ItemWriter 다음 트랜잭션이 커밋됨
- 한 번에 하나씩 데이터를 읽어서 Chunk라는 덩어리를 만든 뒤, Chunk단위로 트랜잭션을 다룸
- Chunk 지향 처리
참고
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
링크