Spring/Spring Batch

[Spring Batch] Spring Batch 로 정산 시스템 만들어보기 (1)

신민석 2024. 8. 20. 03:06

🎯 들어가기 앞서..


이번 여름 방학때 Spring Batch 에 대해 공부해봤는데 이를 다시 한번 복습하고 깊게 공부하는 것을 목적으로 시작한 프로젝트 입니다.

만들어야 하는 배치 프로그램 요구 사항을 정하고 이에 맞춰 하나씩 차근차근 해결해봅시다! 

 

🎯 요구 사항


## 🎯 Spring Batch 를 이용한 정산 시스템 프로젝트

----
```
배달 서비스(배달의 민족, 요기요)를 참고해 관리자(Admin)와 가게 업주(Owner)의 주문 정보와 정산 정보를 조회하고 관리하는
프로그램입니다.

대용량 데이터 처리를 위해 
```


###⚒️ 기술 스택

----

**Backend** : `Spring Boot`, `JPA`, `QueryDSL`  
**Database** : `MySQL`  
**Frontend** : `ThymeLeaf`  
**Devops** : `Docker`, `Jenkis`, `Aws Ec2`

### 기능 요구 사항

----

### 관리자 페이지 및 도메인
1. 역할 분리
   - [ ] 관리자(Admin) 과 가게 업주(Owner) 를 분리한다.
   - [ ] 관리자는 모든 가게의 주문, 정산 정보를 조회할 수 있고, Owner 는 자신의 가게 주문만을 조회할 수 있다.

### 관리자 도메인
1. 주문 내역 조회 
   - [ ] 관리자는 모든 가게의 주문 내역을 조회할 수 있다.
     - [ ] 주문내역을 조회할때 주문 상태, 주문 날짜등으로 필터링할 수 있다.
 
2. 정산 내역 조회
   - [ ] 관리자는 모든 가게의 정산 내역을 조회할 수 있다.
     - [ ] 리스트에 노출시킬때 이번달의 총 매출을 노출시킨다.
     - [ ] 리스트의 아이템을 클릭해 상세 정보를 클릭하면 달력으로 나타낸 후 매출을 노출시킨다.

### 업주 도메인
1. 주문 내역 조회
   - [ ] 업주(Owner)는 가게의 주문 내역을 조회할 수 있다.
     - [ ] 수정은 불 가능하다.
     - [ ] 업주는 지정한 날짜의 주문 내역을 CSV 파일로 다운받을 수 있다.
2. 정산 내역 조회
   - [ ] 업주는 가게의 정산 내역을 조회할 수 있다.
   - [ ] 달력으로 나타내고, 하루 매출을 노출시킨다.
   - [ ] 한달, 하루단위를 기본으로 나타낸다.

### 배치 시스템

1. 데이터 수집 및 전처리
   - [ ] 거래 데이터 수집: 가게의 거래 데이터를 수집합니다. 데이터는 하루 동안 발생한 모든 거래 내역(판매, 환불 등)을 포함해야 합니다.
   - [ ] 데이터 유효성 검증: 수집된 거래 데이터의 유효성을 검증하는 단계를 추가합니다. 예를 들어, 누락된 필드가 없는지, 금액이 음수가 아닌지 등의 검증 로직을 포함합니다.
   - [ ] 데이터 정규화: 여러 가게에서 수집된 데이터를 하나의 표준 포맷으로 정규화합니다. 서로 다른 포맷의 데이터를 동일한 포맷으로 변환하는 로직을 구현합니다.
     
2. 정산 계산 로직
   - [ ] 매출 집계: 가게별 총 매출, 환불 금액, 순매출을 계산합니다.
   - [ ] 수수료 계산: 각 가게에 적용되는 수수료(예: 결제 수수료, 플랫폼 수수료 등)를 계산하여 최종 정산 금액을 계산합니다.
   - [ ] 할인 처리: 특정 프로모션이나 할인 이벤트가 적용된 경우, 이를 반영하여 정산 금액을 계산합니다.
   
