구현 상세 · AFC 피드백 기준 설계

AFC 피드백을 기준으로
마스터 구조 구체화

이 페이지는 AFC 내부 검토 피드백을 기준(anchor)으로, 그 위에서 마스터 구조를 구체화합니다. 핵심 전제는 Quoteapp을 마스터 기준으로 둔다는 것 — 가장 많은 데이터가 쌓여 있고, 앱에 없는 오프라인 상품까지 포함하기 때문입니다. Foodil·CIPL은 마스터의 전체 또는 일부를 보유하는 소비자가 됩니다.

기준 AFC 내부 검토 피드백· 마스터 Quoteapp (확장 · 오프라인 포함)· 원칙 사실 = 마스터 · 표현/상업 = 채널· 작성 2026-06-17
기준 · Anchor

출발점 — AFC 피드백

아래 설계는 모두 이 피드백에서 출발합니다. AFC가 확정·제시한 전제를 기준으로 두고, 미해결 질문에 답을 채워가는 방식입니다.

AFC가 정한 전제 (기준)

  • 마스터 기준 = Quoteapp — 데이터가 가장 많이 축적되어 있어 우선 기준으로 둠.
  • 오프라인 상품 포함 — AFC 상품은 Foodil·CIPL 등록분뿐 아니라 오프라인 다수 상품까지 포함.
  • Foodil·CIPL은 소비자 — 마스터(Quoteapp)의 전체 또는 일부를 보유하는 형태.
  • 스키마·필드 차이 존재 — Foodil의 메인/영양 이미지, rich description, 원산지·기수출국·MOQ·보관유형·lead time이 Quoteapp엔 없음.

함께 풀어야 할 질문

  • #1 편집 기능 — 마스터 전환 후 Foodil·CIPL의 상품 수정 기능을 어떻게 가져갈지.
  • #2 셀러 상품 — AFC 마스터 상품과 Foodil 3rd-party seller의 동일/유사 상품을 병합할지 매핑할지.
  • #3·4 마스터 필드 범위 — 마스터가 모든 채널 필드를 담을지, Quoteapp 기준 + 채널 확장으로 둘지. 등록 입력 부담은 어떻게.

아래는 각 질문에 대한 답을, 위 전제를 기준으로 구체화한 것입니다.

핵심 원칙 · Principle

사실은 마스터, 표현·상업은 채널

“마스터가 모든 필드를 담는다”는 방향도 가능하지만, 그러면 등록 입력 부담이 커지고(피드백이 지적한 단점) 소유권도 어긋납니다(마케팅 카피를 AFC 운영이 작성). 그래서 필드를 두 층으로 나눕니다 — 사실(canonical fact)은 마스터, 표현·상업(presentation/commercial)은 채널 로컬. Quoteapp 마스터는 Foodil의 ‘사실’ 필드를 흡수하고, Foodil의 ‘표현’ 필드는 Foodil에 남깁니다.

DIAGRAM 01

필드 소유권 — 마스터 사실 + 채널 오버레이

마스터(Quoteapp 확장)는 사실 필드의 단일 진실입니다. 채널은 마스터 사실을 읽기전용으로 받고, 자기 오버레이(표현·상업)만 로컬에서 편집합니다.

