출처 : https://youtu.be/1xJU8HfBREY?si=cw90Nu2gCC3SeLKK
배치 애플리케이션이 필요한 상황
- 일정 주기로 실행해야할 때
- 실시간 처리가 어려운 대량의 데이터를 처리해야 할 때
이런 작업을 하나의 애플리케이션에서 수행하면 저하를 유발할 수 있으니 배치 애플리케이션을 구현한다.
그런데 작업 중인 메인 서비스 애플리케이션 안에 구현되었고 새벽에 실행이 되도록 설정되어있다.(개선점)
배치 어플리케이션은 다음의 조건을 만족해야만 합니다.
대용량 데이터 - 배치 어플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다.
자동화 - 배치 어플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
견고성 - 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
신뢰성 - 배치 어플리케이션은 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅, 알림)
성능 - 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다.
from 1. Spring Batch 가이드 - 배치 어플리케이션이란?
1. Spring Batch 가이드 - 배치 어플리케이션이란?
Spring Batch In Action이 2011년 이후 개정판이 나오지도 않고 (2019.03 기준), 한글 번역판도 없고, 국내 Spring Batch 글 대부분이 튜토리얼이거나 공식 문서 중 일부분을 짧게 번역한 내용들이라 대용량 시
jojoldu.tistory.com
배치와 스케쥴러의 차이
이해의 시작은 스케줄링을 이해하는게 우선
스케줄링이란 ? 매 시간 / 지정한 시간에 지정한 동작을 수행하는 것!
배치는 스케줄링 프레임워크가 아니다!
- 배치 애플리케이션의 절대적인 목적은 대용량의 데이터 처리이다.
- 배치 프레임워크는 스케줄링 기능을 지원하지 않는다.
- 스케줄링 프레임워크는 배치를 도와주는 보완제 역할이다.
배치의 도메인 용어
1. 잡을 실행하기 위한 잡 런처를 구현해야한다.
2. 하나의 잡은 여러 개의 스탭으로 구성될 수 있다.
3. 스탭은 ItemReader, ItemProcessor, ItemWriter로 구성할 수 있다.
4. 잡 런처와 스탭에 대한 정보를 관리하는 잡 리포지토리를 만들어야 한다.
JOB
- 하나의 잡은 여러 개의 잡인스턴스를 가질 수 있다.
- 잡 인스턴스를 실행한 결과를 잡 익스큐션으로 가질 수 있다.
JobExecution Properties
- BatchStatus
: 실행 상태를 나타낸다.
: 실행중이면 started. 실패하면 failed, 성공하면 completed.
- ExitStatus
: 실행 결과를 나타낸다. ExitCode를 포함하고 있다.
Step
- 스탭의 결과로 스탭익스큐션을 가집니다.
- 잡 익스큐션의 결과로 여러 스탭 익스큐션을 가질 수 있습니다.
- 배치 작업의 독립적이고 순차적인 단계를 캡슐화하는 도메인 객체.
- 모든 Job은 하나 또는 그 이상의 Step으로 구성된다.
StepExecution
- Status : 실행 상태를 나타낸다.
- ExitStatus : 실행의 결과를 나타낸다.
- etc ... 실행에 대한 다양한 정보를 담고 있다.
JobRepository : Job, Step 구현을 위한 CRUD 작업을 제공한다.
JobLauncher : Job을 시작하기 위한 간단한 인터페이스
구현 시 JobRepository에서 유효한 JobExecution을 획득하고 Job을 실행한다.
-> Spring Batch 사용 시 제공받는다.
Item : 작업에 사용하는 데이터
ItemReader : Step에서 한 항목씩 검색한다. 모든 항목이 소진된 경우 null을 반환한다.
ItemWriter : 여러 출력 항목을 나타낸다.
ItemProcessor : 비즈니스 처리를 담당한다. 항목이 유효하지 않다고 판단되는 경우 null을 반환한다.
스프링 배치 활용하기
>프레임워크를 이용하기 때문에 JobLauncher나 JobRepository 구현은 신경쓰지 않는다.
- tasklet 은 익명 tasklet 과 chunk oriented tasklet으로 분류된다.
- Spring Batch를 이용하게 된다면 chunk oriented tasklet를 사용하게 된다.
Chunk-oriented Processing
- itemReader, itemProcessor 를 chunk 단위로 실행하게 됩니다.
- chunk 단위만큼 커밋, 롤백을 하게됩니다.
- write는 설정한 chunk 수가 만족되면 실행됩니다.
Chunk-oriented Processing
List items = new ArrayList();
for(int i = 0; i < commitInterval; i++) { // commitInterval == chunk size
Object item = itemReader.read();
Object processedItem = itemProccesor.process(item);
items.add(processedItem);
}
itemWriter.write(items);
ItemReader
- Cursor 와 Paging 기능을 제공합니다.
- Cursor : DB와 커낵션을 유지한 상태로 Item을 하나씩 가져오는 작업
- Paging : 한번의 커넥션에 정해진 Paging 사이즈만큼 Item을 가져오는 작업(주로 사용)
Paging
1. 메모리에 페이지 사이즈만큼 데이터를 가져옵니다.
2. 페이지 사이즈를 청크 사이즈와 동일하게 설정하는 것을 권장합니다.
3. chunk를 하나의 트랙잭션에서 처리 -> JPA의 영속성 컨택스트 사용 가능
4. chunk size > page size 일때의 문제점
- 하나의 트랙잭션 처리를 위해 여러번의 조회를 해야한다.
- 이유 : paging 해서 가져온 데이터가 chunk 사이즈보다 작기 때문에
chunk 사이즈를 채우기 위해 다시 DB를 조회하게 되어 성능 저하를 유발한다.
ItemProcessor (Optional)
- Chunk-oriented Processing을 구성할 때 선택 요소다.
- 데이터를 가공 / 필터링 하는 역할을 한다.
-> writer에서도 구현 가능한 역할 -> 비즈니스 코드가 섞이는 것을 방지한다.
- Step에 여러 로직이 필요할 때 도입을 고려해 유지보수성을 증가시킨다.
- 데이터 처리를 실패했을 때 null을 반환해 writer에 전달되지 않는다.
Controlling Step Flow
순차적 flow
@Bean
public Job job() {
return this.jobBuilderFactory.get("job")
.start(stepA())
.next(stepB())
.next(stepC())
.build();
}
결과에 따른 분기 flow
@Bean
public Job job() {
return this.jobBuilderFactory.get("job")
.start(stepA())
.on("*").to(stepB())
.from(stepA()).on("FAILED").to(stepC())
.end()
.build();
}
> BatchStatus가 아닌 ExitStatus로 판단한다.(실행상태가 아닌 실행결과로 판단한다.)
배치 애플리케이션 운영하기
테스트코드를 반드시 작성한다!
- QA를 하기 어렵기 때문에 테스트 코드가 필요하다.
- 복잡한 쿼리를 실행한 결과를 처리하고 다시 데이터베이스에 저장하는 작업이기 때문에 통합 테스트를 실행한다.
- 보통 단위의 테스트를 이용해서 내부 작업을 검사하고 전체 테스트 코드를 반드시 작성한다.
관리 도구
- CRON : 리눅스 작업 스케줄러
- Spring MVC + API Call : 권장하지 않는 방법
- Spring Batch Admin : Deprecated
- Quartz + Admin : 스케줄러 프레임워크 + 관리자 페이지 구현
- CI Tool(Jenkins)
Jenkins 의 장점
- Interaction(Slack, Email 등)
- 실행 이력 / 로그 관리
- 다양한 실행 방법(Rest API / 스케줄링 / 수동 실행)
- 파이프라인 : Job 내부에 Step을 여러개 설계하는 것 보다 권장된다.
-> Job을 단독으로 실행할 수 있도록 설계하는 것이 유지보수에 더 좋다.
Chunk 최적화
- 구체적인 가이드는 없다.
- 설계한 비즈니스 로직에 대해서 가장 효율적인 단위를 설정해야 한다.
- 여러개의 배치 작업을 구성하는 경우 다른 배치 작업에 영향을 주면 안된다.
-> 스프링 배치에서는 chunk 사이즈 만큼 메모리에 데이터를 적재해야 하기 때문에
다른 배치에서 사용할 수 있는 메모리가 줄어들 수 있다.
요약
- 배치 애플리케이션의 절대적인 목적은 대용량 데이터 처리이다.
- 배치와 스케줄링의 차이를 이해한다.
-> 스케줄링은 배치의 보완제 역할!
- 배치 애플리케이션의 기본 구성은 JobLauncher, Job, Step으로 구성한다.
-> 스프링 배치와 같은 프레임워크를 이용해서 비즈니스 로직에 집중할 수 있다.
- 다양한 방법으로 배치 애플리케이션을 운영할 수 있고 설계한 비즈니스 로직에 맞춰서 선택하자.
Spring Batch 흐름에 대해 이해하기 위해 youtube 영상의 내용을 글로 직접 정리해봤습니다.
정리하면서 밝아진 눈?으로 현재 운영중인 서비스의 소스를 다시 살펴보고 부족하다면
jojoldu님의 spring batch 구현하는 과정을 진행하며 Spring Batch 눈을 밝혀보겠습니다. 이상!
( https://jojoldu.tistory.com/325?category=902551 )
+ 공부하는데 도움이 될 정보는 언제든 환영입니다.
'프로그래밍' 카테고리의 다른 글
select2 트러블 슈팅 (4) | 2023.11.22 |
---|---|
intellij 번역 플러그인 소개 (1) | 2023.11.08 |
GITHUB CLI CLONE 사용 후기 (1) | 2023.11.02 |
SpringBatch 블로그 실습 후기 (1) | 2023.10.30 |
Scheduler (1) | 2023.10.16 |