테마
Story: 정합성 검증 및 모니터링
메타
| 항목 | 값 |
|---|---|
| Story ID | E-03-S-06 |
| Epic | E-03 원가 히스토리 |
| 상태 | draft |
| 우선순위 | P1 |
| 규모 | S |
| 담당 개발자 | BE (희선님) |
사용자 스토리
As a 운영팀, I want 원가 히스토리 적용이 올바르게 동작하는지 검증, So that 순이익 계산 오류를 조기에 발견하고 대응할 수 있다.
수락 기준 (Acceptance Criteria)
AC-01: 정합성 검증 쿼리
| 항목 | 내용 |
|---|---|
| Given | ETL 완료 후 |
| When | 정합성 검증 실행 |
| Then | 원가 미스매치 케이스 리포트 |
검증 항목:
- SettlementMargin.purchasePrice vs 주문 시점 PurchasePrice 일치 여부
- Product.purchasePrice vs 최신 PurchasePrice 일치 여부
- PurchasePrice 기간 겹침/누락 여부
출력 예시:
[정합성 검증 결과 - 2026-01-27]
1. 주문 시점 원가 미스매치: 0건 ✅
2. 최신 원가 미스매치: 3건 ⚠️
- productId: 123456, Product: 25,800, PurchasePrice: 26,000
- ...
3. 기간 중복/누락: 0건 ✅AC-02: 모니터링 대시보드 (선택)
| 항목 | 내용 |
|---|---|
| Given | 어드민 페이지 |
| When | 원가 히스토리 모니터링 메뉴 진입 |
| Then | 주요 지표 대시보드 표시 |
지표:
- 원가 히스토리 보유 상품 수
- 최근 원가 변경 건수 (일/주/월)
- 정합성 오류 건수
AC-03: 알림 (선택)
| 항목 | 내용 |
|---|---|
| Given | 정합성 검증 결과 오류 발견 |
| When | 오류 건수 > 임계값 |
| Then | Slack/이메일 알림 발송 |
태스크 분해
Task 1: 정합성 검증 스크립트 AC-01
- [ ] 1.1: 검증 쿼리 작성 (3가지 케이스)
- [ ] 1.2: CLI 명령어 또는 스케줄러 등록
- [ ] 1.3: 결과 리포트 포맷팅
Task 2: 모니터링 (선택) AC-02
- [ ] 2.1: 어드민 API 엔드포인트
- [ ] 2.2: 어드민 UI 페이지
Task 3: 알림 (선택) AC-03
- [ ] 3.1: 알림 로직 (기존 인프라 활용)
- [ ] 3.2: 임계값 설정
Dev Notes (AI Agent 최적화)
영향 받는 소스 트리
src/
├── scripts/
│ └── validate-purchase-history.ts # 🆕 신규 생성
└── admin/
└── monitoring/
└── purchase-history.ts # 🆕 선택검증 쿼리 예시
sql
-- 1. 주문 시점 원가 미스매치
SELECT sm.orderDate, sm.productId, sm.purchasePrice as margin_price,
pp.purchasePrice as history_price
FROM SettlementMargin sm
JOIN (
SELECT productId, purchasePrice, createdAt,
LEAD(createdAt) OVER (PARTITION BY productId ORDER BY createdAt) as nextCreatedAt
FROM PurchasePrice
) pp ON sm.productId = pp.productId
AND sm.orderDate >= pp.createdAt
AND (sm.orderDate < pp.nextCreatedAt OR pp.nextCreatedAt IS NULL)
WHERE sm.purchasePrice != pp.purchasePrice
LIMIT 100;
-- 2. 최신 원가 미스매치
SELECT p.id, p.purchasePrice as product_price, pp.purchasePrice as latest_history
FROM Product p
JOIN (
SELECT productId, purchasePrice
FROM PurchasePrice
WHERE (productId, createdAt) IN (
SELECT productId, MAX(createdAt) FROM PurchasePrice GROUP BY productId
)
) pp ON p.id = pp.productId
WHERE p.purchasePrice != pp.purchasePrice;충돌 감지
| 항목 | 상태 | 설명 |
|---|---|---|
| 기존 코드 충돌 | ✅ 없음 | 신규 스크립트 |
| DB 부하 | 🟡 주의 | 검증 쿼리 실행 시간대 고려 |
의존성
| 의존 | 설명 | 상태 |
|---|---|---|
| E-03-S-02 | SettlementMargin ETL 수정 | 선행 필요 |
Dev Agent Record
| 항목 | 값 |
|---|---|
| 생성 Agent | Claude Opus 4.5 |
| 생성일 | 2026-01-27 |
| 마지막 수정 | 2026-01-27 |
| 검증자 | - |
검증 결과: 🔄 PENDING (PO 승인 대기) 검증일: -
생성일: 2026-01-27마지막 수정: 2026-01-27
