데이터 및 계산된 상태

ACDL(Adobe 클라이언트 데이터 레이어)은 푸시하는 모든 데이터 개체를 계산된 상태​라는 단일 개체에 병합합니다. 모든 스크립트는 언제든지 getState()을(를) 사용하여 계산된 상태를 읽을 수 있습니다. 모든 데이터를 한 번에 또는 다른 스크립트에서 여러 작은 푸시로 푸시할 수 있습니다. 계산된 상태는 두 방법 중 하나와 동일합니다.

window.adobeDataLayer = window.adobeDataLayer || [];
window.adobeDataLayer.push({ page: { title: "Getting started" } });
window.adobeDataLayer.push({ component: { "hero-1": { title: "Learn more", link: "learn-more.html" } } });
window.adobeDataLayer.push({ page: { language: "en" } });

이러한 푸시 후 adobeDataLayer.getState()이(가) 다음 개체를 반환합니다.

{
  "page": {
    "title": "Getting started",
    "language": "en"
  },
  "component": {
    "hero-1": {
      "title": "Learn more",
      "link": "learn-more.html"
    }
  }
}

이벤트 개체는 데이터를 전달할 수도 있습니다. ACDL은 계산된 상태에 저장되지 않은 event 및 eventInfo을(를) 제외한 이벤트 개체의 모든 키를 병합합니다. 이벤트를 참조하세요.

병합 규칙 merge-rules

데이터를 푸시할 때 ACDL은 푸시된 객체의 각 키를 계산된 상태와 비교합니다.

푸시된 값
계산된 상태의 결과
계산된 상태에 없는 키
키와 해당 값을 추가합니다.
계산된 상태에 객체가 들어 있는 객체
두 개체를 병합합니다. 푸시하지 않는 키는 현재 값을 유지합니다. 이 규칙은 모든 중첩 수준에서 적용됩니다.
문자열, 숫자 또는 부울
현재 값을 바꿉니다.
배열
현재 값을 바꿉니다. 배열을 참조하세요.
null 또는 undefined
키를 삭제합니다. 데이터 삭제를 참조하십시오.

예를 들어 아래의 두 번째 푸시는 page.title만 변경됩니다. page.language 키는 값을 유지합니다.

adobeDataLayer.push({ page: { title: "Home", language: "en" } });
adobeDataLayer.push({ page: { title: "Products" } });
adobeDataLayer.getState("page");
// { title: "Products", language: "en" }

데이터 삭제 delete

키를 삭제하려면 null 또는 undefined을(를) 해당 값으로 푸시합니다.

adobeDataLayer.push({ page: { title: "Products", language: "en" }, user: { id: "123" } });
adobeDataLayer.push({ page: { language: null }, user: null });
adobeDataLayer.getState();
// { page: { title: "Products" } }

개체 내의 마지막 키를 삭제하면 빈 개체가 남습니다. 개체도 삭제하려면 개체 자체에 대해 null을(를) 푸시합니다.

adobeDataLayer.push({ page: { title: null } });
adobeDataLayer.getState();
// { page: {} }

path 옵션을 사용하는 리스너는 해당 경로에서 키 또는 키를 포함하는 개체를 삭제할 때 호출됩니다.

배열 arrays

배열은 단일 값으로 저장됩니다. 이미 배열을 보유하고 있는 키에 배열을 푸시하면 ACDL이 전체 배열을 대체합니다. 항목을 추가하려면 새 항목으로 전체 배열을 푸시합니다.

adobeDataLayer.push({ cart: { skus: ["a-100", "b-200"] } });
adobeDataLayer.push({ cart: { skus: ["a-100", "b-200", "c-300"] } });
adobeDataLayer.getState("cart.skus");
// ["a-100", "b-200", "c-300"]

ACDL은 푸시하는 배열에서 null 및 undefined 항목을 제거합니다.

adobeDataLayer.push({ cart: { skus: ["a-100", null, "c-300"] } });
adobeDataLayer.getState("cart.skus");
// ["a-100", "c-300"]
NOTE
ACDL 2.x는 배열을 대체하는 대신 위치별로 배열을 병합합니다. 2.x에서 ["c"]을(를) ["a", "b"] 이상으로 푸시하면 ["c", "b"]이(가) 됩니다. 두 버전에서 동일한 결과를 얻으려면 항상 전체 배열을 푸시하십시오.

값의 유형 변경 change-type

개체를 문자열, 숫자, 부울 또는 배열로 바꿀 수 있습니다. 그러나 ACDL 3.x에서 현재 문자열, 숫자, 부울 또는 배열을 보유한 키로 개체를 푸시하면 값이 대체되지 않습니다. 현재 값이 0, false이거나 빈 문자열이면 대신 키가 삭제됩니다.

값을 개체로 변경하려면 먼저 키를 삭제한 다음 개체를 푸시합니다.

adobeDataLayer.push({ product: "a-100" });
adobeDataLayer.push({ product: null });
adobeDataLayer.push({ product: { sku: "a-100", price: 25 } });
adobeDataLayer.getState("product");
// { sku: "a-100", price: 25 }

이러한 상황을 방지하는 가장 좋은 방법은 데이터 레이어 디자인에서 각 키의 유형을 일관되게 유지하는 것입니다.

값 유형 value-types

데이터 레이어에서 문자열, 숫자, 부울, null, 일반 개체 및 배열과 같은 JSON 호환 값을 사용합니다. ACDL은 다른 종류의 객체를 병합할 때 변환합니다.

값
다음으로 저장됨
Date 개체
빈 개체({})입니다. 날짜를 문자열(예: new Date().toISOString())이나 숫자로 저장합니다.
함수
빈 개체({})입니다.
Map 또는 Set
빈 개체({})입니다.
클래스의 인스턴스
인스턴스의 열거형 속성만 포함하는 일반 개체입니다.
빈 개체, 빈 배열, 빈 문자열, 0 및 false
그대로 저장됩니다.

일반 개체만 푸시합니다. ACDL은 문자열, 숫자 및 배열과 같은 다른 값을 직접 푸시할 때 거부합니다. push()을(를) 참조하십시오.

참조가 아닌 사본 copies

계산된 상태는 푸시하는 객체와 독립적입니다. 푸시한 후 오브젝트를 변경해도 계산된 상태는 변경되지 않습니다.

const page = { title: "Home" };
adobeDataLayer.push({ page: page });
page.title = "Changed";
adobeDataLayer.getState("page.title");
// "Home"

마찬가지로 getState()은(는) 복사본을 반환합니다. 반환된 개체를 변경해도 데이터 레이어는 변경되지 않습니다. 계산된 상태를 변경하려면 항상 변경 사항을 푸시합니다.

recommendation-more-help
experience-platform-help-collection