EmbeddingService
로 OpenAI 임베딩 생성(캐시 + 429 재시도 + dummy 모드 지원)ProductVectorService
가 상품 텍스트를 벡터화 → Qdrant 컬렉션 보증 → 업서트ProductCreatedEvent
) 발행 → (향후) 비동기 인덱싱으로 전환 예정문자열 매칭만으로는 “무드등 vs 분위기 조명” 같은 의미적 유사를 잡기 어렵다. 추천 품질을 높이기 위해 임베딩 + 벡터 검색을 도입.
1차 목표는 간단하고 확실하게 E2E 파이프라인을 세우는 것: “상품 텍스트 → 임베딩 → Qdrant 업서트 → 검색 준비”.
sequenceDiagram
participant API/Service
participant Embedding as EmbeddingService
participant Qdrant as QdrantClient
participant Repo as CrawlingProductRepository
API/Service->>Repo: findById(productId)
Repo-->>API/Service: CrawlingProduct
API/Service->>API/Service: buildEmbeddingText(product)
API/Service->>Embedding: embed(text)
Embedding-->>API/Service: List<Float> (dim=1536)
API/Service->>Qdrant: ensureCollection(collection, dim, "Cosine")
API/Service->>Qdrant: upsertPoint(collection, pointId, vector, payload)
API/Service->>Repo: p.markEmbedding(pointId, model, true)
API/Service-->>API/Service: log done
dependencies {
implementation "org.springframework.boot:spring-boot-starter-webflux" // (Qdrant REST 구현 시)
implementation "org.springframework.boot:spring-boot-starter-validation"
// OpenAI Java
implementation 'com.openai:openai-java-spring-boot-starter:3.6.0'
}