상품이 재입고 되었을 때, 재입고 알림을 설정한 유저들에게 재입고 알림을 보내줍니다.
- Backend: Java 17, Spring Boot 3.4.0
- Database: MySQL 8.0
- ORM: Spring Data JPA
- Build Tool: Gradle
- Containerization: Docker, Docker Compose
아래는 프로젝트의 ERD(Entity Relationship Diagram)입니다:
Product (상품)
id (PK) name restock_cycle stock_status (boolean)
ProductNotificationHistory (알림 상태 기록)
id (PK) product_id (FK) restock_cycle status (IN_PROGRESS, CANCELED_BY_SOLD_OUT, COMPLETED) last_user_id created_at updated_at
ProductUserNotification (알림 구독 사용자)
id (PK) product_id (FK) user_id is_active created_at updated_at
ProductUserNotificationHistory (알림 전송 히스토리)
id (PK) product_id (FK) user_id restock_cycle sent_at
-
재입고 알림 전송
- 상품이 재입고되면 알림을 설정한 사용자에게 순차적으로 알림 전송.
- 1초에 최대 500명에게 알림 전송.
-
재고 소진 시 알림 중단
- 재고가 소진되면 알림을 중단하고 마지막 알림 사용자 ID를 기록.
-
재시도 API
- 중단된 알림은 마지막 사용자 이후부터 재시도 가능.
-
알림 상태 관리
IN_PROGRESS: 알림 발송 중CANCELED_BY_SOLD_OUT: 재고 소진으로 중단COMPLETED: 알림 발송 완료
- Endpoint:
POST /products/{productId}/notifications/re-stock - 설명: 자동 재입고 알림 전송
- Endpoint:
POST /admin/products/{productId}/notifications/re-stock - 설명: 관리자에 의한 수동 알림 전송
-
상품 조회 및 재입고 처리
Product엔티티의restockCycle을 증가시킵니다.
-
알림 상태 초기화
ProductNotificationHistory에 상태를IN_PROGRESS로 기록합니다.
-
알림 대상 사용자 조회
ProductUserNotification테이블에서 알림을 설정한 사용자 목록을 가져옵니다.lastUserId이후 사용자부터 알림을 전송합니다.
-
재고 확인 및 중단
- 알림 전송 중 재고 상태를 확인합니다.
- 재고가 소진되면 알림을 중단하고 상태를
CANCELED_BY_SOLD_OUT으로 기록합니다.
-
알림 히스토리 기록
- 성공적으로 알림을 전송한 사용자 정보를
ProductUserNotificationHistory에 기록합니다.
- 성공적으로 알림을 전송한 사용자 정보를
-
알림 상태 최종 업데이트
- 알림 전송이 모두 완료되면 상태를
COMPLETED로 기록합니다.
- 알림 전송이 모두 완료되면 상태를
- Controller 테스트:
- 알림 전송 API와 관리자 수동 API의 요청 및 응답 테스트
- Service 테스트:
- 비즈니스 로직 검증 (재고 소진 시 알림 중단, 마지막 사용자 ID 저장)