drawyourmind
Back to Works
Personal Project
2024.12 - 진행중

골드박스 투데이

쿠팡 골드박스 일일 특가 상품을 자동 수집하여 가격 히스토리, 역대 최저가 분석과 함께 보여주는 제휴 마케팅 플랫폼입니다. Puppeteer stealth 크롤링으로 매일 오전 7:05 상품을 수집하고, 와우회원가 비교와 쿠팡 기획전 큐레이션까지 제공합니다.

Next.js 16
React 19
TypeScript
Tailwind CSS v4
Supabase
Puppeteer
쿠팡 파트너스 SDK
골드박스 투데이

프로젝트 소개

쿠팡의 '골드박스'는 매일 오전 7시에 갱신되는 24시간 한정 초특가 딜입니다. 하지만 쿠팡 앱 내에서는 지난 딜 히스토리를 보거나 체계적으로 검색하기가 어려웠습니다. 골드박스 투데이는 이러한 불편함을 해결하기 위해 시작된 사이드 프로젝트입니다.

주요 기능

  • 실시간 상품 목록 — 매일 오전 7:05 자동 크롤링, 정렬/필터 지원
  • 상품 검색 + 자동완성gb_products 전체를 대상으로 title ILIKE 검색, 타이핑 디바운스 250ms 자동완성 드롭다운
  • 가격 인텔리전스 — 가격 변동 히스토리 차트, 역대 최저가 분석, 4단계 가격 평가(역대 최저가/근접/적정/비싼 편)
  • 와우회원가 비교 — 일반회원가 vs 와우회원가 동시 표시
  • 골드박스 등장 이력 — 동일 상품의 등장 횟수 및 날짜별 가격 비교
  • 스마트 뱃지 — TOP 딜, 인기 상품, 역대 최저가, 신규 자동 표시
  • 상품 상세 페이지 — 개별 상품 가격 차트, FAQ, 연관 상품 (ISR 5분)
  • 동일 상품 그룹핑 — 쿠팡이 같은 상품을 새 listing으로 재등록해도 제목 기준으로 병합, 가격 히스토리 연속성 유지
  • 쿠팡 기획전 (/events) — 어드민에서 수동 등록한 쿠팡 파트너스 기획전을 SEO/AEO 페이지(허브 + 상세 + 메인 스트립)로 노출
  • 라이트/다크 테마 토글 — CSS 변수 토큰 기반, 반응형 디자인

시스템 아키텍처

  1. 크롤링 (Data Collection)
    • Puppeteer + puppeteer-extra-plugin-stealth로 봇 탐지를 회피하며 매일 오전 7시 5분 쿠팡 골드박스 페이지를 크롤링합니다.
    • 쿠팡이 세션/실험군에 따라 레거시 페이지(DOM 스크래핑 + 가상 스크롤)와 MLP 페이지(상품 카드에 링크가 없어 Next.js RSC flight 데이터에서 JSON 추출) 중 하나를 내려주므로, 두 방식을 모두 구현하고 한쪽이 0개면 다른 쪽으로 교차 fallback합니다.
    • 쿠팡은 가상 스크롤로 화면 밖 요소를 제거하기 때문에, 스크롤하며 실시간으로 상품을 수집하고 Map으로 중복을 제거합니다.
    • MLP 페이지는 로그인 없이도 와우회원가를 포함하므로 2차 로그인 크롤링을 자동 생략합니다.
    • 로컬 맥의 launchd 스케줄러로 매일 7:05 KST에 자동 실행되며, caffeinate·pmset wake 스케줄로 슬립·뚜껑 닫힘에 대응합니다.
  2. 데이터베이스 (Storage)
    • 수집된 데이터는 Supabase (PostgreSQL + Storage)에 저장되며, 모든 테이블은 gb_ 프리픽스를 사용합니다.
    • gb_products는 현재 노출 상품, gb_product_prices는 가격 히스토리, gb_click_logs는 클릭 트래킹, gb_promotions는 기획전을 담당합니다.
    • link는 canonical 형식(트래킹 파라미터 제거)으로 저장해 재등록/중복을 방지합니다.
  3. 웹 애플리케이션 (Frontend)
    • Next.js 16 App Router 기반으로 SEO 최적화된 페이지를 제공합니다.
    • 상품 상세는 ISR 5분, 기획전 상세는 ISR 10분 재생성으로 검색엔진에 안정적인 HTML을 제공합니다.
    • /admin, /admin/events에서 날짜별 상품 관리·클릭 통계·기획전 수동 등록을 처리하며, 미들웨어가 ADMIN_SECRET으로 접근을 보호합니다.
  4. 제휴 링크 (Monetization)
    • 쿠팡 파트너스 SDK로 딥링크를 생성하고, /go/[id] 단축 링크 라우트에서 클릭을 트래킹한 뒤 쿠팡으로 리다이렉트합니다.
    • 기획전 CTA는 /go/event/[slug]로 분리해 별도 트래킹하며, 딥링크는 서버에서 fetch하지 않고 리다이렉트에만 사용합니다.

SEO / AI 검색 최적화

  • JSON-LD 스키마: WebSite, Organization, ItemList, Product, BreadcrumbList, FAQPage, Event(기획전)
  • 동적 사이트맵: 최근 30일 상품 + 기획전(진행 중은 높은 우선순위, 종료 후 14일 초과는 제외)을 차등 적용
  • AI 크롤러 허용: GPTBot, ChatGPT-User, Claude-Web, PerplexityBot 등을 robots.txt에 명시적으로 허용
  • llms.txt / llms-full.txt: 동적 라우트로 "진행 중인 쿠팡 기획전"을 실시간 반영하는 AI 검색 크롤러용 요약 제공
  • IndexNow: 새 상품·기획전 등록 시 검색엔진에 즉시 색인을 요청
  • 동적 OG 이미지: Edge Runtime에서 페이지별 OG 이미지 생성

배운 점

  • 크롤링 방어 우회: 쿠팡의 Bot 탐지 로직을 우회하기 위해 stealth 플러그인, 자연스러운 딜레이, 가상 스크롤 대응을 적용하면서 웹 크롤링/보안에 대한 이해도가 높아졌습니다. 쿠팡이 A/B로 내려주는 레거시·MLP 두 페이지를 모두 대응하면서, DOM 스크래핑이 막힌 페이지는 Next.js RSC flight 데이터에서 직접 JSON을 추출하는 방법도 익혔습니다.
  • Supabase 활용: BaaS(Backend as a Service)의 편리함과 RLS(Row Level Security) 설정의 중요성을 체감했습니다. 특히 어드민 Storage 업로드에는 service-role 클라이언트가 필수라는 점을 실전 디버깅으로 배웠습니다.
  • 데이터 정합성: 쿠팡이 같은 상품을 새 listing으로 재등록해 식별자가 모두 바뀌는 문제를 제목 기준 그룹핑으로 풀면서, 외부 유입 링크의 404 방지와 가격 히스토리 연속성을 함께 확보했습니다.
  • AI 검색 시대의 SEO: JSON-LD, llms.txt, IndexNow 등 전통 SEO를 넘어 AI 검색 크롤러를 고려한 콘텐츠 노출 전략을 실전에 적용해보았습니다.