마스터 = core (전용 DB · Quoteapp 시드) · 사실 필드 · 단일 진실 · 마스터에서만 편집 Quoteapp 기준 + Foodil 사실 필드 흡수 + 오프라인 상품 포함 상품명·브랜드·규격 중량·카톤·CBM 원산지·기수출국 MOQ·보관유형 lead time·유통기한 HS·바코드 대표·영양 이미지 원가 ※ Foodil에 있던 ‘사실’ 필드를 마스터가 흡수 동기화 · 채널에서 사실 필드는 읽기전용 Foodil (소비자) 마스터 사실 (읽기전용 · “마스터에서 편집”) 채널 오버레이 (로컬·편집): rich description · 머천다이징 이미지 · is_public·스토어 · 커미션/바이어가 · 채널 판매가 CIPL (소비자) 마스터 사실 (읽기전용) 채널 오버레이 (로컬·편집): 문서 설정 · 채널 표현 · 문서별 단가
마스터 (Quoteapp 확장) Foodil 오버레이 CIPL 오버레이 사실 동기화(읽기전용)
필드 (피드백 예시 포함)분류위치(소유)편집 위치
상품명 · 브랜드 · 규격 · 중량 · 카톤 · CBM사실마스터마스터(Quoteapp)
원산지 · 기 수출 국가 · MOQ · 보관유형 · lead time (현재 Foodil)사실마스터 (Foodil→흡수)마스터(Quoteapp)
HS code · 바코드 · 유통기한 · 원가사실마스터마스터(Quoteapp)
메인 이미지 · 영양성분 이미지 (대표)사실마스터마스터(Quoteapp)
rich editor description (마케팅 카피)표현Foodil 로컬Foodil
추가 머천다이징 이미지 · SEO · 추천표현Foodil 로컬Foodil
is_public · 스토어 배정 · 커미션 · 바이어별 가격상업Foodil 로컬Foodil
채널별 판매가 · 문서 설정상업채널 로컬각 채널
피드백 #1 · Editing

Foodil·CIPL 상품 편집 기능 처리

편집 화면을 없애지 않습니다. 필드 층에 따라 권한만 분리합니다 — 사실 필드는 읽기전용, 채널 필드는 그대로 편집. 이렇게 하면 “한 번만 관리(드리프트 제거)”를 달성하면서도 채널 팀의 작업은 막지 않습니다.

master-fed 상품 (AFC 마스터)

  • 사실 필드 = 읽기전용 — 동기화로 채워지고, “마스터에서 편집” 링크 제공.
  • 채널 필드 = 편집 유지 — rich description, 머천다이징 이미지, is_public·스토어, 가격정책.
  • 신규 AFC 상품 — 마스터(Quoteapp)에서 생성 → 동기화로 채널에 등장.
  • 전환은 단계적 — 먼저 읽기전용 동기화, 이후 사실 필드 입력칸을 잠금.

비-마스터 상품 (셀러 등 자체 상품)

  • 지금처럼 전체 편집 — Foodil에서 자체 생성·수정 (AFC 마스터 아님).
  • 구분 키master_product_id 유무로 잠금 여부 결정.
  • 충돌 없음 — 잠금은 ‘master-fed 행의 사실 필드’에만 적용.

즉 “편집 기능을 회수”가 아니라 master-fed 상품의 사실 필드만 잠그는 것이라 변경 범위가 작습니다.

피드백 #2 · Mapping

AFC 마스터 vs 셀러 상품 — 병합 아닌 매핑

동일/유사 상품이라도 병합하지 말고 매핑(연결)할 것을 권장합니다. 소유자가 다르고(AFC vs 셀러), 셀러 리스팅은 그들의 상업 오퍼이며, “유사”는 모호해서 자동 병합 시 오매칭·데이터 손실 위험이 큽니다.

DIAGRAM 02

동일 실물 = equivalence 링크 (레코드는 별도)

AFC 마스터 상품과 셀러 리스팅은 각자 별도 레코드로 두고, 사람 검토를 거친 equivalence(동일 실물) 링크로만 연결합니다. 중복 리포트·비교·분석은 되지만 레코드는 융합하지 않습니다.

AFC 마스터 상품 Quoteapp 소유 · 사실 단일 진실 오프라인 상품 포함 equivalence · 사람 검토 셀러 A 리스팅셀러 소유 · 자체 가격·MOQ·카피 셀러 B 리스팅셀러 소유 · 별도 레코드 ✗ 레코드 병합(merge) 안 함 · 소유권·가격 충돌 방지
AFC 마스터 (Quoteapp) 셀러 리스팅 (별도) equivalence 링크
방식효과리스크
매핑(권장) 권장중복 리포트 · AFC vs 셀러 비교 · 분석 · 소유권 유지매칭 기준·검토 워크플로 필요
병합단일 레코드소유권 충돌 · 셀러 가격/카피 덮어씀 · 유사 오매칭 시 손실

향후 셀러가 붙는 canonical 카탈로그(아마존식)가 필요하면 그때 확장할 수 있습니다. 지금은 매핑으로 시작.

