개요
이전까지 과부하 테스트를 위해 많은 양의 데이터가 필요할 때, 일일이 데이터를 INSERT 해주거나, 반복문, JMeter의 Loop를 사용해 데이터를 추가했다.
위의 이미지는 100,000개의 게시글 데이터를 JMeter의 Loop문을 사용해 테스트한 결과이다.
약 6분의 시간이 소요되었다. 생각보다 많은 시간이 소요되었다..
그래서 이 6분이라는 시간을 단축시킬 수 있는 방법이 있는지 찾아보다가 Spring Batch 라는 기술을 찾게되었다.
Spring 프레임워크에서 Spring Batch를 사용해 대용량 데이터를 처리하는 래퍼런스가 많은 것을 확인하고, 이번 기회에 Spring Batch를 사용해 데이터를 추가해보기로 했다.
Spring Batch란
Spring Batch란 대용량 데이터를 처리하기 위한 프레임워크이다.
일반적으로 서버에선 요청이 올 때 마다 실시간으로 작업을 수행한다. 하지만 배치는 그 작업들을 한번에 모은 후, 한번에 작업을 수행한다.
여기서 배치는 일반적으로 한꺼번에 처리해야 할 데이터나 작업을 모아 놓은 묶음(batch)을 뜻하며, 반복적이고 자동화된 데이터 처리 작업을 수행하는 데 사용된다.
여기서 반복적이라는 것의 의미는 개발자가 원한다면 목적에 따라 스케줄링 기능을 추가해 정해진 시간마다 특정 작업을 반복 실행할 수 있게 만드는 것을 의미한다.
Spring Batch 사용 예시
정산 및 회계 처리
금융 시스템이나 쿠팡, 네이버 쇼핑같은 이커머스 플랫폼은 하루 동안 발생한 거래 데이터를 집계하여 정산해야 한다.
이 때, Spring Batch와 스케줄러를 적절히 조합해서 사용한다면 최대한 트래픽이 몰리지 않는 시간대(새벽 시간대)에 대용량 데이터를 수집할 수 있다.
추천 시스템 데이터 처리
요즘 사용자의 클릭이나 구매 목록에 따라 상품을 추천해주거나, 영상, 게시물을 추천해주는 플랫폼이 많아졌다. 이러한 플랫폼에서도 매일 사용자의 행동 데이터를 수집하여 분석한 뒤, 추천 데이터를 생성하는데, 여기서도 Spring Batch를 사용할 수 있다.
이처럼 우리가 사용하는 많은 플랫폼에서 이미 대용량 데이터를 처리하는 내부 로직을 가지고 있다.
결국 Spring Batch를 공부하지 않을 이유가 없다..!
Spring Batch 인터페이스 ・ 구현체
Job
- 배치 작업의 전체 흐름
- 구현체
- SimpleJob : 가장 기본적인 Job 구현체로, 여러 Step을 순차적으로 실행
- FlowJob : 조건에 따라 Step 실행 순서를 다르게 설정할 수 있는 Job
Step
- Job의 하나의 작업 단위 (Job에서 수행되는 작업의 내부 흐름)
- 구현체
- TaskletStep : Tasklet을 기반으로 작업을 처리하는 Step
- 주로 단순 작업을 수행하는 데 사용 (환경 설정, 파일 작업, 초기화 등)
- ChunkOrientedTasklet : Chunk 기반으로 작업을 처리하는 Step
- Chunk를 기반으로 하기 때문에 대량 데이터를 작업하는 데 사용
- TaskletStep : Tasklet을 기반으로 작업을 처리하는 Step
(참고) Chunk란?
Chunk는 Batch의 소단위를 의미한다. Batch의 많은 양의 데이터를 덩어리(Chunk)로 나누어 메모리를 효율적으로 사용하고, 처리 속도를 높이기 위해 사용된다.
Chunk 크기를 10으로 설정하고, 총 데이터 100개를 처리하는 경우
- 10개 데이터를 읽기(Read)
- 읽은 데이터를 가공(Processing)
- 가공한 데이터를 쓰기(Write)
- 위 과정을 반복(총 10번)하여 100개 데이터를 처리
ItemReader
- 데이터를 데이터 소스(데이터베이스, csv, 문서 등)에서 읽어오는 역할
- 인터페이스
- ItemReader : 데이터를 읽어오는 단일 메서드 read()를 정의
- 구현체 - 데이터베이스
- JdbcCursorItemReader : JDBC 커서를 사용해 데이터를 조회
- JpaPagingItemReader : JPA를 사용해 페이지 단위로 데이터를 조회
- HibernateCursorItemReader : 하이버네이트를 사용해 데이터를 커서로 조회
- 구현체 - 파일
- FlatFileItemReader : csv, 텍스트 파일에서 데이터를 조회
ItemProcessor
- 데이터를 가공하거나 변환하는 역할
- 인터페이스
- ItemProcessor : 입력 데이터를 받아 가공 후 출력 데이터를 반환
- 구현체
- 따로 구현체는 없음
ItemWriter
- ItemReader를 통해 읽고, ItemProcessor를 통해 가공된 데이터를 DB나 문서에 저장하는 역할
- 인터페이스
- ItemWriter : 데이터를 쓰는 단일 메서드(write()) 정의
- 구현체 - 데이터베이스
- JdbcBatchItemWriter : JDBC 배치 처리를 사용해 데이터베이스에 데이터를 저장
- JpaItemWriter : JPA를 사용해 데이터를 저장
- HibernateItemWriter : 하이버네이트를 사용해 데이터를 저장
- 구현체 - 파일
- FlatFileItemWriter : csv, 텍스트 파일에 데이터를 저장
- 구현체 - 기타
- CompositeItemWriter : 여러 ItemWriter를 조합해 데이터를 저장
JobLauncher
- Job을 실행하는 역할
- 구현체
- SimpleJobLauncher : 기본적인 Job 실행기
JobRepository
- Job, Step의 실행 상태를 저장하고 관리
- 구현체
- SimpleJobRepository : 기본적인 JobRepository 구현체
Spring Batch 메타 테이블
특이하게도 Spring Batch는 프레임워크 관련 라이브러리 의존성만 가지면 되는게 아니라 Batch용 데이터베이스 테이블이 필요하다.
보다시피 테이블과 컬럼이 좀 많다..
하지만 굳이 모든 컬럼이 어떤 용도로 사용되는지 알 필요는 없다. 물론 알고있으면 좋긴하다.
그냥 각각의 테이블에 어떤 순서로 데이터를 저장하는지, 테이블의 사용 목적이 무엇인지 정도만 알면 될 것 같다.
BATCH_JOB_INSTANCE
- 배치 작업을 의미하는 Job에 대한 정보를 저장하는 테이블
BATCH_JOB_EXECUTION
- 배치 작업을 의미하는 Job의 수행 정보를 저장하는 테이블
- 언제 실행되었고, 언제 종료되었는지, 정상적으로 종료되었는지, 실패했을 경우 발생한 메시지가 무엇인지 등을 컬럼으로 가지고 있다.
BATCH_JOB_EXECUTION_PARAMS
- Job 실행 시 전달된 매개변수를 저장하는 테이블
- 동일한 작업을 다른 매개변수와 함께 실행해야 하는 경우, 기록된 매개변수를 참조 가능하다.
BATCH_STEP_EXECUTION
- Job의 각 단계를 나태내는 Step 실행에 대한 정보를 저장하는 테이블
- 각 Step의 실행 시작, 종료시간, 실행 상태, 종료 상태 등을 저장한다.
BATCH_STEP_EXECUTION_CONTEXT
- Step 작업이 실행되는 중에 사용된 컨텍스트 데이터를 저장하는 테이블
- 컨텍스트 데이터란 배치 작업의 실행 상태나 중간 데이터이고, 이후 단계 또는 작업 재실행 시 복원을 위해 사용된다.
BATCH_JOB_EXECUTION_CONTEXT
- 배치 작업이 실행되는 중에 사용된 컨텍스트 데이터를 저장하는 테이블
- 컨텍스트 데이터란 배치 작업의 실행 상태나 중간 데이터이고, 이후 단계 또는 작업 재실행 시 복원을 위해 사용된다.
BATCH_STEP_EXECUTION_SEQ
- BATCH_STEP_EXECUTION 테이블의 고유 식별자용 테이블
BATCH_JOB_EXECUTION_SEQ
- BATCH_JOB_EXECUTION 테이블의 고유 식별자용 테이블
BATCH_JOB_SEQ
- BATCH_JOB_INSTANCE 테이블의 고유 식별자용 테이블
다음엔 Spring Batch를 사용해 대량의 데이터를 추가해보자.
참고
https://docs.spring.io/spring-batch/docs/2.0.x/reference/html/metaDataSchema.html
'Spring' 카테고리의 다른 글
[Spring] Spring 프로젝트 SonarQube 연동 (0) | 2025.01.09 |
---|---|
[Spring] Spring Batch를 사용한 대량 데이터 저장 (2) (0) | 2024.12.22 |
[Spring] Controller 테스트 코드 (Feat : Spring Security) (1) | 2024.12.19 |
[Spring] Spring Boot + Web Socket(STOMP) (2) (1) | 2024.09.26 |
[Spring] Spring Boot + Web Socket(STOMP) (1) (0) | 2024.09.26 |