테마
Story: 순이익 번역 UI (100원당 X원)
메타
| 항목 | 값 |
|---|---|
| Story ID | E-04-S-01 |
| Epic | E-04 Phase 2 순이익 번역 |
| 상태 | ready-for-dev |
| 우선순위 | P0 |
| 규모 | M |
| 담당 개발자 | 수민 (FE), 하록 (BE) |
사용자 스토리
As a ROAS가 뭔지 잘 모르는 초보 셀러,
I want "100원당 X원 남음"으로 번역된 순이익을 보고 싶다,
So that 내 광고가 돈을 버는지 알 수 있다.
수락 기준 (Acceptance Criteria)
AC-01: 순이익 번역 표시
| 항목 | 내용 |
|---|---|
| Given | 캠페인에 원가 데이터가 입력되어 있을 때 |
| When | 캠페인 카드를 볼 때 |
| Then | ROAS 옆에 "100원당 X원 남음/손해" 번역이 표시된다 |
AC-02: 컬러 코딩
| 항목 | 내용 |
|---|---|
| Given | 순이익 번역이 표시될 때 |
| When | 값에 따라 |
| Then | 양수(+30원 이상)=초록, 본전(0~30원)=노랑, 음수=빨강으로 표시 |
+30원 이상: "100원당 35원 남음" (초록색) → 건강
0~30원: "100원당 15원 남음" (노란색) → 본전
음수: "100원당 12원 손해" (빨간색) → 손해※ 2026-01-26 DB 분석 결과: 10~30원 구간이 대다수 → 건강 기준 30원으로 상향
AC-03: 원가 미입력 시
| 항목 | 내용 |
|---|---|
| Given | 캠페인에 원가 데이터가 없을 때 |
| When | 캠페인 카드를 볼 때 |
| Then | ROAS만 표시, 순이익 번역 미표시 |
| And | "원가를 입력하면 순이익을 계산할 수 있어요" 안내 표시 |
AC-04: 계산 API
| 항목 | 내용 |
|---|---|
| Given | 캠페인 데이터가 있을 때 |
| When | 순이익 번역 API 호출 시 |
| Then | profitPer100 필드로 100원당 순이익 반환 |
태스크 분해
Task 1: BE - 순이익 계산 API AC-04
- [ ] 1.1: 순이익 계산 로직 구현
- 순이익 = 전환매출 - 상품원가 - 광고비(VAT포함)
- 100원당 순이익 = (순이익 / 광고비) × 100
- [ ] 1.2: 기존 캠페인 API 응답에
profitPer100필드 추가 - [ ] 1.3: 원가 미입력 시 null 반환
Task 2: FE - 번역 UI AC-01, AC-02, AC-03
- [ ] 2.1: ProfitTranslation 컴포넌트 구현
- [ ] 2.2: 컬러 코딩 (초록/노랑/빨강)
- [ ] 2.3: 원가 미입력 시 안내 UI
- [ ] 2.4: GA4 이벤트 (
view_profit_translation)
계산 로직 상세
[계산식]
순이익 = 전환매출 - (상품원가 × 판매수량) - (광고비 × 1.1)
100원당 순이익 = (순이익 / 광고비) × 100
[예시]
광고비: 100,000원
전환매출: 441,000원 (ROAS 441%)
상품원가 합계: 300,000원
광고비 VAT포함: 110,000원
순이익: 441,000 - 300,000 - 110,000 = 31,000원
100원당: 31원
[표시 규칙]
• +30원 이상: "100원당 X원 남음" (초록) → 건강
• 0~30원: "100원당 X원 남음" (노랑) → 본전
• 음수: "100원당 X원 손해" (빨강) → 손해
• -50원 이하: "100원당 50원 이상 손해" (캡 적용)
※ 2026-01-26 DB 분석: 10~30원 구간 대다수 → 건강 기준 30원 상향이벤트 로깅
| 이벤트명 | 트리거 | 파라미터 |
|---|---|---|
view_profit_translation | 순이익 번역 노출 | {campaign_id, profit_per_100} |
click_cost_input_guide | 원가 입력 안내 클릭 | {campaign_id} |
Dev Notes
API 응답 예시
json
{
"campaignId": "123",
"roas": 441,
"profitPer100": 31,
"profitStatus": "healthy" // healthy | breakeven | loss
}의존성
- Product 테이블의
marginRate또는purchaseCost필드
생성일: 2026-01-20
