Skip to content

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

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

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 로 읽히므로 파서가 완결되어 이 사이트들이 결정론적 경로로 내려간다.
  • 결정 포인트는 스코프였다. 가격만 고칠 것인가, 상품명의 출처를 바꾸는 ProductGroup 인식까지 함께 넣을 것인가.

Action

구현

  • OG 경로의 가격 해석에 구형 네임스페이스 폴백을 넣었다. 표준 태그(product:price:amount / product:price:currency)를 먼저 보고, 없을 때만 구형(og:price:amount / og:price:currency)을 본다.
  • 금액과 통화를 각각 폴백한다. 덕분에 통화 태그만 단독으로 있는 페이지를 "구조화 데이터 없음"이 아니라 "필수 필드 미달"로 가르는 기존 분류 규칙이 구형 네임스페이스에서도 그대로 유지된다.
  • 상품명 처리는 건드리지 않았다. OG 경로는 원래 og:title 을 쓴다. 이 PR 이 바꾸는 것은 가격 한 필드뿐이고, 이름의 출처는 ProductGroup 을 JSON-LD 경로에서 인식해 상품명을 정확하게 #53 에서 다룬다.

스코프 결정

ProductGroup 인식 추가는 이 PR 에서 하지 않고 후속 이슈 #53 으로 분리했다. 이 PR 이 고치는 것은 가격 한 필드이고, ProductGroup 은 상품명의 출처가 바뀌는 별개의 변경이기 때문이다.

이 PR 이 고른 것은 LLM 이 지어내는 이름과 og:title 사이였다. 컷아웃 부츠(JSON-LD 의 상품명)는 파서가 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 (#53 이후) 컷아웃 부츠 컷아웃 부츠
hasVariant 사이즈 5개 (컷아웃 부츠 - 250 등) 사이즈 5개
  • ProductGroup 을 JSON-LD 경로에서 인식해 상품명을 정확하게 #53 이 들어가면 이 사이트는 JSON-LD 에서 처리된다. 상품명이 컷아웃 부츠 가 되어 OG 까지 내려오지 않는다. 페이지 제목보다 상품명 필드가 정확하므로 그게 맞는 방향이다.
  • 그 뒤에도 이 PR 의 폴백은 남는다. JSON-LD 가 없거나 ProductGroup 도 아니면서 구형 가격 태그만 쓰는 사이트를 계속 커버한다. 다만 실측한 사이트가 PAF 하나뿐이라 그런 사이트가 실제로 얼마나 있는지는 아직 근거가 없다.
  • 두 변경은 충돌하지 않는다. 이 PR 은 OG 경로 안쪽만 고치고 소스 우선순위를 건드리지 않는다.

확인한 전제

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

Result

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

연관 이슈

- 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.

@m-a-king

Copy link
Copy Markdown
Collaborator Author

머지하지 않고 닫는다. 실측으로 이 폴백의 수혜자가 없다는 것이 확인됐다.

postarchivefaction.com 상품 90건 중 10건 표본 (2026-08-26, extractor 와 같은 Accept-Language 로 fetch):

확인 항목 결과
JSON-LD 최상위 타입 10/10 전부 ProductGroup
변형의 offers.price 10/10 존재 (변형 1개짜리 상품 포함)
og:price:amount 10/10 존재
표준 product:price:amount 10/10 없음

ProductGroup 을 읽으면 이름과 가격이 모두 나오므로 #53 만으로 이 사이트가 완결된다. 그러면 JSON-LD 가 우선순위상 먼저 성공하므로 이 PR 의 og:price 폴백은 실행되지 않는 경로가 된다. 폴백이 실제로 필요한 경우는 "JSON-LD 가 없거나 ProductGroup·Product 도 아니면서 og:price 만 쓰는 페이지"인데, 아직 그런 사이트를 실측한 적이 없다.

더 중요한 것은 이 PR 이 상품명을 og:title 에서 가져오게 만든다는 점이다. 그건 파서가 ProductGroup 을 못 읽어 OG 로 흘러내린 결과지 의도한 선택이 아니었다. og:title 은 페이지 제목이고, 사이트가 상품명 필드에 선언한 이름은 컷아웃 부츠 다. 후자가 정확하다.

작업은 #53 에서 이어간다. 여기서 확인한 실측·근거는 그쪽 본문에 옮겨두었다.

@m-a-king m-a-king closed this Aug 26, 2026
@m-a-king
m-a-king deleted the fix/51-og-price-fallback branch August 26, 2026 05:34
m-a-king added a commit that referenced this pull request Aug 26, 2026
- Shopify 계열은 최상위가 ProductGroup 이고 실제 Product 는 hasVariant 안에 있어 노드 수집이 전부 미스했다. OG 경로도 표준 가격 태그가 없어 함께 미스해 매 요청이 LLM 으로 갔고, 비결정적이라 같은 사이트의 상품명이 요청마다 갈렸다
- 처음엔 OG 경로에 og:price 폴백을 넣어 푸는 방향으로 갔으나(#51, PR #52) 그 경로는 상품명을 og:title 즉 페이지 제목에서 가져온다. 사이트가 상품명 필드에 선언한 이름은 "컷아웃 부츠" 이고 그쪽이 정확해, JSON-LD 를 고치는 방향으로 전환하고 폴백은 폐기했다
- 변형을 상품 노드로 수집하지 않고 그룹 노드만 수집한다. 변형 이름에는 사이즈가 붙어 있어(컷아웃 부츠 - 250) 상품명으로 쓸 수 없다. 대신 그룹에 없는 가격·이미지만 첫 변형에서 보강한다 - 실측한 페이지의 ProductGroup 에는 offers 도 image 도 없었다
- 저장해둔 실제 페이지로 전후를 확인했다. 수정 전 MISSING_FIELD, 수정 후 컷아웃 부츠 / 800,000 KRW / https 이미지
m-a-king added a commit that referenced this pull request Aug 26, 2026
- Shopify 계열은 최상위가 ProductGroup 이고 실제 Product 는 hasVariant 안에 있어 노드 수집이 전부 미스했다. OG 경로도 표준 가격 태그가 없어 함께 미스해 매 요청이 LLM 으로 갔고, 비결정적이라 같은 사이트의 상품명이 요청마다 갈렸다
- 처음엔 OG 경로에 og:price 폴백을 넣어 푸는 방향으로 갔으나(#51, PR #52) 그 경로는 상품명을 og:title 즉 페이지 제목에서 가져온다. 사이트가 상품명 필드에 선언한 이름은 "컷아웃 부츠" 이고 그쪽이 정확해, JSON-LD 를 고치는 방향으로 전환하고 폴백은 폐기했다
- 변형을 상품 노드로 수집하지 않고 그룹 노드만 수집한다. 변형 이름에는 사이즈가 붙어 있어(컷아웃 부츠 - 250) 상품명으로 쓸 수 없다. 대신 그룹에 없는 가격·이미지만 첫 변형에서 보강한다 - 실측한 페이지의 ProductGroup 에는 offers 도 image 도 없었다
- 저장해둔 실제 페이지로 전후를 확인했다. 수정 전 MISSING_FIELD, 수정 후 컷아웃 부츠 / 800,000 KRW / https 이미지
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