현행 → 신규 이관 검증

현행 WooCommerce 데이터를 신규 구조로 옮겼을 때 가격·구조·평점·URL이 동일한지 표본 5개 상품으로 대조합니다.

검증 방법
  1. 현행 원본 열기 → 귀사 복제본(lob.ktelab.com)에서 같은 상품·옵션의 가격 확인
  2. 아래 ‘현행’ 값과 대조 - 가격 줄마다 붙은 현행 변형 ID로 귀사 DB에서 그대로 추적
  3. ‘불일치만 보기’로 차이가 있는지 선별
수치는 etl/scripts/emit-parity-snapshot.mjs 로 귀사 데이터에서 재생성 가능(멱등).

구조 변경 대조 - 현행 → 신규

각 데이터가 현행 WooCommerce에서 어떤 구조였고, 신규 PostgreSQL로 어떻게 바뀌었는지(쿼리·효과·증거).

상품 옵션 축핵심

✓ 현행 옵션 축·항목 → 신규 1:1
현행 · WooCommerce
wp_postmeta._kte_attributes
PHP 직렬화 blob 1행에 전 옵션이 뭉쳐 있음(조회·수정 불가)
→
신규 · PostgreSQL
option_groups + option_items
축/항목을 정규화 2테이블로. role·id·name 분리
변경 직렬화 blob → 정규화(축/항목) · 효과 id/name 분리로 "이름 바꿔도 로직 안 깨짐", 조회·집계 가능
쿼리 비교 보기
현행 추출
SELECT meta_value
FROM wp_postmeta
WHERE post_id = 6288
  AND meta_key = '_kte_attributes';
-- → a:12:{s:4:"Date";a:...}  (역직렬화 필요)
신규 조회
SELECT id, name, role, input_type
FROM option_groups WHERE product_id = $1;

SELECT id, name FROM option_items
WHERE option_group_id = $1;

가격(옵션 조합)핵심

✓ 변형 11건 1:1 · 단가 패리티 150/150 (전상품)
현행 · WooCommerce
wp_posts(kte_variation) + wp_postmeta
조합(변형)마다 포스트 1개 + attribute_*·_price 메타 수동 생성
→
신규 · PostgreSQL
price_rules (selector jsonb, sell_price)
조합을 selector 데이터로. 우선순위 결정적
변경 변형 포스트 수동생성 → 조합을 selector로 데이터화 · 효과 수동 곱연산(탭 3~40개) 제거, 조합 자동생성 가능
쿼리 비교 보기
현행 추출
SELECT ID FROM wp_posts
WHERE post_parent = 6288 AND post_type = 'kte_variation';

SELECT meta_key, meta_value FROM wp_postmeta
WHERE post_id = <변형ID>;  -- attribute_*, _price
신규 조회
SELECT selector, sell_price, currency, priority
FROM price_rules WHERE product_id = $1;

옵션 검증(허용/차단)

✓ 검증 15·31·18건 등 1:1
현행 · WooCommerce
wp_postmeta._kte_validations
직렬화 white/black 규칙
→
신규 · PostgreSQL
option_validations (kind, selector)
black>white 의미 보존
변경 직렬화 → 테이블(kind=positive/negative) · 효과 "애니옵션 + 하나만 콕 제외"(블랙>화이트) 그대로 유지
쿼리 비교 보기
현행 추출
SELECT meta_value FROM wp_postmeta
WHERE post_id = 6288 AND meta_key = '_kte_validations';
신규 조회
SELECT kind, selector FROM option_validations
WHERE product_id = $1;

주문 (옵션 스냅샷)핵심

✓ 주문 48·항목 129 금액 불일치 0 · 상품연결 끊긴 86건도 스냅샷 유지
현행 · WooCommerce
wp_wc_orders(HPOS) + wp_woocommerce_order_items
HPOS 주문 + 아이템/아이템메타
→
신규 · PostgreSQL
orders + order_items(option_path jsonb)
주문 시점 옵션·가격을 통째 스냅샷
변경 아이템메타 → 정규화 + 옵션 스냅샷(jsonb) · 효과 ★ 상품 옵션을 바꾸거나 삭제해도 과거 주문 내용 불변(값·가격 동결)
쿼리 비교 보기
현행 추출
SELECT id, total_amount, status FROM wp_wc_orders WHERE id = ?;
SELECT * FROM wp_woocommerce_order_items
WHERE order_id = ? AND order_item_type IN ('line_item','fee');
신규 조회
SELECT option_path, sell_price_snapshot, travel_date
FROM order_items WHERE order_id = $1;
-- option_path: {"Car Type":"Limo Van","Date":"2019-09-27",...}

리뷰

✓ 리뷰 126건 · WC 집계(★4.91 등)와 일치
현행 · WooCommerce
wp_comments + wp_commentmeta
댓글·리뷰 공용 테이블, 평점은 메타로 분리
→
신규 · PostgreSQL
reviews (rating 내장)
전용 테이블, 평점 컬럼
변경 공용 댓글테이블 혼재 → 전용 reviews · 효과 리뷰·댓글 분리, 평점 집계 쿼리 가능
쿼리 비교 보기
현행 추출
SELECT c.comment_content, cm.meta_value AS rating
FROM wp_comments c
LEFT JOIN wp_commentmeta cm ON cm.comment_id = c.comment_ID AND cm.meta_key = 'rating'
WHERE c.comment_post_ID = 6288
  AND c.comment_type IN ('review','comment')
  AND c.comment_approved = 1 AND c.comment_parent = 0;
신규 조회
SELECT rating, body, verified, created_at
FROM reviews WHERE product_id = $1 AND status = 'approved';

회원 · 포인트

✓ 회원 34 · 포인트 적립일 126건 100% 보존(2016~2026)
현행 · WooCommerce
wp_users + wp_usermeta + 포인트 로그
잔액은 메타, 적립 이력은 별도
→
신규 · PostgreSQL
users + point_balances + point_transactions
잔액/내역 분리, 적립일 보존
변경 메타 잔액 → 잔액(정본) + 내역(적립일 포함) · 효과 "잔액만 이관 금지"(RFP) 충족 - 적립일 보존
쿼리 비교 보기
현행 추출
SELECT u.ID, u.user_email FROM wp_users u;
SELECT meta_value FROM wp_usermeta
WHERE user_id = ? AND meta_key LIKE '%points%';
신규 조회
SELECT balance FROM point_balances WHERE user_id = $1;
SELECT delta, reason_code, occurred_at
FROM point_transactions WHERE user_id = $1;

SEO 메타

✓ 5상품 메타 이관 · URL 5/5 보존
현행 · WooCommerce
wp_aioseo_posts
AIOSEO 플러그인 전용 테이블
→
신규 · PostgreSQL
seo_meta
표준 메타 테이블
변경 플러그인 종속 → 표준 seo_meta · 효과 플러그인 독립 + URL 보존(slug 동일)
쿼리 비교 보기
현행 추출
SELECT title, description, og_title
FROM wp_aioseo_posts WHERE post_id = 6288;
신규 조회
SELECT title, description, og_title, og_description
FROM seo_meta WHERE entity_type = 'product' AND entity_id = $1;

상품 이미지

✓ 대표+갤러리 33장 이관
현행 · WooCommerce
wp_postmeta._thumbnail_id → wp_posts(attachment)
대표=메타 id 참조, 갤러리=콤마 id 목록
→
신규 · PostgreSQL
product_media (cdn_url, role, sort)
구조화 미디어 테이블(대표/갤러리)
변경 메타 id 참조 → 구조화 미디어(역할·순서) · 효과 CDN 경로 보존, 대표/갤러리 구분
쿼리 비교 보기
현행 추출
SELECT meta_value FROM wp_postmeta
WHERE post_id = 6288 AND meta_key = '_thumbnail_id';
SELECT guid FROM wp_posts WHERE ID = <attId>;
신규 조회
SELECT cdn_url, role, sort FROM product_media
WHERE product_id = $1 ORDER BY sort;

상품 본문(섹션)

✓ 10섹션 이관 · 가격 숏코드 치환
현행 · WooCommerce
wp_postmeta._kte_extra_content_*
섹션마다 메타 키 + 숏코드 혼재
→
신규 · PostgreSQL
product_sections (key, body, visibility, sort)
섹션 테이블 + 노출/정렬 제어
변경 메타 키별 분산 → 섹션 테이블(visibility·sort) · 효과 관리자 비노출(admin_only) 제어, [kte_price] 숏코드 해석
쿼리 비교 보기
현행 추출
SELECT meta_key, meta_value FROM wp_postmeta
WHERE post_id = 6288 AND meta_key LIKE '_kte_extra_content_%';
신규 조회
SELECT key, label, body, visibility, sort
FROM product_sections WHERE product_id = $1 ORDER BY sort;

상품별 값 대조 - 결과 동일성

구조를 바꿔도 결과값이 현행과 같은지 표본 5개로 확인. 전체 단가 150/150 일치.

Hangang River Ferry Cruise (Night) - Sunset, Moonlight, Starlight Cruise
#14541
단가 대조
20/20
가격대
$12.60–$35.80
상세 대조 →
Around Seoul Tour - PRIVATE Car and Driver - Nami island, Paju DMZ and all around Seoul (Certified Tour Guide Option)
#6288
단가 대조
11/11
가격대
$11.00–$790.00
상세 대조 →
SKT Korea eSIM – Unlimited 4G LTE or 5G Data Plans
#261131
단가 대조
20/20
가격대
$2.80–$59.30
상세 대조 →
Korean Hanbok Rental Experience in Korea (Seoul, Jeonju)
#263151
단가 대조
43/43
가격대
$6.00–$98.00
상세 대조 →
(2025/2026) Vivaldi Park SONO Ski Resort - 3D2N Overnight Winter Tour Package - Ski, Snowboard, Snowy Land
#343780
단가 대조
56/56
가격대
$60.00–$604.00
상세 대조 →
검증 범위 - 조합 단가·구조 건수·평점·URL. 최종 결제가(수량·bulk·기간)·실시간 옵션 선택 흐름·어드민 등록/운영 화면은 본 데모에 포함되지 않습니다.