공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
데이터 설계
N개의 체육관을 기준으로 그려본 설계도이다. 이 설계도는 모든 테이블과 모든 컬럼을 나타내지 않고, 간단하게 핵심 정보만 포함했다.
설계 개요
- 여러 체육관을 관리할 수 있도록 체육관 테이블을 사용한다.
- 서비스에 가입한 사용자 정보를 관리하는 테이블이 존재한다.
- 헬스 이용권 등의 패키지를 패키지 테이블로 관리한다.
- 이용권 테이블은 각 사용자가 실제로 발급받은 이용권의 정보를 나타낸다.
설계 원칙
실제 개발 단계에서는 복잡도를 낮추기 위해 1개의 체육관을 기준으로 단순화하여 개발을 진행한다. 복잡한 서비스 로직을 간결하게 유지하기 위해 이러한 접근을 선택했다.
테이블 설계
테이블 설계는 기본적으로 다음과 같이 구성했다. 이후 개발 과정에서 추가적인 테이블이 필요하면 그때 추가할 예정이다.
Batch 구조 설계
Step
- 배치 처리를 정의하고 제어하는 독립된 작업의 단위다.
- Tasklet 기반 Step과 Chunk 기반 Step으로 나눌 수 있다.
- Tasklet 기반 Step: 단일 작업 처리에 적합하다.
- Chunk 기반 Step: 데이터의 읽기, 처리, 쓰기를 반복하는 구조이다. 이 구조는 아이템들을 정해진 Chunk 단위로 처리하며, 트랜잭션이 Chunk 단위로 관리된다.
Chunk 기반 step은 다음과 같은 과정으로 이루어진다.
- ItemReader: 정의된 chunk 크기만큼 데이터를 읽어온다. 예를 들어 chunk 크기가 10이라면 10개의 데이터를 읽어와 메모리에 담는다.
- ItemProcessor: 읽어온 데이터를 가공하거나 필터링하는 작업을 수행한다. 이 단계는 선택적으로 적용되며, 데이터를 가공하지 않을 경우 생략할 수 있다.
- ItemWriter: 처리된 데이터를 저장한다. 보통 DB에 저장하거나 파일에 기록하는 작업이 이 단계에서 이루어진다.
이 과정에서 중요한 점은 Chunk 단위로 트랜잭션이 관리된다는 것이다. 즉, 설정된 chunk 크기마다 commit과 rollback이 이루어져 데이터를 안정적으로 처리할 수 있다. 만약 중간에 오류가 발생하면 해당 chunk 내의 모든 작업이 rollback 되어 데이터의 일관성을 유지한다.
이 chunk 기반 step은 배치 작업을 효율적으로 수행하기 위해 필수적인 구조로, 대용량 데이터 처리에 적합하다.
Job은 독립적인 여러 Step들로 구성되며 순서가 지정된 작업의 흐름을 나타낸다.
- JobLauncher: Job 실행을 담당한다. Job 실행 시 필요한 파라미터의 유효성 검사 및 스레드 처리 방식을 결정한다. 또한, 현재 스레드 또는 스레드 풀을 사용할지 여부를 설정한다.
- JobRepository: Job의 수행 상태를 관리한다. 시작 및 종료 시간, 처리된 데이터 건수, 현재 상태 등의 정보를 RDB에 저장한다. 대부분의 스프링 배치 컴포넌트는 이 데이터를 공유하며, Job과 관련된 모든 수행 이력을 기록한다.
- Step: Job을 구성하는 단위 작업이다. 각 Step은 독립적으로 실행 가능하며, 여러 개의 Step이 순서대로 실행되며 하나의 Job을 완성한다.
- ItemReader, ItemProcessor, ItemWriter: Chunk 기반의 Step에서 사용되는 주요 컴포넌트들로, 데이터를 읽고 처리하며 저장하는 일련의 작업을 수행한다.
이 구조는 대용량 데이터 처리에서 안정성과 효율성을 제공하며, 스프링 배치의 강력한 특징 중 하나이다.
JobRepository의 구조
BATCH_JOB_INSTANCE
- Job이 처음 실행되면 이 테이블에 job instance 데이터가 등록된다. JOB_KEY는 고유한 키로, 동일한 파라미터로 실행된 Job이 중복되지 않도록 보장한다.
BATCH_JOB_EXECUTION
- Job의 실제 실행 기록을 나타내며, Job이 실행될 때마다 새로운 데이터가 생성된다. 실행 중에도 주기적으로 상태 값이나 관련 정보가 업데이트된다. 시작 및 종료 시간, 처리 건수 등이 이곳에 저장된다.
BATCH_JOB_EXECUTION_CONTEXT
- Job을 여러 번 수행할 때 유용하게 사용되는 컨텍스트 정보다. 각 실행 간에 필요한 데이터나 상태를 저장하여 재사용 가능하게 한다.
BATCH_JOB_EXECUTION_PARAMS
- Job이 매 번 실행될 때 사용된 파라미터를 기록한다. 이 파라미터를 통해 같은 Job이라도 다른 결과를 얻을 수 있다.
BATCH_STEP_EXECUTION
- Job 내부의 각 Step의 실행 정보를 관리한다. Step이 실행될 때마다 시작 시간, 종료 시간, 상태 등을 기록한다.
BATCH_STEP_EXECUTION_CONTEXT
- Step 실행 중 필요한 컨텍스트 데이터를 저장하여, 동일 Step 내에서 재사용 가능하게 한다.
이 구조를 통해 배치 작업의 상태를 지속적으로 추적하고, 필요에 따라 재실행하거나 롤백할 수 있다.
Tasklet
- Tasklet은 간단한 작업을 처리할 때 사용하는 Step의 일종이다.
- 일반적으로 하나의 명령어나 간단한 처리 작업을 수행하는 데 사용된다.
- Tasklet은 단순한 로직이 필요하거나 데이터 처리 없이 특정 동작을 수행할 때 적합하다. Tasklet Step에서는 단일 작업이 완료되면 해당 Step이 종료된다.
- 이 Tasklet 구조에서는 특정 작업이 반복 없이 한 번만 실행된다.
- Tasklet을 구현할 때는 Tasklet 인터페이스를 구현하고, execute() 메서드에서 작업 내용을 정의하게 된다.
이용권 만료 Job
이용권 만료 Job은 만료된 이용권을 처리하기 위한 배치 작업이다.
- 왼쪽에는 이용권 만료라는 기능의 이름이 표시되어 있다. 이는 사용자가 특정 시점에 만료된 이용권을 처리하는 작업을 의미한다.
- 오른쪽에는 이 작업이 실제로 어떻게 구현될지를 나타내고 있다. ExpirePassesReader는 만료된 이용권 데이터를 읽어 들이는 역할을 하고, ExpirePassesWriter는 그 데이터를 기반으로 만료 처리 작업을 수행하는 역할을 한다.
이 구조에서는 Reader-Processor-Writer 패턴을 따르고 있으며, Step의 각 단계가 분리되어 데이터를 처리한다. 이 작업이 반복적으로 수행되며, 만료된 데이터를 찾아 적절히 처리하는 것이다.
이용권 일괄 지급 Job
이용권 일괄 지급 Job은 특정 조건에 맞는 사용자에게 이용권을 일괄적으로 지급하는 작업이다.
- 왼쪽에는 작업의 이름인 "이용권 일괄 지급"이 적혀 있다. 이 작업은 대량의 이용권을 한 번에 지급해야 하는 경우에 사용된다.
- 오른쪽에는 이 작업의 구현 방법이 나타나 있다. AddPassesTasklet이라는 Tasklet이 정의되어 있으며, 이는 이용권 지급 작업을 수행하는 역할을 한다.
이 Job은 단순한 Tasklet 기반의 작업으로 구성되어 있으며, 주로 하나의 Task로 처리되는 간단한 로직을 구현할 때 사용된다. Tasklet은 반복적인 데이터 처리보다는 특정 비즈니스 로직을 한 번만 수행해야 할 때 유용하게 사용된다.
예약 수업 전 알람
예약 수업 전 알람 작업은 다음과 같은 흐름으로 구성된다.
- 알람 대상 가져오기: 이 단계에서는 예약된 수업 중 알람을 보낼 대상 정보를 가져온다.
- 알람 전송하기: 대상 정보를 바탕으로 알람을 전송하는 작업을 수행한다.
오른쪽에는 해당 작업이 실제로 어떻게 구성되는지 나타내는 다이어그램이 있다.
- AlarmReader와 AlarmWriter는 각각 알람을 보낼 대상을 읽어오고, 알람을 전송하는 역할을 한다. 이들은 Chunk 단위로 데이터를 처리하는 구조로 구성되어 있다.
- Chunk 기반 구조를 사용해 다량의 데이터를 병렬로 처리하여 성능을 최적화할 수 있다. 이 방식은 다중 쓰레드에서 작업을 병렬로 수행해, 많은 데이터 처리에 적합하다.
해당 Job은 대량의 알람을 효율적으로 전송하기 위해 Chunk 병렬 처리를 사용해 구성된다는 특징이 있다.
수업 종료 후 이용권 차감
수업 종료 후 이용권 차감 작업은 비동기 방식으로 진행된다.
- UsePassesReader: 사용해야 할 이용권 정보를 읽어온다.
- AsyncItemProcessor: 읽어온 정보를 처리하는데, 이때 비동기적으로 처리하여 작업 효율성을 높인다.
- AsyncItemWriter: 처리된 결과를 비동기적으로 DB에 반영한다.
이 구조는 대량의 이용권 차감 작업을 빠르게 처리하기 위해 비동기 처리 방식을 사용한다. 비동기 처리는 대기 시간을 줄이고, 동시에 여러 작업을 수행할 수 있어 성능 최적화에 유리하다.
통계 데이터 생성
통계 데이터 생성 작업은 두 개의 Step으로 나뉜다.
- StatisticsReader: 통계 데이터를 읽어오는 역할을 한다.
- StatisticsWriter: 읽어온 데이터를 작성하여 저장하는 역할을 한다.
- DayStatisticsTasklet과 WeakStatisticsTasklet: 각각 일간 통계와 주간 통계를 처리하는 Tasklet이다.
이 작업은 서로 관련이 없는 작업들을 병렬로 처리하여 효율성을 높인다. 병렬 처리를 통해 처리량을 높이고, 작업 시간을 단축시킬 수 있다.
'BackEnd > Project' 카테고리의 다른 글
[PT Manager] Ch03. Docker MySQL 설치 및 테이블 생성 (4) | 2024.08.27 |
---|---|
[PT Manager] Ch03. Batch 프로젝트 생성 및 git 설정 (0) | 2024.08.26 |
[PT Manager] Ch01. 요구사항 분석 (0) | 2024.08.26 |
[Admin] Ch03. 어드민 부가 기능 - 채팅 기능 구현 (0) | 2024.08.26 |
[Admin] Ch03. 어드민 부가 기능 - 방문자 수 집계 (0) | 2024.08.25 |