AI는 상품 목록 API, 검색창, 정렬 버튼을 빠르게 만들 수 있다. 그러나 어떤 상품을 보여주고, 어떤 상품을 숨기며, 무엇을 ‘추천’이라고 부를지는 코드가 아니라 운영 정책이다. 쇼핑몰 검색은 단순한 조회 기능이 아니라 매대 배치, 광고 지면, 재고 처리, 고객 경험, 데이터 수집이 한곳에 결합된 의사결정 시스템이다.
정책을 주지 않은 채 “상품 검색 기능을 만들어 줘”라고만 지시하면 AI는 최신 등록순, 상품명 부분 일치, 단순 페이지네이션 같은 익숙한 예시를 임의로 채울 수 있다. 코드는 실행되더라도 매장 운영에는 맞지 않을 수 있다. 최신 상품이 품절인데도 첫 줄에 노출되고, 판매 종료 상품이 장바구니에 담기며, 고객이 “사과”를 검색해도 “청송 부사”를 찾지 못하는 문제가 대표적이다.
검색 순위는 기술 기능이 아니라 운영 정책이다
상품 진열 순서는 사업자가 설계할 수 있다. 다만 화면이 소비자에게 전달하는 의미와 실제 순위 산정 방식이 어긋나거나, 경제적 이해관계가 있는 노출을 일반 추천처럼 보이게 하면 법적·신뢰상 위험이 커진다.
공정거래위원회는 2024년 6월 쿠팡과 CPLB의 검색순위 운영 및 임직원 구매후기 작성 등을 문제 삼아 잠정 1,400억 원의 과징금을 발표했고, 같은 해 8월 의결서 기준 과징금은 1,628억 원으로 정해졌다. 사업자 측은 처분에 불복했으며, 2026년 4월 보도 기준 관련 취소소송은 계속 중이었다. 이 사례의 실무적 교훈은 “자사 상품 우대는 언제나 불법”이라는 단순 명제가 아니다. 추천이라는 표시가 무엇을 뜻하는지, 광고·자사 이해관계를 명확히 드러냈는지, 순위 변경을 데이터와 문서로 설명할 수 있는지를 설계 단계에서 검토해야 한다는 점이다.
법률 적용은 서비스 구조와 표시 방식에 따라 달라질 수 있으므로 실제 출시 전에는 관련 법령과 최신 집행 사례를 별도로 확인하는 것이 안전하다.
한 줄 프롬프트가 만드는 ‘뚝딱 버전’의 실패 지점
| 미정인 정책 | AI가 임의로 채울 수 있는 구현 | 실제 운영 위험 |
|---|---|---|
| 기본 정렬 | created_at DESC |
최근 등록한 품절·검수 전 상품이 상단에 노출 |
| 판매 상태 | 삭제 여부만 확인 | 판매 중지·리콜 상품이 검색되거나 주문 가능 |
| 목록 로딩 | 전체 조회 또는 단순 무한 스크롤 | 느린 응답, 뒤로 가기 시 위치 상실, 비교 어려움 |
| 검색 범위 | 상품명만 부분 일치 | 브랜드·품종·모델명·동의어 검색 실패 |
| 결과 없음 | 빈 배열만 반환 | 구매 의도가 높은 고객이 즉시 이탈 |
| 로그 | 검색어와 회원·IP를 그대로 저장 | 목적 외 수집, 과도한 보관, 민감 검색어 노출 위험 |
AI는 요구사항의 빈칸을 메울 수 있지만, 그 선택이 매장의 전략과 법적 책임에 맞는지는 판단하지 못한다. 따라서 구현 전에 최소한 다음 다섯 가지 정책을 문서로 확정해야 한다.
1. 정렬 기본값: 무엇을 ‘추천순’이라고 부를 것인가
기본 정렬은 고객이 가장 먼저 보는 진열대다. 다수의 사용자는 정렬 옵션을 바꾸지 않으므로 기본값은 매출, 재고 소진, 신상품 육성, 고객 만족도에 직접 영향을 준다.
먼저 순위 산정 단계를 분리한다
검색 결과는 한 번에 섞어 계산하기보다 다음 순서로 나누는 것이 안전하다.
- 노출 자격 판정: 판매 가능, 공개 가능, 법적·운영상 차단 대상이 아닌 상품만 후보에 포함한다.
- 검색 관련도 계산: 상품명, 브랜드, 카테고리, 속성, 동의어가 검색어와 얼마나 맞는지 계산한다.
- 유기적 순위 계산: 판매 속도, 전환율, 평점 신뢰도, 배송 품질 같은 신호를 결합한다.
- 비즈니스 규칙 적용: 품절 감점, 신상품 탐색 기회, 다양성 제한 등을 적용한다.
- 광고 슬롯 결합: 광고 상품은 유기적 순위와 분리해 삽입하고 명확히 표시한다.
-
안정적 동률 처리: 같은 점수일 때
product_id같은 고정 키로 순서를 결정한다.
추천 점수는 문서화된 공식이어야 한다
다음은 구조를 설명하기 위한 예시일 뿐, 모든 쇼핑몰에 맞는 정답은 아니다.
organic_score =
0.45 × query_relevance
+ 0.20 × conversion_rate_28d
+ 0.15 × sales_velocity_14d
+ 0.10 × rating_confidence
+ 0.10 × fulfillment_quality
각 신호는 동일한 범위로 정규화하고, 기간과 집계 대상을 명시해야 한다. 단순 평균 별점은 리뷰 1개의 5점 상품을 리뷰 1,000개의 4.8점 상품보다 높게 만들 수 있으므로 리뷰 수를 함께 반영한 보정 점수를 쓰는 편이 낫다. 판매량만 쓰면 오래 팔린 상품이 영구적으로 유리해질 수 있으므로 최근 기간의 판매 속도와 전환율을 함께 본다.
반드시 정해야 할 세부 항목
- 추천순의 목표가 검색 적합도, 구매 가능성, 고객 만족, 재고 효율 중 무엇인지
- 각 신호의 집계 기간과 갱신 주기
- 취소율, 반품률, 배송 지연, 품절 가능성 같은 감점 신호
- 리뷰가 적은 신상품에 줄 탐색 기회와 최대 가산점
- 동일 브랜드나 동일 판매자가 상단을 과도하게 점유하지 않도록 할 다양성 규칙
- 점수 동률 시 사용할 고정 정렬 키
- 순위 공식의 버전, 변경 사유, 적용 시각, 승인자를 남기는 감사 기록
- A/B 테스트의 성공 지표와 중단 조건
광고와 유기적 추천을 섞지 않는다
광고비, 자사 상품 여부, 높은 마진 같은 경제적 이해관계를 반영할 수는 있지만, 이를 일반적인 “인기순”이나 “추천순”으로 오인하게 만들면 위험하다. 공정거래위원회는 2025년 고가 상품 판매 플랫폼 사건에서도 유료 옵션을 구매한 판매자의 상품이 기본 정렬에서 우선 노출되는 구조와 관련 표시를 문제 삼았다. 광고 상품은 별도 후보군과 슬롯으로 관리하고, 카드 단위에서 식별 가능한 “광고” 또는 “스폰서” 표시를 제공하는 것이 기본이다. 관리자 화면에는 광고 노출 규칙과 유기적 순위 공식을 분리해 보여줘야 한다.
2. 비정상 상태 상품: 품절과 판매 중지는 다른 상태다
is_sold_out 하나로 모든 예외를 처리하면 검색, 상세, 장바구니, 주문 검증이 서로 어긋난다. 최소한 판매 상태, 재고 상태, 공개 상태, 규제 상태를 분리해야 한다.
권장 상태 모델
| 상태 | 검색·목록 | 직접 URL 상세 | 장바구니·주문 | 권장 처리 |
|---|---|---|---|---|
| 판매 중·재고 있음 | 정상 노출 | 정상 표시 | 가능 | 기본 후보 |
| 판매 중·일시 품절 | 표시 가능하되 감점 또는 후순위 | 품절·재입고 알림 표시 | 불가 | 재입고 가능성을 보존 |
| 일시 판매 중지 | 기본적으로 숨김 | 일시 중지 안내 | 불가 | 재개 시 복원 |
| 판매 종료 | 검색·카테고리에서 숨김 | 종료 안내와 대체 상품 | 불가 | 기존 링크와 CS 맥락 보존 |
| 초안·검수 중 | 완전 숨김 | 권한 있는 관리자만 | 불가 | 공개 전 검수 |
| 리콜·법적 차단 | 완전 숨김 | 필요 시 안전 공지 | 불가 | 대체 추천보다 안전 안내 우선 |
품절 상품은 재입고 알림과 검색 수요 파악에 가치가 있으므로 무조건 삭제할 필요가 없다. 반면 판매 종료 상품은 일반 목록에서 제외하되, 기존 북마크나 외부 링크로 들어온 고객에게 “판매가 종료되었습니다”라는 설명과 유사 상품을 제공할 수 있다. 상세 URL을 유지할지 410 Gone으로 종료할지는 검색 유입, 법적 공지 필요성, 대체 콘텐츠 가치에 따라 결정한다.
검색 인덱스는 주문 가능 여부의 최종 권한이 아니다
검색 인덱스는 동기화 지연이 생길 수 있다. 따라서 검색 결과에서 재고가 있다고 보여도 다음 단계에서 다시 검증해야 한다.
- 장바구니 담기 시 판매 상태와 재고 재검증
- 주문서 진입 시 가격, 할인, 재고 재검증
- 결제 직전 재고 예약 또는 원자적 차감
- 판매 중지 이벤트 발생 시 검색 인덱스 긴급 제거
- 색인 지연 시간과 실패 건수를 모니터링
이 규칙이 없으면 검색 화면은 정상인데 결제 단계에서만 실패하는 CS 사고가 반복된다.
3. 목록 노출 방식: 페이지네이션, 더 보기, 무한 스크롤 중 무엇을 쓸 것인가
상품이 수천·수만 개라면 한 번에 모두 내려보내면 안 된다. 다만 “쇼핑몰은 언제나 숫자 페이지가 정답”이라고 단정하는 것도 정확하지 않다. 비교 중심 검색에서는 위치와 상태 복원이 중요하고, 카테고리 탐색에서는 “더 보기”가 편할 수 있다.
| 방식 | 강점 | 약점 | 잘 맞는 상황 |
|---|---|---|---|
| 숫자 페이지네이션 | 현재 위치와 결과 규모를 이해하기 쉬움, 특정 페이지 재방문 가능 | 페이지 전환이 끊기고 페이지 간 비교가 번거로움 | 데스크톱 검색, 깊은 탐색, 공유 가능한 결과 |
| 더 보기 | 기존 상품을 유지한 채 사용자가 로딩을 통제 | 결과가 매우 많으면 DOM과 메모리가 커짐 | 모바일·카테고리 탐색, 중간 규모 결과 |
| 무한 스크롤 | 연속 탐색이 자연스러움 | 위치·끝·전체 규모가 불명확하고 뒤로 가기 복원이 어려움 | 비교보다 발견이 중요한 피드형 화면 |
실무적으로는 검색 결과에는 페이지네이션 또는 “더 보기 + 복원 가능한 페이지 URL”, 발견형 추천 피드에는 무한 스크롤을 우선 검토할 수 있다. 순수 무한 스크롤을 쓰더라도 다음 조건을 충족해야 한다.
- 검색어, 정렬, 필터, 페이지 또는 커서를 URL이나 복원 가능한 상태에 저장
- 상세 페이지에서 뒤로 갔을 때 이전 상품과 스크롤 위치를 복원
- 키보드 탐색, 스크린리더, 포커스 이동을 지원
- 푸터와 주요 탐색 링크에 접근 가능한 대안 제공
- 로딩 실패와 재시도 UI 제공
- 각 결과 묶음에 접근 가능한 고유 URL 또는 링크 구조 마련
오프셋과 커서 페이지네이션
OFFSET 5000 LIMIT 40 같은 깊은 오프셋은 데이터가 많고 갱신이 잦을수록 느려지고 중복·누락이 생기기 쉽다. 얕은 페이지와 관리자 화면에는 오프셋이 단순하지만, 대규모 검색에는 마지막 결과의 정렬 키를 넘기는 커서 방식이 안정적이다.
ORDER BY score DESC, product_id DESC
cursor = last_score + last_product_id
점수만 커서로 쓰면 동률 상품이 빠질 수 있으므로 고유 키를 함께 사용한다. 추천 점수가 실시간으로 자주 바뀐다면 검색 세션 동안 스냅샷 버전이나 랭킹 기준 시각을 고정하는 정책도 필요하다.
4. 검색 범위와 결과 없음 화면: 고객의 표현을 상품 데이터에 연결한다
고객은 운영자가 등록한 정확한 상품명을 모른다. “사과”를 찾는 고객에게 “청송 부사”, “홍로”, “가정용 사과”를 보여주려면 상품 데이터와 검색 사전을 함께 설계해야 한다.
검색 필드 우선순위
| 필드 | 권장 우선순위 | 예시 |
|---|---|---|
| SKU·모델명·바코드 | 매우 높음 |
SM-S928N, 880...
|
| 상품명 | 높음 | 청송 부사 사과 3kg |
| 브랜드·제조사 | 높음 | Samsung, Apple |
| 카테고리·상품 유형 | 중간 이상 | 과일, 러닝화 |
| 핵심 속성 | 중간 이상 | 용량, 색상, 규격, 호환 기종 |
| 동의어·별칭·품종·태그 | 중간 이상 | 조깅화↔러닝화, 사과↔부사 |
| 상세 설명 | 낮음 | 긴 설명의 잡음을 줄이기 위해 낮은 가중치 |
| 리뷰 본문 | 선택적 | 품질·스팸·개인정보 검토 후 제한적으로 사용 |
한국어 검색에서는 띄어쓰기 차이, 자모 분리, 영문·한글 브랜드 표기, 숫자와 단위, 복합명사도 고려해야 한다. 예를 들어 “에어팟프로2”, “에어팟 프로 2”, “AirPods Pro 2”가 같은 상품군으로 연결되도록 정규화 규칙을 둔다.
권장 검색 파이프라인
- 입력 길이와 허용 문자를 검증한다.
- 대소문자, 공백, 특수문자, 단위를 정규화한다.
- 상품 코드와 정확 일치를 먼저 확인한다.
- 토큰화와 형태·철자 변형을 적용한다.
- 운영자가 관리하는 동의어와 카테고리 사전을 확장한다.
- 텍스트 검색으로 후보를 찾는다.
- 필요하면 의미 검색을 보조 후보 생성에 사용한다.
- 판매·공개·규제 상태를 필터링한다.
- 유기적 점수를 계산하고 광고를 별도로 결합한다.
- 결과와 진단 정보를 반환한다.
생성형 AI나 벡터 검색을 도입하더라도 SKU, 브랜드, 모델명 같은 정확 일치를 약화시키면 안 된다. 쇼핑 검색에서는 정확 검색 + 텍스트 관련도 + 선택적 의미 검색을 결합한 하이브리드 방식이 일반적으로 안전하다. AI가 카탈로그에 없는 상품, 가격, 재고를 만들어 말하지 않도록 모든 응답을 실제 상품 ID와 현재 데이터에 연결해야 한다.
결과 없음 화면은 두 번째 진열대다
검색 결과가 없을 때 빈 화면만 보여주지 않는다. 다만 관련 없는 인기 상품을 검색 결과인 것처럼 섞어서도 안 된다.
권장 구성은 다음과 같다.
- 사용자가 입력한 검색어를 그대로 보여주고 일치 상품이 없음을 명확히 안내
- 오타 교정 후보와 동의어 제안
- 필터 때문에 0건이 된 경우 제거 가능한 필터 안내
- 범위를 넓힌 결과를 별도 라벨로 제시
- 관련 카테고리, 대체 상품, 전체 인기 상품을 구분해 노출
- 재입고·입점 요청 또는 고객센터 연결
- 결과 없는 검색 이벤트를 관리자 분석에 기록
“결과 없음”과 “필터 적용 후 없음”은 다른 문제다. 원래 후보는 있었지만 가격·색상 필터로 0건이 된 경우라면 필터 완화가 가장 유용하고, 카탈로그 자체에 상품이 없다면 소싱 데이터로 활용해야 한다.