4. 정산 결과 저장
   - [ ] 정산 내역 저장: 계산된 정산 결과를 DB에 저장합니다. 가게별로 일별, 월별 정산 내역을 관리할 수 있도록 테이블을 설계합니다.
   - [ ] 이력 관리: 정산 작업의 이력을 관리합니다. 예를 들어, 정산이 언제 완료되었는지, 성공/실패 여부 등을 기록합니다.

5. 스케줄링 및 알림
   - [ ] 정산 작업 스케줄링: AM 3:00에 정산 작업이 자동으로 실행되도록 Spring Batch의 스케줄링 기능을 사용하여 배치 작업을 구성합니다.
   - [ ] 실패 시 재시도 로직: 정산 작업이 실패했을 때 자동으로 재시도하는 로직을 구현합니다. 재시도 횟수와 대기 시간을 설정합니다.
   - [ ] 정산 완료 알림: 정산 작업이 완료되면 가게 주인에게 정산 완료 알림을 전송합니다. 이메일이나 SMS 등을 활용할 수 있습니다
   
6. 정산 결과 파일 생성 및 다운로드
   - [ ] 정산 결과 파일 생성: 정산 결과를 CSV 또는 Excel 파일로 생성하는 기능을 구현합니다. 파일에는 가게별 매출, 수수료, 최종 정산 금액 등이 포함되어야 합니다.
   - [ ] 파일 저장소 관리: 생성된 파일을 AWS S3 또는 로컬 파일 시스템에 저장하는 기능을 구현합니다.
   - [ ] 파일 다운로드 API: 저장된 정산 결과 파일을 다운로드할 수 있는 REST API를 제공합니다. 가게별로 파일을 조회하고 다운로드할 수 있어야 합니다.

🎯 프로젝트 설정


 

먼저 크게 모듈은 batch, cms, core 3개로 나눴습니다. batch 모듈에는 Spring Batch 관련 로직과 스케줄러를 관리하고, cms 모듈에서는 관리자 페이지 View 와 사용될 api 그리고 사용자 권한을 관리합니다. 마지막으로 core 모듈에서는 도메인 관련 로직들을 구현할 예정입니다.

 

프로젝트 구조

 

 

settlement-system-core 디렉토리 구조

 

config 는 QueryDSL 설정 컴포넌트를 넣었고, domain 폴더에는 JPA 로 매핑할 Entity 와 Repository 를 구현했습니다. 마지막으로 exception 폴더에는 시스템 전체에서 사용할 예외를 커스텀해 구현했습니다.

 

settlement-system-cms 디렉토리 구조

 

auth 폴더에서는 Spring Security 관련 로직을 구현했고, v1 폴더에서는 관리자페이지에서 사용할 REST API 와 ThymeLeaf 로 구현할 View 의 매핑 URL 을 선언했습니다.

 

✅ settlement-system-batch 디렉토리 구조

 

etl 폴더에서는 Batch 의 Tasklet(ItemReader, ItemWriter, ItemProcessor)  수준의 로직들을 구현했습니다. 나머지 폴더들은 각각의 네이밍에 맞춰 배치 관련 로직들을 구현할 예정입니다.

 

🎯 정리


지금까지 전반적인 프로젝트 구조에 대해 설명드렸습니다. 자세한 코드는 아래 깃허브 주소를 확인해주세요

 

이번 포스팅은 프로젝트 설정과 도메인 구축에 대한 내용만을 포함하고 있어 크게 설명할 부분이 없었네요.. ㅎ 다음 게시글에선 Batch 관련 코드를 구현하는 과정을 포스팅해보겠습니다!

 

https://github.com/sinminseok/settlement-system

 

GitHub - sinminseok/settlement-system

Contribute to sinminseok/settlement-system development by creating an account on GitHub.

github.com