Skip to content

Story: 원가 히스토리 조회 로직

메타

항목
Story IDE-03-S-01
EpicE-03 원가 히스토리
상태draft
우선순위P0
규모M
담당 개발자BE (희선님)

사용자 스토리

As a 장사왕 시스템, I want 주문 시점에 맞는 원가를 조회하는 로직, So that 순이익 계산이 정확하게 이루어진다.


수락 기준 (Acceptance Criteria)

AC-01: 주문일 기준 원가 조회

항목내용
Given상품에 원가 히스토리가 존재 (예: 1/1 10,000원, 1/15 12,000원)
When1월 10일 주문에 대한 원가 조회
Then10,000원 반환 (1/1 ~ 1/14 기간 원가)

상세 스펙:

  • PurchasePrice 테이블에서 createdAt <= orderDate 조건으로 조회
  • 가장 최근(가까운) 원가 선택 (ORDER BY createdAt DESC LIMIT 1)

AC-02: 원가 히스토리 없는 상품

항목내용
Given상품에 원가 히스토리 없음
When원가 조회 요청
Then현재 Product.purchasePrice 반환 (기존 로직)

AC-03: 미래 주문일 처리

항목내용
Given주문일이 오늘 이후 (예약/선주문)
When원가 조회 요청
Then현재 적용 중인 최신 원가 반환

태스크 분해

Task 1: 원가 히스토리 조회 함수 AC-01 AC-02

  • [ ] 1.1: getPurchasePriceByDate(productId, orderDate) 함수 생성
  • [ ] 1.2: PurchasePrice 테이블 쿼리 최적화 (인덱스 확인)
  • [ ] 1.3: 히스토리 없을 때 fallback 로직

Task 2: 배치 조회 최적화 AC-01

  • [ ] 2.1: getPurchasePricesByDateBatch(productIds[], orderDate) 함수 생성
  • [ ] 2.2: N+1 문제 방지 (IN 절 + GROUP BY)

Task 3: 테스트 작성

  • [ ] 3.1: 단위 테스트 (히스토리 있음/없음, 경계값)
  • [ ] 3.2: 성능 테스트 (대량 조회 시)

Dev Notes (AI Agent 최적화)

영향 받는 소스 트리

src/
├── purchase/
│   └── purchase-price.service.ts    # 🔧 수정 (조회 함수 추가)
└── tests/
    └── purchase/
        └── purchase-price.spec.ts   # 🆕 신규 생성

핵심 쿼리 로직

sql
-- 단건 조회
SELECT purchasePrice
FROM PurchasePrice
WHERE productId = ?
  AND vendorId = ?
  AND createdAt <= ?
ORDER BY createdAt DESC
LIMIT 1;

-- 배치 조회
SELECT productId, purchasePrice, createdAt
FROM PurchasePrice p1
WHERE (productId, createdAt) IN (
  SELECT productId, MAX(createdAt)
  FROM PurchasePrice
  WHERE productId IN (...)
    AND createdAt <= ?
  GROUP BY productId
);

인덱스 확인 필요

sql
-- PurchasePrice 테이블 인덱스
-- (vendorId, productId, createdAt) 복합 인덱스 필요

충돌 감지

항목상태설명
기존 코드 충돌🟡 주의purchase-price.service.ts 수정 필요
DB 스키마 변경✅ 없음기존 테이블 활용

의존성

의존설명상태
PurchasePrice 테이블기존 히스토리 데이터✅ 존재

Dev Agent Record

항목
생성 AgentClaude Opus 4.5
생성일2026-01-27
마지막 수정2026-01-27
검증자-

검증 결과: 🔄 PENDING (PO 승인 대기) 검증일: -


생성일: 2026-01-27마지막 수정: 2026-01-27

장사왕 Product Team