ㅇ Batch란?
(일괄적으로 처리되는) 집단, 함께 묶다라는 뜻을 가진 단어다.
애플리케이션에 적용해보면 개발자가 정의한 작업을 한번에 일괄처리하는 애플리케이션.
실제로 적용되는 예로는 매출데이터를 이용한 일매출 집계, 매우 큰 데이터를 활용한 보험급여 결정 등등
ㅇ 배치 애플리케이션이 필요한 상황
일정 주기로 실행해야 할 때, 실시간 처리가 어려운 대량의 데이터를 처리해야 할 때.
ㅇ 배치 애플리케이션의 조건
대용량의 데이터를 처리할 수 있어야 함.
자동화 - 심각한 문제 해결 제외하곤 사용자 개입없이 실행되어야 함.
견고성 - 잘못된 데이터를 충돌 없이 처리할 수 있어야함.
신뢰성 - 배치 애플리케이션은 무엇이 잘못되어있는지를 추적할 수 있어야함.
ㅇ 배치와 스케줄러의 차이
Spring Batch vs Quartz
스케줄링이란 - 매 시간/지정한 시간에 지정한 동작을 수행하는 것.
spring Batch는 공식문서에서 스케줄링 프레임워크가 아니다라고 나와있음.
배치 애플리케이션의 절대적 목적은 대용량 데이터 처리.배치 프레임워크에서 스케줄링 기능을 제공하진 않는다.
스케줄링 프레임워크는 배치를 도와주는 보완제 역할.
ㅇ 배치의 도메인 용어
하나의 배치 작업은 Job이라고 하고, 이 Job을 실행하기 위한 Job Launcher를 구현해야 함.
하나의 Job은 여러개의 Step으로 구성될 수 있고, Step은 ItemReader, ItemProcessor, ItemWriter로 구성할 수 있음.
Job 과 Job Launcher에 대한 정보를 관리하는 Job Repository가 있음.
ㅇ Job
Job이름을 정의할 수 있고, Step을 정의하고 순서를 정의함, Job의 재사용 가능성을 정의함.
하나의 Job은 여러개의 JobInstance를 가질 수 있는데, JobInstance는 논리적으로 Job을 실행하고, JobParameter(실행한 날짜)를 이용해 구분한다. 실행한 결과를 JobExecution이라는 객체로 가질 수 있다. 실패했던 JobInstance를 새로 실행하게 되면 새로운 JobExecution을 가질 수 있음. JobExecution은 BatchStatus와 ExitStatus라는 두가지 상태를 가짐. BatchStatus는 싱행 상태를 나타냄. 실행중 - started, 실패 - failed, 성공 - completed. ExitStatus는 실행 결과를 나타냄.
ㅇ Step
Job은 하나이상의 Step으로 구성될 수 있다. 배치 작업의 독립적이고 순차적인 단계를 캡슐화하는 도메인 객체. 개발자 재량으로 복잡하거나 단순하게 구현 가능함. StepExecution는 두가지 상태를 갖는다. Status - 실행 상태를 나타냄. ExitStatus - 실행의 결과를 나타냄.
ㅇ JobRepository
Job, Step 구현을 위한 CRUD 작업을 제공함.
ㅇ JobLauncher
Job을 시작하기 위한 간단한 인터페이스. 구현 시 JobRepository에서 유효한 JobExecution을 획득하고 Job을 실행한다.
ㅇ Item
작업에서 사용하는 데이터
ItemReader - Step에서 한 항목씩 검색함. 모든 항목 소진 시 null 반환. Cursor, Paging 제공
ItemWriter - 여러 출력 항목을 나타낸다.
ItemProcessor - 비지니스 처리를 담당함. 항목이 유효하지 않다고 판단되면 null 반환.
ㅇ Spring Batch 활용하기
프레임워크를 이용하기 때문에, JobLauncher, JobRepository 구현 신경쓰지않고, Job과 Step에서 비지니스 로직을 구현한다.
Job은 Step으로 구성되고 Step은 Tasklet으로 구성된다.Tasklet은 익명 Tasklet과 Chunk Oriented Tasklet으로 구성됨.
ㅇ Chunk-Oriented Processing
Step에서 ItemReader, ItemProcessor에대한 작업을 chunk 단위로 진행함. chunk란, 각 커밋 사이에 처리될 row(item)의 수. 성공시 chunk 만큼 커밋, 실패시 chunk 만큼 롤백. ItemWriter에선 reader과 Processor에서 처리한 Item을 Chunk 단위만큼 쌓여있을 때, 한번에 Write함.
ㅇ 테스트 코드를 반드시 작성해야 한다.
QA를 하기 어렵기 때문에 테스트 코드가 필요함. 복잡한 쿼리를 실행한 결과를 처리하고 다시 데이터베이스에 저장하는 작업이기 때문에 통합 테스트를 실행한다. 단위 테스트를 이용해 내부 작업을 검사하고 전체 테스트 코드를 반드시 작성함.
ㅇ 관리 도구
Cron - 리눅스 작업 스케줄러
SpringMVC + API Call - 권장하지 않는 방법
Spring Batch Admin - Deprecated
Quartz + Admin - 스케쥴러 프레임워크 + 관리자 페이지 구현
ㅇ 내 생각정리
나는 프로젝트에서 휴면회원을 잡기 위해 spring batch를 도입해보려고 했다. 전 프로젝트에서 지원님께서 구현하신 기능이 매일 한번씩 지정한 시간에 사용자들의 마지막 로그인 시간을 확인하고 1년이상인경우, 휴면계정으로 처리하는 기능이었다. 어떻게 했는지 여쭤봤는데, spring batch를 이용했다고 하셔서 아 스케줄링하는게 spring batch구나? 했다...
조금 공부해 보니 batch가 스케줄링하는게 아니구나! 라고 깨달았다. 스케줄링은 하는게 Quartz를 이용하면 되구나 싶었다. 이제 적용해 봐야겠다. Spring Batch는 대용량 데이터 처리에 필수적인 기능을 제공한다.
출처
https://www.youtube.com/watch?v=1xJU8HfBREY&t=920s
https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html
'프로젝트 > 낙낙(KnockKnock)' 카테고리의 다른 글
배포를 해볼까-3 (0) | 2023.07.17 |
---|---|
배포를 해볼까-2 (0) | 2023.07.14 |
배포를 해볼까-1 (0) | 2023.07.14 |
도커를 써볼까 (0) | 2023.07.10 |
오어쓰를 적용해boja. (OAuth2) (0) | 2023.05.30 |