가젯에서 Shopify 웹후크 에코 처리

Shopify 스토어 내의 데이터 업데이트에 대해 알아야 하는 Shopify 앱을 구축하는 경우 가장 빠르고 안정적인 방법은 웹후크를 통해 Shopify의 이벤트 스트림을 수신하는 것입니다. Webhook를 사용하면 (매우 낮은) Shopify API 속도 제한을 사용하지 않고 신속하게 모든 Shopify 스토어의 변경 사항을 찾을 수 있습니다.

웹후크 수신은 일반적으로 잘 작동하지만 많은 개발자가 웹후크를 실행한 후 직면하는 미묘한 문제인 에코가 있습니다. 애플리케이션이 Shopify의 변경 사항을 수신하고 Shopify를 변경하는 경우 다른 변경 사항과 마찬가지로 자신의 변경 사항에 대한 알림을 받게 됩니다! 이것은 모든 종류의 놀라움을 유발할 수 있습니다.

제품 설명이 변경되면 Shopify에서 자동으로 제품에 태그를 적용하는 예제 애플리케이션을 상상해 보십시오. 간단하게 하기 위해 이 애플리케이션이 Shopify에서 product/createproduct/update 웹후크를 수신하고 둘 중 하나가 도착하면 제품 설명에서 3개의 문자열 태그를 추출한다고 가정해 보겠습니다. 그런 다음 API 콜백을 Shopify로 보내 제품의 태그를 업데이트합니다.

module.exports = async ({ record, connections }) => {
    let newTags = extractTags(record.body).slice(0, 3);
    const shopifyAPI =  connections.shopify.current;
    await shopifyAPI.product.update(record.id, { tags: finalTags.join(",") });
  }
};


이렇게 하면 첫 번째 업데이트에 대한 응답으로 새 태그를 설정하기 위해 두 번째 제품 업데이트가 실행됩니다. Shopify는 이 업데이트를 다른 업데이트와 동일하게 취급하고 애플리케이션을 포함한 모든 리스너에게 웹후크를 보냅니다. 따라서 변경 사항의 결과로 두 번째product/update 웹후크를 받게 됩니다.



이 두 번째 웹후크는 업데이트된 제품 정보를 자체 데이터베이스에 기록하려는 경우에 유용하지만 실수로 태깅 비즈니스 로직을 다시 트리거하도록 허용하기 쉽습니다. 이것은 무한 루프를 생성하는 버그입니다. 항상 product/updated 웹후크에서 제품을 업데이트하면 해당 업데이트에서 항상 다른 웹후크를 가져와 주기를 계속해서 다시 트리거하게 됩니다.



웹후크 에코에 대한 솔루션



웹후크 에코로 인해 생성된 무한 루프를 방지하려면 업스트림 레코드에서 관심 있는 특정 변경 사항에만 반응하도록 애플리케이션에 몇 가지 논리를 추가해야 합니다. 그러면 반복해서가 아니라 한두 번만 업데이트할 수 있습니다. 이를 수행하는 가장 쉬운 방법은 프레임워크의 변경 보고 기능(때로 더티 추적이라고도 함)을 사용하는 것입니다. Gadgetrecord 개체에는 변경 추적 기능이 내장되어 있으므로 들어오는 웹후크의 결과로 어떤 필드가 변경되었는지 레코드에 물어보고 관심 있는 필드가 변경된 경우에만 중요한 로직을 실행할 수 있습니다.

제품 태거의 경우 설명이 변경될 때만 제품의 태그를 업데이트하면 됩니다. 태그가 변경될 때 명시적으로 태그를 업데이트할 필요가 없습니다. 따라서 record.changed API를 사용하여 설명이 변경되었는지 묻고 다음과 같은 경우에만 API 업데이트를 실행할 수 있습니다.

module.exports = async ({ record, connections }) => {
  // check to see if the product’s description has changed, and only run the update if it has
   if (record.changed(“body”)) { 
      let newTags = extractTags(record.body).slice(0, 3);
      const shopifyAPI =  connections.shopify.current;
      await shopifyAPI.product.update(record.id, { tags: finalTags.join(",") });
   } 
   // otherwise, do nothing
  }
};



이 변경 감지는 주기를 중단하고 두 번째 웹후크가 도착할 때 후속 업데이트가 이루어지지 않도록 합니다. Gadget 이외의 시스템도 변경 감지를 지원합니다. Rails는 이를 더티 트래킹(dirty tracking)이라고 부르며 바로 내장되어 있고 이를 위한 django egg가 있으며 대부분의 다른 ORM에는 필요한 경우 직접 구현할 수 있는 후크가 있습니다.

가젯에 내장된 record.changed API를 사용하여 Shopify 앱 개발자는 웹후크 에코로 인한 문제를 신속하게 피하고 애플리케이션의 비즈니스 논리에 집중할 수 있습니다.


그것을 끝까지 만들었습니까? 도움이 되었기를 바랍니다! 생각이나 질문이 있으면 언제든지 연락하거나 Gadget.dev에서 Gadget을 무료로 사용해 보십시오.

좋은 웹페이지 즐겨찾기