피드백 #3·4 · Master Scope

마스터 필드 범위 & 등록 입력 부담 해소

마스터는 사실 필드의 상위집합입니다 — Quoteapp 기준에 Foodil의 사실 필드(원산지·MOQ·보관유형·lead time·대표 이미지 등)를 흡수. 단, 표현·상업 필드는 채널 로컬로 남깁니다. 피드백이 지적한 입력 부담발행 시점 필수화로 해소합니다.

DIAGRAM 03

발행 준비 게이트 — 추가 필드는 ‘발행할 때만’ 필수

마스터엔 최소 필드로도 상품이 존재할 수 있습니다(오프라인 상품처럼). Foodil 발행 시점에만 채널 필수 필드를 요구하므로, 오프라인 상품에 Foodil 데이터를 강제하지 않습니다.

마스터 상품 (최소 필드) 상품명·규격·원가 등 기본만으로존재 가능 (오프라인 상품 포함) Foodil 발행 준비 게이트 필수 체크: 보관유형 · 원산지 · MOQ · 대표 이미지 · (채널별 정의) 미충족 시 발행 보류 (건수 리포트) Foodil 투영 (발행됨) 사실 = 마스터 동기화 ·표현/상업 = Foodil 로컬 오프라인 상품 → 게이트 미적용 · 마스터에만 존재 (채널 미발행)
마스터(최소) 발행 게이트(필수 체크) Foodil 투영 오프라인(미발행)

마스터에 담는 것

사실의 상위집합

Quoteapp 기준 + Foodil 사실 필드 흡수. 타입 컬럼(nullable) + extra jsonb.

채널에 남기는 것

표현 · 상업 = 로컬

Foodil product_overlay(master_product_id 키)에 rich description·머천다이징·가격정책.

입력 부담 해소

발행 시점 필수화

마스터엔 최소 필드로 존재. 채널 필수 필드는 발행할 때만 요구.

왜 ‘전부 마스터’가 아닌가: 모든 채널 필드를 마스터에 넣으면 (1) 등록 시 입력 항목이 폭증하고(피드백 지적), (2) Foodil 마케팅 카피·머천다이징을 AFC 운영이 마스터에서 작성하게 되어 소유권이 어긋납니다. 그래서 사실만 마스터, 표현·상업은 채널이 균형점입니다.

마스터 어드민 · Authoring

마스터 출처 = Quoteapp · home = 전용 core DB

AFC 기준대로 마스터의 데이터 출처(seed)는 Quoteapp입니다. 다만 마스터가 ‘사는 곳(home)’은 하드닝된 전용 core DB를 권장합니다 — 프로토타입(JSON 기반 Quoteapp)을 그대로 회사 카탈로그의 단일 진실로 승격하면 리스크가 큽니다. 작성 UI는 얇은 전용 어드민으로 시작하고, Quoteapp은 먼저 정식 DB로 하드닝한 뒤 시드/소비 역할을 맡깁니다. (‘출처 · home · 작성도구’는 분리된 결정입니다.)

해야 할 일

  • Quoteapp 정식 DB 전환 — JSON 파일 → Postgres (지금도 필요한 작업).
  • 스키마 확장 — Foodil 사실 필드 흡수(원산지·기수출국·MOQ·보관유형·lead time·대표/영양 이미지·HS·바코드).
  • 전용 core DB + 얇은 어드민 — 마스터의 home은 하드닝된 전용 DB. 상품 사실은 여기서만 생성/편집.
  • 배포 — CIPL live read · Foodil logical replication + overlay · Quoteapp 직접 (자체 이벤트 없음).

함께 정할 것

  • 결정적 숫자 — 공유 상품 수 × 변경 빈도 × 오류 비용(과/소설계 방지).
  • 어드민 UI — 얇은 전용 어드민 vs 기존 도구 확장 (Quoteapp은 시드·하드닝 우선).
  • equivalence 매칭 기준 — 자연키·바코드·사람 검토 임계.
  • 채널별 발행 필수 필드 — Foodil/CIPL 각각의 게이트 정의.
  • 채널 오버레이 위치 — 앱 로컬 vs 마스터의 채널 태그 확장.