배치 애플리케이션의 조건
대용량 데이터 - 배치 어플리케이션은 대용량의 데이터를 가져오거나 전달하거나 계산하는 등의 처리를 할 수 있어야한다
자동화 - 배치 어플리케이션은 심각한 문제 해결을 제외 하고는 사용자 개입 없이 실행 되어야 합니다.
견고성 - 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리 할 수 있어야 한다
신뢰성 - 무엇이 잘못되었는지 추적 할 수 있어야 한다. (로깅, 알림)
성능 - 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야 한다
배치와 스케쥴러의 차이
spring Batch vs Quartz(스케쥴러의 대표적 프레임워크)
스케쥴링이란? 매시간/지정한 시간에 지정한 동작을 수행하는것 (!스프링배치는 스케쥴링 프레임워크가 아니다)
배치 어플리케이션의 절대적인 목적은 대용량 처리이다
배치 프레임워크에서 스케쥴링 기능을 제공하지 않음
스케쥴링 프레임워크는 배치를 도와주는 보안제 역할(스케쥴링은 대용량 작업을 수행해야 할때 배치와 엮여서 사용가능)
배치의 도메인 용어
JOB
job -> JobInstance -> JobExecution
Job
job의 이름을 정의,
Step을 정의하고 순서를 정의,
Job의 재사용 가능성을 정의
JobInstance
논리적으로 Job을 실행,
JobParameters를 이용하여 구분,
JobInstance = Job + identifying JobParameters
JobExecution
Job을 실행하는 단일 시도,
실패했던 JobInstance에 대해 새로운 실행을 하면 새로운 JobExecution이 생성
JobLauncher : job을 시작하기 위한 간단한 인터페이스. 구현시 jobRepository에서 유효한 JobExecution을 획득하고 Job을 실행한다.
StepExecution
- Status : 실행 상태를 나타낸다.
- ExitStatus : 실행의 결과를 나타낸다.
- ReadCount, WriteCount, CommitCount, RollbackCount, FilterCount 등 실행에 대한 다양한 정보를 담고 있다.
스텝이 실행됐을때 어떤 데이터를 어떻게 처리 했나 이런 정보를 가지고 있다.
JobRepository : Job, Step 구현을 위한 CRUD 작업을 제공한다.
JobExecution, StepExecution이 갖는 데이터들을 데이터 베이스에 저장하고 불러오는 작업을 말함
Tasklet은 각 Step에서 수행되는 로직이다. 개발자가 Custom Logic을 만들 수 도 있고, 또는 보통 Batch의 경우 데이타를 ETL (Extract, Transform, Loading) 하는 형태이기 때문에, Spring Batch에서 미리 정의해놓은 Reader, Processor,Writer Interface를 사용할 수 있다.
Step : Spring에서 Batch Job은 Step의 모음으로 구성된다. Job은 Step이 순차적으로 수행되게 된다.
step은 item, itemReader, itemWriter, itemProcessor로 구성 된다.
item : 작업에 사용하는 데이터
정의한 작업이 데이터베이스를 이용한다고 하면 데이베이스의 데이터의 한 로우가 item이다.
itemReader : item을 하나씩 읽어오는 기능을 함. step에서 한 항목씩 검색한다. 모든 항목이 소진된 경우 null을 반환한다.
itemWriter : item을 가지고 출력항목을 나타내는건데 데이터베이스에 저장하거나 이런 작업을 여기서 정의한다.
itemProcessor : 비즈니스 처리를 담당한다. 항목이 유효하지 않다고 판단되는 경우 null을 반환한다.
자동으로 null을 반환해주기 때문에 optional로 어떤 객체를 감싸는 비용을 감수하지 않아되 된다.
프레임워크를 이용하면 JobLauncher와 JobRepository에 신경쓰지 않아도 된다
Job-Step itemReader,itemProcessor,itemWtiter
잡은 스텝으로 구성되고 스텝은 Tasklet으로 구성된다 테스클릿은 익명 테스클릿과 ChunkOrientedTasklet으로 나눠지는데 스프링배치를 이용하게 되면 청크오리엔티드테스클릿을 많이 이용하게 된다
chunk = 각 커밋 사이에 처리될 Row(item)의 수.
성공시 청크만큼 커밋,
실패시 청크만큼 롤백
itemReader
-Cursor와 Paging 기능을 제공한다.
Cursor는 데이터베이스와 커넥션을 유지한체 item을 하나씩 뽑아오는 작업을 한다.
Paging은 한번 커넥션을 할때 정의한 페이지 사이즈만큼 아이템을 한번에 가져온다.
itemProcessor(Optional)
-Chunk-orianted Tasklet을 구성할때 선택 요소이다
데이터 가공 / 필터링 하는 역할을 한다.
->writer에서도 구현 가능한 역할 -> 비즈니스 코드가 섞이는 것을 방지한다.
-Step에 여러 로직이 필요할 때 도입을 고려해 유지보수성을 증가시킨다.
-데이터 처리를 실패 했을때 null을 반환해 writer에는 실패한 작업에 대한 결과를 전달하지 않는다.
스프링배치를 이용하면 하나의 잡에서 여러가지 스텝을 정의 했을때
순차적으로 그 스텝들이 실행되게 작업순서를 정의 할 수 있다.
테스트 코드를 반드시 작성한다.
- QA를 하기 어렵기 때문에 테스트 코드가 필요하다.
관리도구
- Cron : 리눅스 작업 스케쥴러
- Spring MVC + API Call : 권장하지 않는 방법
- Spring Batch Admin : Deprecated
- Quartz + Admin : 스케쥴러 프레임워크 + 관리자 페이지 구현
배치 어플리케이션의 기본 구성은 JobLauncher, Job, Step으로 구성한다.
->스프링 배치와 같은 프레임워크를 이용해서 비즈니스 로직에 집중 할 수 있다.
'개인공부' 카테고리의 다른 글
mysql Group by 와 Having (0) | 2021.06.16 |
---|---|
[SQL] 두 테이블의 값 비교, 한쪽에 없는 것 추출방법은? (0) | 2021.06.15 |
서브쿼리 (0) | 2021.06.15 |
Foreign Key : 외래키 (0) | 2021.06.15 |
mysql ifnull (0) | 2021.06.14 |