1. 스프링 배치의 장점
- 대용량 데이터 처리에 최적화되어 고성능
- 로깅, 통계처리, 트랜잭션 관리등 재사용 가능한 필수 기능 지원
- 수동으로 처리하지 않도록 자동화되어 있음
- 예외 사항과 비정상적인 동작에 대한 방어 기능 존재
- 작업 프로세스 구조만 이해하면 비지니스 로직에만 집중 가능
2. 스프링 부트 배치의 주의사항
스프링 부트 배치는 스프링 배치를 간편하게 사용할 수 있게 하는 프로젝트임
- 복잡한 구조 피하기
- 데이터 무결성을 유지하기 위한 방어책 필요
- 배치 처리 시스템의 I/O 사용 최소화
- 스프링부트 배치 스케쥴러가 따로 없음으로 쿼치 프레임워크 또는 CI 툴 사용을 권장함
3. 스프링 부트 배치 이해하기
일반적인 구조는 3단계로 이뤄져있음
1) 읽기 (Reade) : 데이터 저장소(DB)에서 특정 데이터들을 읽어옴
2) 처리 (Processing) : 원하는 방식으로 데이터 가공/처리
3) 쓰기 (Write) : 수정된 데이터를 다시 데이터 저장소(DB)에 저장
간략한 구조로 Tasklet을 통해 위 3단계를 한번에 수행할 수도 있음.
Job : 배치 처리 과정을 하나의 단위로 만들어 표현하는 객체
JobInstance : Job이 실행될 때 하나의 Job 실행 단위
JobExecution : JobInstance에 대한 한번의 실행을 나타내는 객체
Step : 실질적인 배치 처리를 정의하고 제어하는 객체
StepExcution : Step 실행 정보를 담는 객체
JobRepository : 배치 처리 정보를 담고 있는 메커니즘, 배치 실행에 관련된 모든 정보를 저장/ 관리하는 역할
JobLauncher : Job, JobParamter와 함께 배치를 실행하는 인터페이스
※@EnableBatchProcessing 어노테이션
해당 어노테이션을 통해 배치에 필요한 JobRepository, JobLauncher 등 다양한 설정을 자동으로 주입할 수 있음
[배치 설계]
그림
※청크 지향 프로세싱
청크 지향 프로세싱는 트랜젝션 경계 내에서 청크 단위로 데이터를 읽고 생성하는 프로그래밍 기법을 의미함. 즉, 청크는 커밋되는 데이터 수를 뜻함.
청크 지향 프로그래밍의 장점은 1000개의 데이터 중 한 개에서만 실패가 발생해도 전체가 롤백되었다면 청크 단위로 커밋을 하기 때문에 문제가 되는 청크만 롤백이 되고 다른 청크에는 영향을 주지 않음.
심화 기능
1) Listener 설정
Job 또는 Step 실행 전후에 특정 로직을 수행하도록 제어할 수 있음
2) Flow 기능
Step의 세부 조건에 따라 다음 동작을 제어할 수 있음
Decider 인터페이스를 통해 Step의 결과에 따라 다른 로직을 수행하도록 제어할 수 있음
3) 재시도 기능
네트워크 접속 또는 장비 다운 등의 이유로 배치가 실패했을 경우 설정한 재시도 횟수만큼 재
시도할 수 있음
4. 스프링 배치 테이블
1) BATCH_JOB_INSTANCE
job 실행 시 실행 데이터가 쌓이는 테이블 (같은 batchJob이라도 파라미터가 다르다면 다른 인스턴스로 기록됨)
2) BATCH_JOB_EXECUTION
BATCH_JOB_INSTANCE 의 성공/실패 내역 테이블
3) BATCH_JOB_EXECUTION_PARAMS
BATCH_JOB_INSTANCE 의 파라미터 정보들이 저장되는 테이블
4) BATCH_JOB_EXECUTION_CONTEXT
Job의 ExecutionContext 관련 데이터를 담고 있는 테이블
(ExecutionContext는 프로세스 상태 또는 특정 작업내 필요로 하는 정보를 담고있는 객체)
5) BATCH_STEP_EXECUTION
Step 의 성공/실패 내역 테이블
6) BATCH_STEP_EXECUTION_CONTEXT
Step의 ExecutionContext 관련 데이터를 담고 있는 테이블
5. 스프링 배치 병렬처리
여러 기술들이 있으나, 그 중 파티셔닝 기술을 사용할 예정
[파티셔닝 구조 그림]
파티셔닝은 1개의 Step을 각각의 slave로 분리해서 별도의 스레드를 할당하여 병렬적으로 실
행시키는 방법
6. java 배치 고도화 작업을 진행하면서 느낀 장점과 개선사항
1) 장점
- 대용량 처리에 효과적임.
Ex) Chunk 지향처리를 활용해서 성능 향상을 기대할 수 있음
※주의사항
- 한 개의 batch에서 너무 많은 데이터를 chunk로 갖고 있으면, 다른 batch에서 사용할 메모리가 줄어든다. 즉, 비슷한 시간대의 batch가 있을 경우 성능에 영향을 받을 수 있으므로, Reader에서의 Query 성능을 우선으로 고려해야 하는 게 좋다.
- 편리함
Batch는 Web Service와 다르게 실시간 처리에 대한 개념이 아닌 후속처리에 가까움
그러므로 테스트나 예외적인 상황을 미리 파악하기 어렵지만, Spring Batch의 Meta-schema에서각각의 저장된 로그 데이터를 통해 예외적인 이슈들을 확인할 수 있음
- CI Tool 적용
Integration(Telegram Notification), Scheduling, 실행 이력 관리 등 관리를 수월하게 할 수 있음.
- 구조적
좀더 배치에 특화된 인터페이스 구조를 제공받을 수 있음으로 비즈니스 로직에만 집중할 수 있으며 역할 별로 분리하거나 추가하기 편함.
참고링크1 : https://cheese10yun.github.io/spring-batch-basic/
참고링크2 : https://12bme.tistory.com/557
'IT > Spring' 카테고리의 다른 글
Spring 기본개념 (0) | 2021.02.10 |
---|