Skip to content

feat(affiliate): Rakuten SFTP 기반 아이템 카탈로그 DB 구축 #625

Description

@CIOI

배경

Antonioli affiliate 승인을 받았고, Rakuten Affiliate에서 제공하는 상품 feed를 기반으로 decoded의 아이템 카탈로그 DB를 구축하려고 한다.

Rakuten feed는 SFTP 서버에서 .txt 파일 형태로 내려받는 방식이며, 이 파일을 전처리한 뒤 DB에 적재하고 이후 상품 검색/매칭을 위한 item-level embedding까지 준비하는 것이 목표다.

현재까지 정리된 방향

  • 초기 파트너/머천트: Antonioli
  • feed 제공 방식: Rakuten Affiliate SFTP
  • feed 파일 형식: .txt
  • 초기 예상 규모: 약 12,000개 상품
  • 카탈로그 데이터는 런타임 검색/매칭/affiliate 링크에 사용되므로 기본 저장 위치는 operation DB가 적합하다.
  • assets DB는 raw feed 격리, 검수, 재처리, 승격 플로우가 필요하다고 판단될 때만 staging 용도로 검토한다.
  • embedding은 Cody/raw_posts 벡터 검색 경로와 맞출 경우 gemini-embedding-2 + output_dimensionality=768 방향이 유력하다.

샘플 feed에서 확인한 주요 필드

샘플 Antonioli row 기준으로 다음 값들이 포함된다.

  • 외부 상품 ID / product id
  • 상품명
  • 카테고리 계층
  • affiliate URL
  • 대표 이미지 URL
  • long description
  • brand
  • 재고 상태
  • 가격 / 통화
  • 추가 이미지 URL 목록
  • product type
  • size / color / gender / age group

Embedding 텍스트 후보

우선 텍스트 embedding에는 검색 품질에 직접 도움이 되는 필드만 넣는다.

  • 상품명
  • brand
  • 정규화된 category
  • long description (중복 제거 후 1회만 사용)
  • 필요 시 color / gender 등 짧은 속성

다음 값들은 embedding 텍스트에 넣지 않고 DB 메타데이터/필터/조인용으로 보관한다.

  • SKU / 외부 ID
  • affiliate URL
  • 상품 URL
  • 이미지 URL
  • 가격
  • tracking URL

구현 범위 초안

  • operation DB에 affiliate item catalog 스키마 설계
  • raw SFTP feed staging 테이블이 필요한지 결정
  • Rakuten SFTP 접속 정보/env/secret 계약 정의
  • SFTP에서 .txt feed 파일을 내려받는 흐름 구현
  • Rakuten feed row 파싱 및 validation 구현
  • Antonioli/Rakuten 필드를 decoded canonical catalog 필드로 정규화
  • merchant + external_item_id 기준 idempotent upsert 구현
  • sync run 기록, 성공/실패 row 수, 에러 샘플, 마지막 성공 시각 추적
  • embedding source text 생성 함수 구현
  • 초기 약 12,000개 상품 embedding backfill 배치 구현
  • 필요 시 catalog item vector index/RPC/query path 설계
  • parser / normalization / idempotent upsert 테스트 추가
  • 초기 import 및 주기적 sync 운영 runbook 작성

열려 있는 질문

  • raw feed row를 assets DB에 먼저 저장한 뒤 operation DB로 승격할지, 아니면 operation DB에 바로 normalized row를 적재할지?
  • item embedding을 catalog table의 전용 vector 컬럼으로 둘지, generic embeddings 테이블의 entity_type으로 확장할지?
  • 첫 retrieval 대상은 Cody outfit matching인지, 기존 solution 유사도 검색인지, 새로운 visual search flow인지?
  • MVP에서 텍스트 embedding만 할지, 대표 상품 이미지 embedding도 같이 할지?
  • Rakuten SFTP feed의 실제 갱신 주기와 파일 naming convention은 무엇인지?
  • 품절 상품은 검색 대상에서 제외할지, DB에는 유지하되 필터링할지?
  • category는 Rakuten/Antonioli 원문을 그대로 둘지, decoded 내부 category taxonomy로 매핑할지?

Acceptance Criteria

  • Rakuten SFTP feed를 내려받아 로컬 또는 worker에서 파싱할 수 있다.
  • Antonioli 상품 row가 중복 없이 catalog DB에 upsert된다.
  • 실패 row와 실패 사유를 디버깅 가능한 형태로 확인할 수 있다.
  • embedding source text 생성 로직이 deterministic하고 테스트로 보호된다.
  • 초기 약 12,000개 상품에 대한 batch embedding/backfill 경로가 있다.
  • 초기 import와 이후 sync를 어떻게 실행/검증하는지 문서화되어 있다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions