Skip to content

OG 가격 폴백으로 Shopify 계열 상품 페이지를 파서로 처리 - #52

Open
m-a-king wants to merge 1 commit into
mainfrom
fix/51-og-price-fallback
Open

OG 가격 폴백으로 Shopify 계열 상품 페이지를 파서로 처리#52
m-a-king wants to merge 1 commit into
mainfrom
fix/51-og-price-fallback

Conversation

@m-a-king

@m-a-king m-a-king commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Situation

  • 어떤 상품 페이지는 이름과 이미지는 파서가 읽는데 가격만 못 읽어 매 요청이 LLM 으로 넘어갔다. 표준 가격 태그 대신 구형 이름을 쓰는 몰(Shopify 계열)이기 때문이다.
  • JSON-LD 경로도 함께 미스한다. 최상위 노드가 ProductGroup 이라 Product 매칭에 안 걸리고, 실제 Product 는 hasVariant 배열 안에 있는데 파서가 그 키를 재귀하지 않는다.
  • 두 경로가 다 미스하니 전부 Gemini fallback 으로 갔고, LLM 은 비결정적이라 같은 사이트의 상품명이 요청마다 갈렸다. prod 실측(토너먼트 1350, postarchivefaction.com 20건)은 전부 SERVER_LLM 이었고 이름이 세 갈래로 나왔다.
관측된 이름 예시 문제
og:title 을 그대로 베낀 영어 Stream Pants (Archive) - Charcoal 원본과 일치하지만 우연히 그렇게 나온 것
한글 상품명에 LLM 이 번역한 색상을 붙인 것 러너 자켓 (Archive) 차콜 차콜·스노우 블랙 은 페이지에 없는 값 (본문 검색 0건)
본문 DOM 의 개행이 이름에 박힌 것 러너 자켓 (Archive)\n \n 차콜 마크업 공백이 상품명으로 유입

Task

  • 가격 한 필드만 채우면 이름은 이미 og:title 로 읽히므로 파서가 완결되어 이 사이트들이 결정론적 경로로 내려간다.
  • 결정 포인트는 스코프였다. OG 가격만 볼 것인가, JSON-LD 의 ProductGroup 인식까지 함께 넣을 것인가.

Action

구현

  • OG 경로의 가격 해석에 구형 네임스페이스 폴백을 넣었다. 표준 태그(product:price:amount / product:price:currency)를 먼저 보고, 없을 때만 구형(og:price:amount / og:price:currency)을 본다.
  • 금액과 통화를 각각 폴백한다. 덕분에 통화 태그만 단독으로 있는 페이지를 "구조화 데이터 없음"이 아니라 "필수 필드 미달"로 가르는 기존 분류 규칙이 구형 네임스페이스에서도 그대로 유지된다.
  • 상품명은 og:title 을 그대로 쓴다. 색상이 이름에 포함돼 있어(Cut Out Boots (2026) - Black) 같은 상품의 다른 색상이 한 토너먼트에 올라와도 구분된다. 실제로 토너먼트 1350 에 - Black- Beige 가 함께 올라와 있다.

스코프 결정

ProductGroup 인식 추가는 이 PR 에서 하지 않고 후속 이슈 #53 으로 분리했다. 이 PR 이 고치는 것은 가격 한 필드이고, ProductGroup 은 "상품명의 출처를 무엇으로 볼 것인가"라는 별개의 판단이기 때문이다.

같은 부츠의 두 색상을 실측한 결과 (2026-08-25, extractor 와 같은 Accept-Language 로 fetch):

f26-cut-out-boots-black f26-cut-out-boots-beige
og:title Cut Out Boots (2026) - Black Cut Out Boots (2026) - Beige
ProductGroup.name 컷아웃 부츠 컷아웃 부츠
hasVariant 사이즈 5개 (컷아웃 부츠 - 250 등) 사이즈 5개
  • 색상은 JSON-LD 어디에도 없다. 그룹·변형 어느 노드에도 color 키가 없고, 색상은 Shopify 상품 자체가 갈려 URL 로만 구분된다. hasVariant 는 색상이 아니라 신발 사이즈다.
  • 그래서 ProductGroup 을 JSON-LD 경로 첫 자리에 넣으면 이름이 회귀한다. JSON-LD 가 성공하면 OG 를 아예 보지 않으므로 두 색상이 모두 컷아웃 부츠 가 되고, 변형까지 재귀하면 두 색상이 모두 컷아웃 부츠 - 250 이 되어 사이즈가 상품명에 박힌다. 토너먼트는 항목을 이름으로 구분하는데 1350 에 이 두 색상이 함께 올라와 있다.
  • 후속 이슈의 방향은 "OG 다음 세 번째 폴백"이다. 그 자리에 두면 OG 가 성공하는 사이트의 이름은 그대로 두고, OG 조차 실패하는 사이트만 건진다. 회귀 없이 커버리지만 는다. 이 PR 은 그 순서를 전혀 건드리지 않는다.

확인한 전제

  • 통화 회귀 없음: extractor 가 보내는 Accept-Language 헤더로 fetch 하면 가격이 680,000 KRW 로 정상 수신된다. 헤더가 없으면 같은 페이지가 84,100 JPY 를 내주므로, 현재 헤더 설정에서만 성립하는 전제다.
  • 콤마 추가 처리 불필요: 구형 태그의 금액은 천단위 콤마를 포함하지만(680,000), 기존 가격 정규화가 이미 콤마를 제거한다.
  • 우선순위 회귀 없음: 대상 사이트에는 표준 가격 태그가 아예 없다. 표준을 먼저 보는 순서가 기존 사이트의 동작을 바꾸지 않는다.

Result

  • 대상 사이트가 LLM 없이 파서로 처리되어 상품명이 요청마다 갈리지 않는다. 그만큼 Gemini 호출도 준다.
  • 단위 테스트 2건(구형 태그 단독 추출, 표준 우선 회귀 가드)을 추가했다. 이 중 구형 태그 테스트는 본 수정을 임시로 되돌리면 실제로 FAIL 하는 것까지 확인해, 무의미하게 통과하는 테스트가 아님을 negative control 로 확정했다.
  • 남은 것: 최상위가 ProductGroup 인 JSON-LD 는 여전히 미스한다. 이 PR 은 OG 경로로만 해결하므로, 구형 OG 태그가 없으면서 ProductGroup 만 쓰는 사이트는 계속 LLM 으로 간다. 후속 이슈 ProductGroup 을 OG 다음 폴백으로 인식해 파서 커버리지 확장 #53 에서 OG 다음 폴백으로 다룬다.

연관 이슈

- Shopify 계열은 표준 product:price:* 대신 구형 og:price:* 만 내보내 OG 경로가 가격을 놓쳤고, 최상위 노드가 ProductGroup 이라 JSON-LD 경로도 함께 미스했다. 두 경로가 다 미스해 매 요청이 Gemini fallback 으로 가면서 같은 사이트의 상품명이 요청마다 갈렸다 (prod 토너먼트 1350 의 20건 전부 SERVER_LLM)
- 표준 태그를 먼저 보고 없을 때만 구형으로 폴백한다. amount 와 currency 를 각각 폴백해, 통화 태그만 단독으로 있는 페이지를 no_data 아닌 missing_field 로 가르는 기존 규칙이 구형 네임스페이스에서도 유지된다
- JSON-LD 의 ProductGroup 인식 추가는 택하지 않았다 - 지원하면 JSON-LD 가 우선순위상 먼저 이겨 이름이 색상 없는 한글로 바뀌고, 같은 상품의 다른 색상이 한 토너먼트에 올라왔을 때 구분이 사라진다
- og:price:amount 의 천단위 콤마는 기존 PRICE_NOISE 가 이미 제거해 추가 처리를 넣지 않았다. 통화는 extractor 가 보내는 Accept-Language 헤더로 KRW 가 정상 수신되는 것을 실측해 회귀 위험이 없음을 확인했다
@m-a-king m-a-king added the fix 외부 가시적 결함 수정 label Aug 25, 2026
@m-a-king m-a-king self-assigned this Aug 25, 2026
@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7d5aa915-f064-4ee9-a330-17e09cfa0db1


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fix 외부 가시적 결함 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

og:price 폴백 추가로 Shopify 계열 상품 페이지를 파서로 처리

1 participant